[JAVA] Générer un enregistreur de manière programmable avec connexion

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.

introduction

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>

Chose que tu veux faire

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

  • Conditions
  • Le journal transféré depuis host1 est / tmp / host1 / app-yyyyMMdd.log.
  • Le journal transféré depuis hostN est / tmp / hostN / app-yyyyMMdd.log.
  • l'hôte est variable.

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;
	}
}
  • Cela a permis au chemin de sortie d'être dynamique.
  • Comme vous pouvez le voir chez les personnes qui utilisent habituellement logback, il s'agit simplement d'écrire ce qui est généralement défini en xml.
  • Aucun XML n'est nécessaire dans cet exemple.

en conclusion

  • Puisqu'il n'est pas nécessaire de générer le même enregistreur à chaque fois lors de son utilisation réelle (puisqu'il n'est nécessaire de le générer que pour la première fois), il est préférable de le rendre singleton par certains moyens.
  • Après avoir écrit ceci, j'ai remarqué que logback a également Groovy Configuration </ strong>, alors peut-être aurais-je pu le faire là aussi? J'essaierai si j'ai une chance.
  • Alors. Joyeux Noël !!!