]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/logging/LogConfigurator.java
Reformat files
[signal-cli] / src / main / java / org / asamk / signal / logging / LogConfigurator.java
1 package org.asamk.signal.logging;
2
3 import java.io.File;
4
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;
19
20 public class LogConfigurator extends ContextAwareBase implements Configurator {
21
22 private static int verboseLevel = 0;
23 private static File logFile = null;
24 private static boolean scrubSensitiveInformation = false;
25
26 public static void setVerboseLevel(int verboseLevel) {
27 LogConfigurator.verboseLevel = verboseLevel;
28 }
29
30 public static void setLogFile(File logFile) {
31 LogConfigurator.logFile = logFile;
32 }
33
34 public static void setScrubSensitiveInformation(final boolean scrubSensitiveInformation) {
35 LogConfigurator.scrubSensitiveInformation = scrubSensitiveInformation;
36 }
37
38 @Override
39 public ExecutionStatus configure(LoggerContext lc) {
40 lc.addListener(new LevelChangePropagator() {{
41 setContext(lc);
42 }});
43 final var rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
44
45 final var defaultLevel = verboseLevel > 2 ? Level.TRACE : verboseLevel > 0 ? Level.INFO : Level.WARN;
46 rootLogger.setLevel(defaultLevel);
47
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);
53
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);
62
63 if (logFile != null) {
64 consoleAppender.addFilter(new Filter<>() {
65 @Override
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")
71 )
72 )
73
74 ? FilterReply.NEUTRAL : FilterReply.DENY;
75 }
76 });
77
78 final var fileLayout = createDetailedLoggingLayout(lc);
79 final var fileAppender = createLoggingFileAppender(lc, createLayoutWrappingEncoder(fileLayout));
80 rootLogger.addAppender(fileAppender);
81 }
82 return ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY;
83 }
84
85 private ConsoleAppender<ILoggingEvent> createLoggingConsoleAppender(
86 final LoggerContext lc,
87 final LayoutWrappingEncoder<ILoggingEvent> layoutEncoder
88 ) {
89 return new ConsoleAppender<>() {{
90 setContext(lc);
91 setName("console");
92 setTarget("System.err");
93 setEncoder(layoutEncoder);
94 start();
95 }};
96 }
97
98 private FileAppender<ILoggingEvent> createLoggingFileAppender(
99 final LoggerContext lc,
100 final LayoutWrappingEncoder<ILoggingEvent> layoutEncoder
101 ) {
102 return new FileAppender<>() {{
103 setContext(lc);
104 setName("file");
105 setFile(logFile.getAbsolutePath());
106 setEncoder(layoutEncoder);
107 start();
108 }};
109 }
110
111 private LayoutWrappingEncoder<ILoggingEvent> createLayoutWrappingEncoder(final Layout<ILoggingEvent> l) {
112 return new LayoutWrappingEncoder<>() {{
113 setContext(l.getContext());
114 setLayout(l);
115 }};
116 }
117
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;
124 }
125
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;
132 }
133
134 private PatternLayout getPatternLayout() {
135 if (scrubSensitiveInformation) {
136 return new ScrubberPatternLayout();
137 } else {
138 return new PatternLayout();
139 }
140 }
141 }