]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/LogConfigurator.java
Update dependencies
[signal-cli] / src / main / java / org / asamk / signal / LogConfigurator.java
1 package org.asamk.signal;
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
24 public static void setVerboseLevel(int verboseLevel) {
25 LogConfigurator.verboseLevel = verboseLevel;
26 }
27
28 public static void setLogFile(File logFile) {
29 LogConfigurator.logFile = logFile;
30 }
31
32 public ExecutionStatus configure(LoggerContext lc) {
33 final var rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
34
35 final var defaultLevel = verboseLevel > 1 ? Level.ALL : verboseLevel > 0 ? Level.DEBUG : Level.INFO;
36 rootLogger.setLevel(defaultLevel);
37
38 final var consoleLayout = verboseLevel == 0 || logFile != null
39 ? createSimpleLoggingLayout(lc)
40 : createDetailedLoggingLayout(lc);
41 final var consoleAppender = createLoggingConsoleAppender(lc, createLayoutWrappingEncoder(consoleLayout));
42 rootLogger.addAppender(consoleAppender);
43
44 lc.getLogger("com.zaxxer.hikari")
45 .setLevel(verboseLevel > 1 ? Level.ALL : verboseLevel > 0 ? Level.INFO : Level.WARN);
46
47 if (logFile != null) {
48 consoleAppender.addFilter(new Filter<>() {
49 @Override
50 public FilterReply decide(final ILoggingEvent event) {
51 return event.getLevel().isGreaterOrEqual(Level.INFO)
52 && !"LibSignal".equals(event.getLoggerName())
53 && (
54 event.getLevel().isGreaterOrEqual(Level.WARN) || !event.getLoggerName()
55 .startsWith("com.zaxxer.hikari")
56 )
57
58 ? FilterReply.NEUTRAL : FilterReply.DENY;
59 }
60 });
61
62 final var fileLayout = createDetailedLoggingLayout(lc);
63 final var fileAppender = createLoggingFileAppender(lc, createLayoutWrappingEncoder(fileLayout));
64 rootLogger.addAppender(fileAppender);
65 }
66 return ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY;
67 }
68
69 private ConsoleAppender<ILoggingEvent> createLoggingConsoleAppender(
70 final LoggerContext lc, final LayoutWrappingEncoder<ILoggingEvent> layoutEncoder
71 ) {
72 return new ConsoleAppender<>() {{
73 setContext(lc);
74 setName("console");
75 setTarget("System.err");
76 setEncoder(layoutEncoder);
77 start();
78 }};
79 }
80
81 private FileAppender<ILoggingEvent> createLoggingFileAppender(
82 final LoggerContext lc, final LayoutWrappingEncoder<ILoggingEvent> layoutEncoder
83 ) {
84 return new FileAppender<>() {{
85 setContext(lc);
86 setName("file");
87 setFile(logFile.getAbsolutePath());
88 setEncoder(layoutEncoder);
89 start();
90 }};
91 }
92
93 private LayoutWrappingEncoder<ILoggingEvent> createLayoutWrappingEncoder(final Layout<ILoggingEvent> l) {
94 return new LayoutWrappingEncoder<>() {{
95 setContext(l.getContext());
96 setLayout(l);
97 }};
98 }
99
100 private PatternLayout createSimpleLoggingLayout(final LoggerContext lc) {
101 return new PatternLayout() {{
102 setPattern("%-5level %logger{0} - %msg%n");
103 setContext(lc);
104 start();
105 }};
106 }
107
108 private PatternLayout createDetailedLoggingLayout(final LoggerContext lc) {
109 return new PatternLayout() {{
110 setPattern("%d{yyyy-MM-dd'T'HH:mm:ss.SSSXX} [%thread] %-5level %logger{36} - %msg%n");
111 setContext(lc);
112 start();
113 }};
114 }
115 }