Skip to content

Commit a2e9c60

Browse files
committed
improved audit/data and regular console logging config options
property: dev.dsf.log.data.file env: DEV_DSF_LOG_DATA_FILE values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT, OFF default: OFF property: dev.dsf.log.data.console.out env: DEV_DSF_LOG_DATA_CONSOLE_OUT values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT, OFF default: OFF property: dev.dsf.log.data.console.err env: DEV_DSF_LOG_DATA_CONSOLE_ERR values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT, OFF default: OFF property: dev.dsf.log.audit.file env: DEV_DSF_LOG_AUDIT_FILE values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT, OFF default: TEXT_MDC property: dev.dsf.log.audit.console.out env: DEV_DSF_LOG_AUDIT_CONSOLE_OUT values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT, OFF default: OFF property: dev.dsf.log.audit.console.err env: DEV_DSF_LOG_AUDIT_CONSOLE_ERR values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT, OFF default: OFF property: dev.dsf.log.file.style env: DEV_DSF_LOG_FILE_STYLE values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT default: TEXT_MDC property: dev.dsf.log.file.level env: DEV_DSF_LOG_FILE_LEVEL values: TRACE, DEBUG, INFO, WARN, ERROR, OFF default: DEBUG property: dev.dsf.log.console.out.style env: DEV_DSF_LOG_CONSOLE_OUT_STYLE values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT default: TEXT property: dev.dsf.log.console.out.level env: DEV_DSF_LOG_CONSOLE_OUT_LEVEL values: TRACE, DEBUG, INFO, WARN, ERROR, OFF default: INFO property: dev.dsf.log.console.err.style env: DEV_DSF_LOG_CONSOLE_ERR_STYLE values: JSON_ECS, JSON_GCP, JSON_GELF, JSON_LOGSTASH, TEXT_MDC, TEXT default: TEXT property: dev.dsf.log.console.err.level env: DEV_DSF_LOG_CONSOLE_ERR_LEVEL values: TRACE, DEBUG, INFO, WARN, ERROR, OFF default: OFF
1 parent 1fb7d78 commit a2e9c60

File tree

9 files changed

+200
-195
lines changed

9 files changed

+200
-195
lines changed

dsf-bpe/dsf-bpe-server-jetty/conf/jetty.properties

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ dev.dsf.server.certificate.key.password=password
99

1010
dev.dsf.server.auth.trust.client.certificate.cas=cert/ca_chain.crt
1111

12+
dev.dsf.log.data.console.err=TEXT_MDC
1213
dev.dsf.log.file.level=OFF
13-
dev.dsf.log.console.style=TEXT_MDC
14-
dev.dsf.log.console.level=TRACE
14+
dev.dsf.log.console.out.style=TEXT_MDC
15+
dev.dsf.log.console.out.level=DEBUG
Lines changed: 9 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,24 @@
11
package dev.dsf.bpe.logging;
22

3-
import java.util.EnumSet;
3+
import java.util.function.Function;
44

55
import org.apache.logging.log4j.Level;
6-
import org.apache.logging.log4j.core.Appender;
76
import org.apache.logging.log4j.core.LoggerContext;
8-
import org.apache.logging.log4j.core.appender.ConsoleAppender;
9-
import org.apache.logging.log4j.core.appender.ConsoleAppender.Target;
10-
import org.apache.logging.log4j.core.appender.RollingFileAppender;
11-
import org.apache.logging.log4j.core.appender.rolling.CompositeTriggeringPolicy;
12-
import org.apache.logging.log4j.core.appender.rolling.OnStartupTriggeringPolicy;
13-
import org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy;
14-
import org.apache.logging.log4j.core.layout.PatternLayout;
7+
import org.apache.logging.log4j.core.StringLayout;
8+
import org.apache.logging.log4j.core.config.Configuration;
159

1610
import dev.dsf.common.logging.Log4jConfiguration;
1711

1812
public class BpeLog4jConfiguration extends Log4jConfiguration
1913
{
20-
private static final PatternLayout DATA_LAYOUT = PatternLayout.newBuilder().withPattern("%d%notEmpty{ %X} %m%n")
21-
.build();
22-
23-
public static enum Data
24-
{
25-
OUT(Target.SYSTEM_OUT), ERROR(Target.SYSTEM_ERR), FILE(null), OFF(null);
26-
27-
private final Target target;
28-
29-
private Data(Target target)
30-
{
31-
this.target = target;
32-
}
33-
34-
public Target getTarget()
35-
{
36-
return target;
37-
}
38-
}
39-
4014
public BpeLog4jConfiguration(LoggerContext loggerContext, String name, String fileNamePart,
41-
Log4jLayout consoleLayout, Level consoleLevel, Log4jLayout fileLayout, Level fileLevel, Data data)
15+
Log4jLayout consoleOutLayout, Level consoleOutLevel, Log4jLayout consoleErrLayout, Level consoleErrLevel,
16+
Log4jLayout fileLayout, Level fileLevel, Function<Configuration, StringLayout> dataFile,
17+
Function<Configuration, StringLayout> dataOut, Function<Configuration, StringLayout> dataErr)
4218
{
43-
super(loggerContext, name, fileNamePart, consoleLayout, consoleLevel, fileLayout, fileLevel);
19+
super(loggerContext, name, fileNamePart, consoleOutLayout, consoleOutLevel, consoleErrLayout, consoleErrLevel,
20+
fileLayout, fileLevel);
4421

45-
if (EnumSet.of(Data.OUT, Data.ERROR, Data.FILE).contains(data))
46-
{
47-
Appender dataAppender = Data.FILE.equals(data) ? createFileAppender(fileNamePart)
48-
: createConsoleAppender(data);
49-
50-
addAppender(dataAppender);
51-
addLogger("dsf-data-logger", Level.DEBUG, dataAppender, false);
52-
}
53-
else
54-
addLogger("dsf-data-logger", Level.OFF);
55-
}
56-
57-
private Appender createFileAppender(String fileNamePart)
58-
{
59-
return RollingFileAppender.newBuilder().setName("DATA").withFileName("log/" + fileNamePart + "-data.log")
60-
.withFilePattern("log/" + fileNamePart + "-data_%d{yyyy-MM-dd}_%i.log.gz").setIgnoreExceptions(false)
61-
.setLayout(DATA_LAYOUT)
62-
.withPolicy(CompositeTriggeringPolicy.createPolicy(OnStartupTriggeringPolicy.createPolicy(1),
63-
TimeBasedTriggeringPolicy.newBuilder().build()))
64-
.build();
65-
}
66-
67-
private Appender createConsoleAppender(Data data)
68-
{
69-
return ConsoleAppender.newBuilder().setName("DATA").setTarget(data.getTarget()).setLayout(DATA_LAYOUT).build();
22+
addSpecialLogger("data", fileNamePart, dataFile, dataOut, dataErr, Level.DEBUG);
7023
}
7124
}
Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,35 @@
11
package dev.dsf.bpe.logging;
22

3-
import dev.dsf.bpe.logging.BpeLog4jConfiguration.Data;
3+
import java.util.function.Function;
4+
5+
import org.apache.logging.log4j.core.StringLayout;
6+
import org.apache.logging.log4j.core.config.Configuration;
7+
48
import dev.dsf.common.logging.Log4jConfigurationFactory;
59
import dev.dsf.common.logging.Log4jInitializer;
610

711
public class BpeLog4jInitializer extends Log4jInitializer
812
{
9-
public static final String DATA_OUT = "SYS_OUT";
10-
public static final String DATA_ERROR = "SYS_ERROR";
11-
public static final String DATA_FILE = "FILE";
12-
public static final String DATA_OFF = "OFF";
13+
public static final String LOG_DATA_FILE = "dev.dsf.log.data.file";
14+
public static final String LOG_DATA_CONSOLE_OUT = "dev.dsf.log.data.console.out";
15+
public static final String LOG_DATA_CONSOLE_ERR = "dev.dsf.log.data.console.err";
1316

14-
public static final String LOG_DATA = "dev.dsf.log.data";
15-
16-
private final Data data;
17+
private final Function<Configuration, StringLayout> specialFile;
18+
private final Function<Configuration, StringLayout> specialConsoleOut;
19+
private final Function<Configuration, StringLayout> specialConsoleErr;
1720

1821
public BpeLog4jInitializer()
1922
{
20-
data = getData(LOG_DATA, DATA_FILE);
23+
specialFile = getSpecial(LOG_DATA_FILE, SPECIAL_OFF);
24+
specialConsoleOut = getSpecial(LOG_DATA_CONSOLE_OUT, SPECIAL_OFF);
25+
specialConsoleErr = getSpecial(LOG_DATA_CONSOLE_ERR, SPECIAL_OFF);
2126
}
2227

2328
@Override
2429
protected Log4jConfigurationFactory createLog4jConfigurationFactory()
2530
{
2631
return new Log4jConfigurationFactory((loggerContext, name) -> new BpeLog4jConfiguration(loggerContext, name,
27-
"bpe", consoleLayout, consoleLevel, fileLayout, fileLevel, data));
28-
}
29-
30-
private Data getData(String parameter, String defaultValue)
31-
{
32-
String value = getValue(parameter, defaultValue);
33-
34-
if (DATA_OUT.equalsIgnoreCase(value))
35-
return Data.OUT;
36-
else if (DATA_ERROR.equalsIgnoreCase(value))
37-
return Data.ERROR;
38-
else if (DATA_FILE.equalsIgnoreCase(value))
39-
return Data.FILE;
40-
else if (DATA_OFF.equalsIgnoreCase(value))
41-
return Data.OFF;
42-
else
43-
throw new IllegalArgumentException("Data '" + value + "' for " + parameter + " not supported");
32+
"bpe", consoleOutLayout, consoleOutLevel, consoleErrLayout, consoleErrLevel, fileLayout, fileLevel,
33+
specialFile, specialConsoleOut, specialConsoleErr));
4434
}
4535
}

dsf-common/dsf-common-jetty/src/main/java/dev/dsf/common/logging/Log4jConfiguration.java

Lines changed: 85 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package dev.dsf.common.logging;
22

3+
import java.util.Comparator;
4+
import java.util.Locale;
5+
import java.util.function.Function;
6+
import java.util.stream.Stream;
7+
38
import org.apache.logging.log4j.Level;
49
import org.apache.logging.log4j.core.Appender;
510
import org.apache.logging.log4j.core.LoggerContext;
@@ -102,27 +107,36 @@ public StringLayout fileLayout(Configuration configuration)
102107
}
103108
}
104109

105-
public Log4jConfiguration(LoggerContext loggerContext, String name, String fileNamePart, Log4jLayout consoleLayout,
106-
Level consoleLevel, Log4jLayout fileLayout, Level fileLevel)
110+
public Log4jConfiguration(LoggerContext loggerContext, String name, String fileNamePart,
111+
Log4jLayout consoleOutLayout, Level consoleOutLevel, Log4jLayout consoleErrLayout, Level consoleErrLevel,
112+
Log4jLayout fileLayout, Level fileLevel)
107113
{
108114
super(loggerContext, ConfigurationSource.NULL_SOURCE);
109115

110116
if (name != null)
111117
setName(name);
112118

113-
addLogger("dev.dsf", min(consoleLevel, fileLevel));
119+
addLogger("dev.dsf", min(consoleOutLevel, consoleErrLevel, fileLevel));
114120
addLogger("org.eclipse.jetty", Level.INFO);
115121
addLogger("ca.uhn.fhir.parser.LenientErrorHandler", Level.ERROR);
116122

117123
LoggerConfig root = getRootLogger();
118124
root.setLevel(Level.WARN);
119125

120-
if (!Level.OFF.equals(consoleLevel))
126+
if (!Level.OFF.equals(consoleOutLevel))
127+
{
128+
Appender console = ConsoleAppender.newBuilder().setName("CONSOLE.OUT").setTarget(Target.SYSTEM_OUT)
129+
.setLayout(consoleOutLayout.consoleLayout(this)).build();
130+
addAppender(console);
131+
root.addAppender(console, consoleOutLevel, null);
132+
}
133+
134+
if (!Level.OFF.equals(consoleErrLevel))
121135
{
122-
Appender console = ConsoleAppender.newBuilder().setName("CONSOLE").setTarget(Target.SYSTEM_OUT)
123-
.setLayout(consoleLayout.consoleLayout(this)).build();
136+
Appender console = ConsoleAppender.newBuilder().setName("CONSOLE.ERR").setTarget(Target.SYSTEM_ERR)
137+
.setLayout(consoleErrLayout.consoleLayout(this)).build();
124138
addAppender(console);
125-
root.addAppender(console, consoleLevel, null);
139+
root.addAppender(console, consoleErrLevel, null);
126140
}
127141

128142
if (!Level.OFF.equals(fileLevel))
@@ -139,26 +153,80 @@ public Log4jConfiguration(LoggerContext loggerContext, String name, String fileN
139153
}
140154
}
141155

142-
private Level min(Level a, Level b)
156+
private Level min(Level... levels)
143157
{
144-
return a.isLessSpecificThan(b) ? a : b;
158+
return Stream.of(levels).sorted(Comparator.comparing(Level::intLevel).reversed()).findFirst().get();
145159
}
146160

147161
protected void addLogger(String loggerName, Level level)
148162
{
149-
addLogger(loggerName, level, null, true);
163+
LoggerConfig config = new LoggerConfig();
164+
config.setLevel(level);
165+
166+
addLogger(loggerName, config);
167+
}
168+
169+
protected void addSpecialLogger(String name, String fileNamePart, Function<Configuration, StringLayout> fileLayout,
170+
Function<Configuration, StringLayout> outLayout, Function<Configuration, StringLayout> errLayout,
171+
Level level)
172+
{
173+
String loggerName = "dsf-" + name + "-logger";
174+
String appenderName = name.toUpperCase(Locale.ENGLISH);
175+
fileNamePart = fileNamePart + "-" + name;
176+
177+
Appender file = createFileAppender(appenderName, fileNamePart, fileLayout.apply(this));
178+
Appender out = createConsoleAppender(appenderName, Target.SYSTEM_OUT, outLayout.apply(this));
179+
Appender err = createConsoleAppender(appenderName, Target.SYSTEM_ERR, errLayout.apply(this));
180+
181+
LoggerConfig config = new LoggerConfig();
182+
config.setLevel(file == null && out == null && err == null ? Level.OFF : level);
183+
config.setAdditive(false);
184+
185+
if (file != null)
186+
{
187+
addAppender(file);
188+
config.addAppender(file, null, null);
189+
}
190+
if (out != null)
191+
{
192+
addAppender(out);
193+
config.addAppender(out, null, null);
194+
}
195+
if (err != null)
196+
{
197+
addAppender(err);
198+
config.addAppender(err, null, null);
199+
}
200+
201+
addLogger(loggerName, config);
202+
}
203+
204+
private Appender createFileAppender(String appenderName, String fileNamePart, StringLayout layout)
205+
{
206+
if (layout == null)
207+
return null;
208+
209+
return RollingFileAppender.newBuilder().setName(appenderName + ".FILE")
210+
.withFileName("log/" + fileNamePart + ".log")
211+
.withFilePattern("log/" + fileNamePart + "_%d{yyyy-MM-dd}_%i.log.gz").setIgnoreExceptions(false)
212+
.setLayout(layout)
213+
.withPolicy(CompositeTriggeringPolicy.createPolicy(OnStartupTriggeringPolicy.createPolicy(1),
214+
TimeBasedTriggeringPolicy.newBuilder().build()))
215+
.build();
150216
}
151217

152-
protected void addLogger(String loggerName, Level level, Appender appender, boolean additive)
218+
private Appender createConsoleAppender(String appenderName, Target target, StringLayout layout)
153219
{
154-
LoggerConfig c = new LoggerConfig();
155-
c.setLevel(level);
156-
c.setAdditive(additive);
220+
if (layout == null)
221+
return null;
157222

158-
if (appender != null)
159-
c.addAppender(appender, null, null);
223+
String name = appenderName + "." + switch (target)
224+
{
225+
case SYSTEM_OUT -> "OUT";
226+
case SYSTEM_ERR -> "ERR";
227+
};
160228

161-
addLogger(loggerName, c);
229+
return ConsoleAppender.newBuilder().setName(name).setTarget(target).setLayout(layout).build();
162230
}
163231

164232
@Override

0 commit comments

Comments
 (0)