Cet article est le 5ème jour du Calendrier de l'Avent Recruit Lifestyle 2017. Je suis un ingénieur libre chez Hot Pepper Beauty. C'est dommage.
Écrivons sur la génération dynamique de Logger sous le titre de Programmable Logger Generation avec logback. </ strong> Eh bien, c'est une petite histoire de retour qui semble ne pas être tellement dans le document.
Normalement, lorsque vous utilisez logback, vous devez préparer le logback.xml suivant.
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>
Cependant, il y avait des cas où cette notation XML posait problème. Plus précisément, c'était au moment de ce travail.
Ce que je voulais faire, c'était définir dynamiquement le fichier journal PATH </ strong>. Qu'est-ce que ça veut dire ...
/ tmp / host1 / app-yyyyMMdd.log
./ tmp / hostN / app-yyyyMMdd.log
.C'est. Eh bien, je ne veux pas maintenir xml car le nombre d'hôtes transférés augmente ou diminue.
Je pense qu'il existe plusieurs façons (y compris de ne pas utiliser logback), mais cette fois j'ai essayé d'utiliser logback pour générer Logger par programme </ strong>.
Vous trouverez ci-dessous le code de l'exemple d'opération. Je vais aussi le donner à github. 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) {
//Imaginez que le nom d'hôte vient de l'extérieur ici.
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;
}
}