[JAVA] Programmierbar Logger mit Logback generieren

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.

Einführung

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>

Was du machen willst

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 ...

  • Bedingungen
  • Das von Host1 übertragene Protokoll lautet "/ tmp / host1 / app-yyyyMMdd.log".
  • Das von hostN übertragene Protokoll lautet "/ tmp / hostN / app-yyyyMMdd.log".
  • Host ist variabel.

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;
	}
}
  • Dadurch konnte der Ausgabepfad dynamisch sein.
  • Wie Sie von Leuten sehen können, die normalerweise Logback verwenden, wird nur das geschrieben, was normalerweise in XML definiert ist.
  • In diesem Beispiel wird keine XML benötigt.

abschließend

  • Da es nicht erforderlich ist, jedes Mal denselben Logger zu generieren, wenn er tatsächlich verwendet wird (da er nur zum ersten Mal generiert werden muss), ist es besser, ihn auf irgendeine Weise als Singleton zu erstellen.
  • Nachdem ich dies geschrieben habe, habe ich festgestellt, dass Logback auch Groovy Configuration </ strong> hat. Vielleicht hätte ich es auch dort tun können? Ich werde es versuchen, wenn ich eine Chance habe.
  • Dann. Frohe Weihnachten !!!