Bonjour, cher Khabrovites.
Le matériel présenté dans l'article est destiné aux débutants et, peut-être, cela me fera économiser plusieurs heures de recherche sur StackOverFlow et d'autres sites afin d'obtenir un système de journalisation pratique qui lui-même saura où se connecter - sur la console, le fichier ou le journal des transactions.
Au début du projet, la tâche se pose toujours de configurer correctement la journalisation, tandis que dans l'environnement local, les journaux doivent être affichés dans la console et dans le fichier pour plus de commodité pendant le débogage, et il est extrêmement indésirable de publier les journaux sur la console sur le serveur distant, mais à la place, ils doivent être écrits dans le fichier, logstash ou dans la base de données. Et si vous avez Windows localement et sur une machine Linux distante, l'adresse d'emplacement de ce fichier journal est différente.
Ainsi, il existe de nombreuses situations dans lesquelles vous devez constamment corriger la configuration du système de journalisation avec vos mains, en fonction de circonstances externes.
J'étais fatigué de me souvenir constamment et de commenter les appenders, et j'ai développé un moyen de configurer Log4j2 afin que, selon le profil Maven sélectionné, seules les bonnes appenders soient automatiquement activées.
Vous trouverez ci-dessous une instruction pour configurer un projet à l'aide de Spring Boot + Maven + Log4j2, dont le résultat sera un système de journalisation configuré et deux appenders: CONSOLE et SOCKET.
Tout d'abord, nous apporterons des modifications à la configuration de Maven (pom.xml):
Dans les variables de l'ensemble du niveau pom.xml, ajoutez l'adresse hôte de logstash-appender:
<properties> <logstash.host>logstashcsm.example.ru</logstash.host> </properties>
Ajoutez les dépendances nécessaires au travail:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies>
Notez que nous excluons la dépendance de journalisation de Spring-Boot-Starter de Spring-Boot-Starter-Web.
Configurez des profils Maven pour gérer dynamiquement les appenders connectés. Au niveau de chaque profil, nous définissons les variables logstash.port, logger.console.tresholdFilter, logger.socket.tresholdFilter
.
<profiles> <profile> <id>local</id> <properties> <logstash.port>10000</logstash.port> <logger.console.tresholdFilter>ALL</logger.console.tresholdFilter> <logger.socket.tresholdFilter>OFF</logger.socket.tresholdFilter> </properties> </profile> <profile> <id>dev</id> <properties> <logstash.port>10001</logstash.port> <logger.console.tresholdFilter>OFF</logger.console.tresholdFilter> <logger.socket.tresholdFilter>ALL</logger.socket.tresholdFilter> </properties> </profile> </profiles>
logstash.port - le port auquel les journaux doivent être envoyés.
logger.console.tresholdFilter - la valeur définit le niveau de filtrage des journaux affichés sur la console. Dans notre cas, ALL signifie que les enregistrements de journal de tous les niveaux seront affichés dans l'appendice de la console.
logger.socket.tresholdFilter - la valeur définit le niveau de filtrage des journaux envoyés à logstash. OFF - signifie qu'aucun enregistrement envoyé à cet appender ne passera.
Maintenant, nous devons apporter des modifications à application.properties afin qu'à partir du fichier Log4j2.xml nous puissions accéder à la valeur des variables spécifiées dans pom.xml:
logstash.host=@logstash.host@
logstash.port=@logstash.port@
logger.console.tresholdFilter=@logger.console.tresholdFilter@
logger.socket.tresholdFilter=@logger.socket.tresholdFilter@
Et enfin, nous configurons la configuration de Log4j2 lui-même dans le fichier log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <Properties> <Property name="socket.host">${bundle:application:logstash.host}</Property> <Property name="socket.port">${bundle:application:logstash.port}</Property> <Property name="console.thresholdFilter">${bundle:application:logger.console.tresholdFilter}</Property> <Property name="socket.thresholdFilter">${bundle:application:logger.socket.tresholdFilter}</Property> </Properties> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <ThresholdFilter level="${console.thresholdFilter}"/> <PatternLayout pattern="%d %-5p [%t] %c{10} - %m%n"/> </Console> <Socket name="SOCKET" host="${socket.host}" port="${socket.port}" immediateFlush="true"> <ThresholdFilter level="${socket.thresholdFilter}"/> <JSONLayout eventEol="true" compact="true"/> </Socket> <Async name="ASYNC"> <AppenderRef ref="CONSOLE"/> <AppenderRef ref="SOCKET"/> </Async> </Appenders> <Loggers> <Logger name="ru.example" level="debug" additivity="false"> <AppenderRef ref="ASYNC"/> </Logger> <Root level="error"> <AppenderRef ref="ASYNC"/> </Root> </Loggers> </Configuration>
Maintenant, pour appeler l'enregistreur dans votre classe, vous devez en créer une instance:
private static Logger logger = LoggerFactory.getLogger(YourClass.class);
et tournez-vous vers lui:
logger.info(" ");
C’est tout. La journalisation fonctionnera maintenant en tenant compte du profil Maven actif dans le projet.
Veuillez noter que dans la liste du fichier log4j2.xml
, deux enregistreurs sont ru.example
- ru.example
et root
, et ils ont différents niveaux de journalisation des événements. Le premier fonctionnera sur tous les événements générés par les classes à partir du ru.example.*
Empaquetez et ru.example.*
tout à partir du niveau DEBUG, et l'enregistreur root
enregistrera les événements de toutes les classes, mais du niveau ERREUR.
Dans le même temps, afin que les entrées ne soient pas dupliquées dans les journaux, le paramètre additivity="false"
est utilisé.