Dieser Artikel ist der 5. Tag von Recruit Lifestyle Adventskalender 2017. Ich bin ein loser Ingenieur bei Hot Pepper Beauty. Es ist Schande.
Lassen Sie uns über die dynamische Logger-Generierung unter dem Titel Programmable Logger Generation with logback schreiben. </ strong> Nun, es ist eine logback kleine Geschichte, die nicht so sehr im Dokument zu sein scheint.
Normalerweise sollten Sie bei Verwendung von logback die folgende logback.xml vorbereiten.
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
<appender name="APP"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/var/log/app.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>14</maxHistory>
</rollingPolicy>
<encoder>
<pattern>time:%d{yyyy-MMM-dd HH:mm:ss.SSS} level:%level marker:%marker thread:%thread logger:%logger file:%file line:%line message:%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="APP" />
</root>
</configuration>
Es gab jedoch Fälle, in denen diese XML-Notation ein Problem darstellte. Insbesondere war es zum Zeitpunkt dieses Jobs.
Ich wollte die Protokolldatei PATH </ strong> dynamisch festlegen. Was bedeutet das ...
Das ist. Nun, ich möchte XML nicht beibehalten, da die Anzahl der übertragenen Hosts zunimmt oder abnimmt.
Ich denke, es gibt verschiedene Möglichkeiten (einschließlich der Nichtverwendung von Logback), aber dieses Mal habe ich versucht, Logback zu verwenden, um Logger </ strong> programmgesteuert zu generieren.
Unten finden Sie den Code des Operationsbeispiels. Ich werde es auch Github geben. https://github.com/shase/logback-dynamic-logger-sample
Main.java
import java.util.stream.Stream;
import ch.qos.logback.classic.Logger;
public class Main {
public static void main(String...args) {
//Stellen Sie sich vor, der Hostname kommt hier von außen.
String[] path = {"/tmp/host1/app-%d{yyyyMMdd}.log","/tmp/host2/app-%d{yyyyMMdd}.log","/tmp/host3/app-%d{yyyyMMdd}.log"};
Stream.of(path)
.forEach(p -> {
Logger logger = new SimpleLoggerFactory().getLogger("sample", p);
logger.info("dynamic path");
});
}
}
SimpleLoggerFactory.java
import java.nio.charset.StandardCharsets;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
public class SimpleLoggerFactory {
public Logger getLogger(String loggerName, String path) {
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
PatternLayoutEncoder ple = new PatternLayoutEncoder();
ple.setPattern("%msg%n");
ple.setContext(lc);
ple.setCharset(StandardCharsets.UTF_8);
ple.start();
RollingFileAppender<ILoggingEvent> fileAppender = new RollingFileAppender<>();
TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
rollingPolicy.setFileNamePattern(path);
rollingPolicy.setMaxHistory(14);
rollingPolicy.setParent(fileAppender);
rollingPolicy.setContext(lc);
rollingPolicy.start();
fileAppender.setAppend(true);
fileAppender.setEncoder(ple);
fileAppender.setRollingPolicy(rollingPolicy);
fileAppender.setContext(lc);
fileAppender.start();
Logger logger = (Logger) LoggerFactory.getLogger(loggerName);
logger.addAppender(fileAppender);
logger.setAdditive(false);
return logger;
}
}