1 package org
.asamk
.signal
.logging
;
5 import ch
.qos
.logback
.classic
.Level
;
6 import ch
.qos
.logback
.classic
.Logger
;
7 import ch
.qos
.logback
.classic
.LoggerContext
;
8 import ch
.qos
.logback
.classic
.PatternLayout
;
9 import ch
.qos
.logback
.classic
.jul
.LevelChangePropagator
;
10 import ch
.qos
.logback
.classic
.spi
.Configurator
;
11 import ch
.qos
.logback
.classic
.spi
.ILoggingEvent
;
12 import ch
.qos
.logback
.core
.ConsoleAppender
;
13 import ch
.qos
.logback
.core
.FileAppender
;
14 import ch
.qos
.logback
.core
.Layout
;
15 import ch
.qos
.logback
.core
.encoder
.LayoutWrappingEncoder
;
16 import ch
.qos
.logback
.core
.filter
.Filter
;
17 import ch
.qos
.logback
.core
.spi
.ContextAwareBase
;
18 import ch
.qos
.logback
.core
.spi
.FilterReply
;
20 public class LogConfigurator
extends ContextAwareBase
implements Configurator
{
22 private static int verboseLevel
= 0;
23 private static File logFile
= null;
24 private static boolean scrubSensitiveInformation
= false;
26 public static void setVerboseLevel(int verboseLevel
) {
27 LogConfigurator
.verboseLevel
= verboseLevel
;
30 public static void setLogFile(File logFile
) {
31 LogConfigurator
.logFile
= logFile
;
34 public static void setScrubSensitiveInformation(final boolean scrubSensitiveInformation
) {
35 LogConfigurator
.scrubSensitiveInformation
= scrubSensitiveInformation
;
39 public ExecutionStatus
configure(LoggerContext lc
) {
40 lc
.addListener(new LevelChangePropagator() {{
43 final var rootLogger
= lc
.getLogger(Logger
.ROOT_LOGGER_NAME
);
45 final var defaultLevel
= verboseLevel
> 2 ? Level
.TRACE
: verboseLevel
> 0 ? Level
.INFO
: Level
.WARN
;
46 rootLogger
.setLevel(defaultLevel
);
48 final var consoleLayout
= verboseLevel
== 0 || logFile
!= null
49 ?
createSimpleLoggingLayout(lc
)
50 : createDetailedLoggingLayout(lc
);
51 final var consoleAppender
= createLoggingConsoleAppender(lc
, createLayoutWrappingEncoder(consoleLayout
));
52 rootLogger
.addAppender(consoleAppender
);
54 lc
.getLogger("org.asamk")
55 .setLevel(verboseLevel
> 1 ? Level
.TRACE
: verboseLevel
> 0 ? Level
.DEBUG
: Level
.INFO
);
56 lc
.getLogger("org.asamk.Signal")
57 .setLevel(verboseLevel
> 2 ? Level
.TRACE
: verboseLevel
> 1 ? Level
.INFO
: Level
.WARN
);
58 lc
.getLogger("com.zaxxer.hikari.pool.PoolBase")
59 .setLevel(verboseLevel
> 2 ? Level
.TRACE
: verboseLevel
> 1 ? Level
.INFO
: Level
.WARN
);
60 lc
.getLogger("org.sqlite.core.NativeDB")
61 .setLevel(verboseLevel
> 3 ? Level
.TRACE
: verboseLevel
> 1 ? Level
.INFO
: Level
.WARN
);
63 if (logFile
!= null) {
64 consoleAppender
.addFilter(new Filter
<>() {
66 public FilterReply
decide(final ILoggingEvent event
) {
67 return !"LibSignal".equals(event
.getLoggerName()) && (
68 event
.getLevel().isGreaterOrEqual(Level
.WARN
) || (
69 event
.getLevel().isGreaterOrEqual(Level
.INFO
) && event
.getLoggerName()
70 .startsWith("org.asamk")
74 ? FilterReply
.NEUTRAL
: FilterReply
.DENY
;
78 final var fileLayout
= createDetailedLoggingLayout(lc
);
79 final var fileAppender
= createLoggingFileAppender(lc
, createLayoutWrappingEncoder(fileLayout
));
80 rootLogger
.addAppender(fileAppender
);
82 return ExecutionStatus
.DO_NOT_INVOKE_NEXT_IF_ANY
;
85 private ConsoleAppender
<ILoggingEvent
> createLoggingConsoleAppender(
86 final LoggerContext lc
,
87 final LayoutWrappingEncoder
<ILoggingEvent
> layoutEncoder
89 return new ConsoleAppender
<>() {{
92 setTarget("System.err");
93 setEncoder(layoutEncoder
);
98 private FileAppender
<ILoggingEvent
> createLoggingFileAppender(
99 final LoggerContext lc
,
100 final LayoutWrappingEncoder
<ILoggingEvent
> layoutEncoder
102 return new FileAppender
<>() {{
105 setFile(logFile
.getAbsolutePath());
106 setEncoder(layoutEncoder
);
111 private LayoutWrappingEncoder
<ILoggingEvent
> createLayoutWrappingEncoder(final Layout
<ILoggingEvent
> l
) {
112 return new LayoutWrappingEncoder
<>() {{
113 setContext(l
.getContext());
118 private PatternLayout
createSimpleLoggingLayout(final LoggerContext lc
) {
119 final var patternLayout
= getPatternLayout();
120 patternLayout
.setPattern("%-5level %logger{0} - %msg%n");
121 patternLayout
.setContext(lc
);
122 patternLayout
.start();
123 return patternLayout
;
126 private PatternLayout
createDetailedLoggingLayout(final LoggerContext lc
) {
127 final var patternLayout
= getPatternLayout();
128 patternLayout
.setPattern("%d{yyyy-MM-dd'T'HH:mm:ss.SSSXX} [%thread] %-5level %logger{36} - %msg%n");
129 patternLayout
.setContext(lc
);
130 patternLayout
.start();
131 return patternLayout
;
134 private PatternLayout
getPatternLayout() {
135 if (scrubSensitiveInformation
) {
136 return new ScrubberPatternLayout();
138 return new PatternLayout();