1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache license, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the license for the specific language governing permissions and
15 * limitations under the license.
16 */
17
18 package org.apache.logging.log4j.core.config;
19
20 import java.util.Objects;
21
22 import org.apache.logging.log4j.Level;
23 import org.apache.logging.log4j.Marker;
24 import org.apache.logging.log4j.core.LogEvent;
25 import org.apache.logging.log4j.message.Message;
26 import org.apache.logging.log4j.status.StatusLogger;
27 import org.apache.logging.log4j.util.PropertiesUtil;
28 import org.apache.logging.log4j.util.Supplier;
29
30 /**
31 * Reliability strategy that sleeps unconditionally for some time before allowing a Configuration to be stopped.
32 */
33 public class AwaitUnconditionallyReliabilityStrategy implements ReliabilityStrategy, LocationAwareReliabilityStrategy {
34
35 private static final long DEFAULT_SLEEP_MILLIS = 5000; // 5 seconds
36 private static final long SLEEP_MILLIS = sleepMillis();
37 private final LoggerConfig loggerConfig;
38
39 public AwaitUnconditionallyReliabilityStrategy(final LoggerConfig loggerConfig) {
40 this.loggerConfig = Objects.requireNonNull(loggerConfig, "loggerConfig is null");
41 }
42
43 private static long sleepMillis() {
44 return PropertiesUtil.getProperties().getLongProperty("log4j.waitMillisBeforeStopOldConfig",
45 DEFAULT_SLEEP_MILLIS);
46 }
47
48 /*
49 * (non-Javadoc)
50 *
51 * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#log(org.apache.logging.log4j.util.Supplier,
52 * java.lang.String, java.lang.String, org.apache.logging.log4j.Marker, org.apache.logging.log4j.Level,
53 * org.apache.logging.log4j.message.Message, java.lang.Throwable)
54 */
55 @Override
56 public void log(final Supplier<LoggerConfig> reconfigured, final String loggerName, final String fqcn, final Marker marker, final Level level,
57 final Message data, final Throwable t) {
58 loggerConfig.log(loggerName, fqcn, marker, level, data, t);
59 }
60
61 /*
62 * (non-Javadoc)
63 *
64 * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#log(org.apache.logging.log4j.util.Supplier,
65 * java.lang.String, java.lang.String, java.lang.StackTraceElement, org.apache.logging.log4j.Marker,
66 * org.apache.logging.log4j.Level, org.apache.logging.log4j.message.Message, java.lang.Throwable)
67 */
68 @Override
69 public void log(final Supplier<LoggerConfig> reconfigured, final String loggerName, final String fqcn,
70 final StackTraceElement location, final Marker marker, final Level level, final Message data,
71 final Throwable t) {
72 loggerConfig.log(loggerName, fqcn, location, marker, level, data, t);
73 }
74
75 /*
76 * (non-Javadoc)
77 *
78 * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#log(org.apache.logging.log4j.util.Supplier,
79 * org.apache.logging.log4j.core.LogEvent)
80 */
81 @Override
82 public void log(final Supplier<LoggerConfig> reconfigured, final LogEvent event) {
83 loggerConfig.log(event);
84 }
85
86 /*
87 * (non-Javadoc)
88 *
89 * @see
90 * org.apache.logging.log4j.core.config.ReliabilityStrategy#beforeLogEvent(org.apache.logging.log4j.core.config.
91 * LoggerConfig, org.apache.logging.log4j.util.Supplier)
92 */
93 @Override
94 public LoggerConfig getActiveLoggerConfig(final Supplier<LoggerConfig> next) {
95 return this.loggerConfig;
96 }
97
98 /*
99 * (non-Javadoc)
100 *
101 * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#afterLogEvent()
102 */
103 @Override
104 public void afterLogEvent() {
105 // no action
106 }
107
108 /*
109 * (non-Javadoc)
110 *
111 * @see org.apache.logging.log4j.core.config.ReliabilityStrategy#beforeStopAppenders()
112 */
113 @Override
114 public void beforeStopAppenders() {
115 // no action
116 }
117
118 /*
119 * (non-Javadoc)
120 *
121 * @see
122 * org.apache.logging.log4j.core.config.ReliabilityStrategy#beforeStopConfiguration(org.apache.logging.log4j.core
123 * .config.Configuration)
124 */
125 @Override
126 public void beforeStopConfiguration(final Configuration configuration) {
127 // only sleep once per configuration stop
128 if (loggerConfig == configuration.getRootLogger()) {
129 try {
130 Thread.sleep(SLEEP_MILLIS);
131 } catch (final InterruptedException e) {
132 StatusLogger.getLogger().warn("Sleep before stop configuration was interrupted.");
133 }
134 }
135 }
136
137 }