]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/logging/LogConfigurator.java
Reduce sqlite logging
[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.spi.Configurator;
10 import ch.qos.logback.classic.spi.ILoggingEvent;
11 import ch.qos.logback.core.ConsoleAppender;
12 import ch.qos.logback.core.FileAppender;
13 import ch.qos.logback.core.Layout;
14 import ch.qos.logback.core.encoder.LayoutWrappingEncoder;
15 import ch.qos.logback.core.filter.Filter;
16 import ch.qos.logback.core.spi.ContextAwareBase;
17 import ch.qos.logback.core.spi.FilterReply;
18
19 public class LogConfigurator extends ContextAwareBase implements Configurator {
20
21 private static int verboseLevel = 0;
22 private static File logFile = null;
23 private static boolean scrubSensitiveInformation = false;
24
25 public static void setVerboseLevel(int verboseLevel) {
26 LogConfigurator.verboseLevel = verboseLevel;
27 }
28
29 public static void setLogFile(File logFile) {
30 LogConfigurator.logFile = logFile;
31 }
32
33 public static void setScrubSensitiveInformation(final boolean scrubSensitiveInformation) {
34 LogConfigurator.scrubSensitiveInformation = scrubSensitiveInformation;
35 }
36
37 @Override
38 public ExecutionStatus configure(LoggerContext lc) {
39 final var rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
40
41 final var defaultLevel = verboseLevel > 1 ? Level.ALL : verboseLevel > 0 ? Level.INFO : Level.WARN;
42 rootLogger.setLevel(defaultLevel);
43
44 final var consoleLayout = verboseLevel == 0 || logFile != null
45 ? createSimpleLoggingLayout(lc)
46 : createDetailedLoggingLayout(lc);
47 final var consoleAppender = createLoggingConsoleAppender(lc, createLayoutWrappingEncoder(consoleLayout));
48 rootLogger.addAppender(consoleAppender);
49
50 lc.getLogger("org.asamk").setLevel(verboseLevel > 1 ? Level.ALL : verboseLevel > 0 ? Level.DEBUG : Level.INFO);
51 lc.getLogger("com.zaxxer.hikari.pool.PoolBase")
52 .setLevel(verboseLevel > 2 ? Level.ALL : verboseLevel > 1 ? Level.INFO : Level.WARN);
53 lc.getLogger("org.sqlite.core.NativeDB")
54 .setLevel(verboseLevel > 3 ? Level.ALL : verboseLevel > 1 ? Level.INFO : Level.WARN);
55
56 if (logFile != null) {
57 consoleAppender.addFilter(new Filter<>() {
58 @Override
59 public FilterReply decide(final ILoggingEvent event) {
60 return !"LibSignal".equals(event.getLoggerName()) && (
61 event.getLevel().isGreaterOrEqual(Level.WARN) || (
62 event.getLevel().isGreaterOrEqual(Level.INFO) && event.getLoggerName()
63 .startsWith("org.asamk")
64 )
65 )
66
67 ? FilterReply.NEUTRAL : FilterReply.DENY;
68 }
69 });
70
71 final var fileLayout = createDetailedLoggingLayout(lc);
72 final var fileAppender = createLoggingFileAppender(lc, createLayoutWrappingEncoder(fileLayout));
73 rootLogger.addAppender(fileAppender);
74 }
75 return ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY;
76 }
77
78 private ConsoleAppender<ILoggingEvent> createLoggingConsoleAppender(
79 final LoggerContext lc, final LayoutWrappingEncoder<ILoggingEvent> layoutEncoder
80 ) {
81 return new ConsoleAppender<>() {{
82 setContext(lc);
83 setName("console");
84 setTarget("System.err");
85 setEncoder(layoutEncoder);
86 start();
87 }};
88 }
89
90 private FileAppender<ILoggingEvent> createLoggingFileAppender(
91 final LoggerContext lc, final LayoutWrappingEncoder<ILoggingEvent> layoutEncoder
92 ) {
93 return new FileAppender<>() {{
94 setContext(lc);
95 setName("file");
96 setFile(logFile.getAbsolutePath());
97 setEncoder(layoutEncoder);
98 start();
99 }};
100 }
101
102 private LayoutWrappingEncoder<ILoggingEvent> createLayoutWrappingEncoder(final Layout<ILoggingEvent> l) {
103 return new LayoutWrappingEncoder<>() {{
104 setContext(l.getContext());
105 setLayout(l);
106 }};
107 }
108
109 private PatternLayout createSimpleLoggingLayout(final LoggerContext lc) {
110 final var patternLayout = getPatternLayout();
111 patternLayout.setPattern("%-5level %logger{0} - %msg%n");
112 patternLayout.setContext(lc);
113 patternLayout.start();
114 return patternLayout;
115 }
116
117 private PatternLayout createDetailedLoggingLayout(final LoggerContext lc) {
118 final var patternLayout = getPatternLayout();
119 patternLayout.setPattern("%d{yyyy-MM-dd'T'HH:mm:ss.SSSXX} [%thread] %-5level %logger{36} - %msg%n");
120 patternLayout.setContext(lc);
121 patternLayout.start();
122 return patternLayout;
123 }
124
125 private PatternLayout getPatternLayout() {
126 if (scrubSensitiveInformation) {
127 return new ScrubberPatternLayout();
128 } else {
129 return new PatternLayout();
130 }
131 }
132 }