当前位置:网站首页>Log4j2
Log4j2
2022-07-02 11:51:00 【Xx985】
Log4j2Introduction
Apache Log4j 2C'est vrai.Log4jMise à jour de,Plus que son prédécesseurLog4j 1.xDes améliorations importantes ont été apportées,Et a fourniLogbackDe nombreuses améliorations sont disponibles dans,Réparé en même tempsLogbackQuelques problèmes avec l'architecture.Est considéré comme le meilleurJavaCadre de journalisation.
Log4j2Caractéristiques
Amélioration des performances
Log4j2Contient une baseLMAX DisruptorLa prochaine génération d'enregistreurs asynchrones de la Bibliothèque.Dans un scénario multithreadé,Rapport de débit de l'enregistreur asynchroneLog4j 1.xEtLogbackÉlevé18X,Faible latence.Recharger automatiquement la configuration
AvecLogbackC'est pareil,Log4j2Vous pouvez recharger automatiquement sa configuration lorsque vous la modifiez.AvecLogbackC'est différent.,Il ne perd pas d'événements de log lorsque la reconfiguration se produit.Filtrage avancé
AvecLogbackC'est pareil,Log4j2Soutien fondé surLogDonnées contextuelles dans l'événement,Marquage,Les expressions régulières et d'autres composants sont filtrés,En outre,Les filtres peuvent également être associés à un enregistreur.AvecLogbackC'est différent.,Log4j2Il est possible d'utiliser leFilterCatégorie.Architecture du plug - in
Log4jConfigurer les composants en utilisant le mode plug - in.Donc,,Vous n'avez pas besoin d'écrire du Code pour créer et configurerAppender,Layout,Pattern ConverterAttendez..Avec la configuration,Log4jIdentifier automatiquement les plug - ins et les utiliser.Mécanisme sans déchets
Pendant la journalisation à l'état d'équilibre,Log4j2 Pas de déchets dans une application autonome,InWebFaible encombrement dans l'application.Cela réduit la pression sur le collecteur d'ordures,Et offre une meilleure réactivité.La porte de journal la plus populaire sur le marché estSLF4J,Bien queLog4j2 C'est aussi la porte du Journal,Parce que son implémentation de log est très puissante,Performance supérieure.Donc, d'habitude, on va Log4j2 Comme une implémentation de log
SLF4j + Log4j2 Combinaison de, C'est la façon la plus puissante d'implémenter la fonctionnalité de journalisation sur le marché , C'est certainement la tendance principale de l'avenir .
Journal asynchrone
Le journal asynchrone estlog4j2La plus grande caractéristique,L'amélioration de ses performances bénéficie également principalement de la journalisation asynchrone.
Log4j2Il existe deux façons d'implémenter le journal,L'un est passé parAsyncAppender,L'un est passé parAsyncLogger
Notez qu'il y a deux façons différentes de le faire , La conception et le code source sont différents .AsyncAppenderComment
C'est par référence à d'autresAppenderPour y arriver.,Quand un événement de log arrive,Ouvre un autre thread pour les traiter.Il est important de noter que,Si dansAppenderUne exception s'est produite,Est imperceptible à l'application. AsyncAppenderÇa aurait dû être dans leAppenderConfigurer après,Utilisation par défaut java.util.concurrent.ArrayBlockingQueueImplémenter sans avoir besoin d'autres bibliothèques de classe externes. Quand on l'utiliseAppenderQuand,Attention requise dans un environnement multithreadé,Les files d'attente bloquées sont vulnérables aux litiges de verrouillage,Cela peut avoir une incidence sur le rendement.À ce moment - là.,Nous devrions envisager d'utiliser un enregistreur asynchrone sans serrure(AsyncLogger).AsyncLoggerComment
AsyncLoggerC'estlog4j2Réaliser l'incarnation fonctionnelle la plus importante de l'asynchrone,C'est aussi Méthode asynchrone officiellement recommandée .
Il peut faire appel àLogger.logRetour plus rapide.Il y a deux options:Global Asynchronous and Hybrid Asynchronous.
Asynchrone globale:Tous les journaux sont enregistrés de façon asynchrone,Aucun changement n'est apporté au profil,Il suffit dejvmIl est possible d'ajouter un paramètre au démarrage.
Mélange asynchrone:Vous pouvez utiliser à la fois des journaux synchrones et asynchrones dans votre application,Cela rend la configuration des journaux plus flexible.Bien queLog4j2Fournir un mécanisme de gestion des exceptions,Peut écraser la plupart des états,Mais il y aura encore un petit nombre de cas spéciaux qui ne peuvent pas être entièrement traités,Par exemple, si nous enregistrons un journal de vérification(Un cas particulier),Alors officiellement, il est recommandé d'utiliser le journal de synchronisation,Et pour d'autres endroits qui enregistrent simplement un journal de programme,L'utilisation de journaux asynchrones améliorera considérablement les performances,Réduire l'impact sur l'application elle - même.Une approche hybride et asynchrone nécessite une modification du profil,UtiliserAsyncLoggerConfiguration de l'étiquette.
<!-- log4j2 Dépendance **********************************************-->
<!-- slf4jLog door -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- log4jAdaptateur -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
<!-- log4j2Log door -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<!-- log4j2Mise en œuvre du Journal -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
<!-- Dépendance asynchrone du Journal -->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.7</version>
</dependency><?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!--
src/main/java/com/log4j2
Configurer les propriétés générales globales
-->
<properties>
<property name="logDir">D:</property>
</properties>
<!-- Configurationappender -->
<Appenders>
<!-- Configurer la sortie de la console -->
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
</Console>
<!-- Sortie du profil -->
<File name="fileAppender" fileName="${logDir}//log4j2.log">
<!-- Format de sortie du profil -->
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
</File>
<!--
Diviser les fichiers journaux selon les règles spécifiées
fileName:Nom du fichier journal
filePattern:Règles de nommage des fichiers après le fractionnement des fichiers journaux
$${date:yyyy-MM-dd}:Selon la date,Créer un dossier
Par exemple:2021-01-01Dans ce dossier,Enregistrer toutes les informations du journal pour la journée(Les journaux fractionnés sont placés dans ce dossier)
2021-01-02Dans ce dossier,Enregistrer toutes les informations du journal pour la journée(Les journaux fractionnés sont placés dans ce dossier)
rollog-%d{yyyy-MM-dd-HH-mm}-%i.log
Règles de nommage des fichiers:%iIndique le numéro de série,De0C'est parti.,Le but est de ne pas répéter le nom de chaque document
-->
<!-- <RollingFile name="rollingFile" fileName="${logDir}/rollog.log"-->
<!-- filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">-->
<!-- <!– Format du message journal –>-->
<!-- <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>-->
<!-- <Policies>-->
<!-- <!– Au démarrage du système,Déclenche la règle de séparation,Générer un fichier journal –>-->
<!-- <OnStartupTriggeringPolicy/>-->
<!-- <!– Diviser par taille de fichier –>-->
<!-- <SizeBasedTriggeringPolicy size="10KB"/>-->
<!-- <!– Split by Time Node La règle du fractionnement estfilePattern–>-->
<!-- <TimeBasedTriggeringPolicy/>-->
<!-- </Policies>-->
<!-- <!– Dans le même répertoire,Limite de nombre de fichiers,Si la valeur définie est dépassée,Est écrasé en fonction du temps,Nouvelle règle de superposition–>-->
<!-- <DefaultRolloverStrategy max="30"/>-->
<!-- </RollingFile>-->
<!-- Configurer les journaux asynchrones ( Ne peut pas coexister asynchrone avec la configuration personnalisée suivante )-->
<!--<Async name="myAsync">
<!– Sortie de la console pour un fonctionnement asynchrone –>
<AppenderRef ref="consoleAppender"/>
</Async>-->
</Appenders>
<!-- Configurationlogger -->
<Loggers>
<!-- Personnalisationlogger,Pour personnaliserloggerAsynchronelogger -->
<!-- includeLocation="false"Indique la suppression de l'information sur le numéro de ligne dans la journalisation,Cette information sur le numéro de ligne affecte grandement l'efficacité de la journalisation(Ce numéro de ligne n'est pas ajouté à la production)
Dans les cas graves, l'enregistrement peut être moins efficace que l'enregistrement synchrone
additivity="false" Indique qu'il n'hérite pasrootlogger -->
<AsyncLogger name="com.log4j2" level="trace"
includeLocation="false" additivity="false">
<!-- Sortie de la consoleconsoleAppender,Set to Asynchronous Print -->
<AppenderRef ref="consoleAppender"/>
<!-- Sortie de la consolefileAppender,Set to Asynchronous Print -->
<AppenderRef ref="fileAppender"/>
</AsyncLogger>
<!-- Configurationrootlogger -->
<Root level="trace">
<!-- RéférencesAppender -->
<!--<AppenderRef ref="consoleAppender"/>-->
<AppenderRef ref="fileAppender"/>
<!--<AppenderRef ref="rollingFile"/>-->
<!--<AppenderRef ref="myAsync"/>-->
<AppenderRef ref="consoleAppender"/>
</Root>
</Loggers>
</Configuration>package com.log.log4j2;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Log4j2Test {
@Test
public void test01(){
/*--------------------------------------------------------
Cas d'introduction
Utilisation simpleLog4j2De Façade+Réalisation
Par défauterror Impression des informations de niveau
Mais les journaux les plus courants utilisent la colocation :slf4j+log4j2
*/
/*---------------------Utiliser le profil-----------------------------------
Utiliser le profil
log4j2C'est une référence.logbackCréé par, Donc le profil est aussi utilisé xml
log4j2 Encore une fois, le chemin de classe de chargement par défaut (resources)En baslog4j2.xmlConfiguration dans le fichier
Étiquette racine, Toutes les informations relatives au Journal , Tout est configuré dans l'étiquette racine
<Configuration status="debug" monitorInterval="Valeur numérique"></Configuration>
Dans l'étiquette racine , Peut ajouter des attributs
status="debug" Niveau de sortie du journal pour le cadre du journal lui - même
monitorInterval="5" Intervalle de chargement automatique des profils,Pas moins de5Secondes
*/
/*--------------------------------------------------------
Bien quelog4j2C'est aussi la porte du Journal, Mais la tendance dominante sur le marché est toujours slf4j
Donc nous avons encore besoin d'utiliser slf4jComme porte de journal,Collocationlog4j2 Puissante mise en œuvre de la journalisation , Effectuer des opérations liées au Journal
Ce que nous avons ensuite configuré est le plus puissant sur le marché aujourd'hui , Les journaux les plus courants utilisent la collocation :
slf4j+log4j2
1.Importerslf4jLa porte du Journal de bord
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
2.Importerlog4j2Adaptateur pour
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
3.Importerlog4j2La porte du Journal de bord
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
4.Importerlog4j2Mise en œuvre du journal pour
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
Principes d'exécution:slf4jLa façade appellelog4j2La façade de,Parlog4j2Appel de porte pourlog4j2Réalisation
*/
/*---------------Exporter le journal dans un fichier-----------------------------------------
<File name="fileAppender" fileName="${logDir}//log4j2.log">
<!-- Format de sortie du profil -->
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
</File>
*/
/*--------------- Fractionnement des journaux -----------------------------------------
<RollingFile name="rollingFile" fileName="${logDir}/rollog.log"
filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
<!-- Format du message journal -->
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
<Policies>
<!-- Au démarrage du système,Déclenche la règle de séparation,Générer un fichier journal -->
<OnStartupTriggeringPolicy/>
<!-- Diviser par taille de fichier -->
<SizeBasedTriggeringPolicy size="10KB"/>
<!-- Split by Time Node La règle du fractionnement estfilePattern-->
<TimeBasedTriggeringPolicy/>
</Policies>
<!-- Dans le même répertoire,Limite de nombre de fichiers,Si la valeur définie est dépassée,Est écrasé en fonction du temps,Nouvelle règle de superposition-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
*/
// Utilisation simpleLog4j2De Façade+Réalisation
// Logger logger = LogManager.getLogger(Log4j2Test.class);
// Utiliserlf4j+log4j2
Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
logger.error("errorInformation");
logger.warn("warnInformation");
logger.info("infoInformation");
logger.debug("debugInformation");
logger.trace("traceInformation");
}
@Test
public void test02(){
/*
Mise en œuvre asynchrone du Journal(Assigner des Threads individuellement pour la journalisation)
Comment1:UtiliserAsyncAppenderDe la façon dont
1.Ajouter une dépendance asynchrone au Journal
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.7</version>
</dependency>
2.InAppendersDans l'étiquette,Configuration asynchrone
UtiliserAsyncÉtiquettes
<!-- Configurer les journaux asynchrones -->
<Async name="myAsync">
//Sortie de la console pour un fonctionnement asynchrone
<AppenderRef ref="consoleAppender"/>
</Async>
3.rootloggerRéférencesAsync
<Root>
<AppenderRef ref="myAsync"/>
</Root>
*********************************************
Mise en œuvre asynchrone du Journal(Assigner des Threads individuellement pour la journalisation)
Comment2:UtiliserAsyncLoggerDe la façon dont
1、Asynchrone globale:
Tous les journaux sont asynchrones, Aucun changement n'est nécessaire sur le profil
Il suffit d'aller sur le chemin de classeresourcesAjouter un suivantpropertiesFichiers de propriétés,Faites une configuration en une étape
L'exigence relative au nom de fichier est:log4j2.component.properties
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
2、Mélange asynchrone:(********Surtout avec ça*********)
Les journaux synchrones et asynchrones peuvent être utilisés simultanément dans l'application,Cela rend la configuration et la sortie des journaux plus flexibles
Besoins:
Supposons que nous ayons maintenant une personnalisation logger -- com.log
Pour personnaliserloggerC'est asynchrone
JeanrootloggerEst synchrone
C'est - à - dire que le fichier est sous ce chemin (com.log) Le journal est asynchrone , D'autres chemins sont synchronisés
includeLocation="false" Indique la suppression de l'information sur le numéro de ligne dans la journalisation,
additivity="false" Indique qu'il n'hérite pasrootlogger
<AsyncLogger name="com.log" level="trace"
includeLocation="false" additivity="false">
<!-- Sortie de la consoleconsoleAppender,Set to Asynchronous Print -->
<AppenderRef ref="consoleAppender"/>
</AsyncLogger>
Attention!:
Avant le test, Assurez - vous d'annoter la configuration asynchrone globale
Pour le courantlogger,Log4j2Test01.class
Log4j2Test01 C'est ce que nous personnalisons loggerSous le chemin
Attention!:
Si vous utilisez un journal asynchrone
AsyncAppender、AsyncLoggerNe pas apparaître en même temps,Sans cette exigence,Les effets ne se superposent pas non plus
Si elle apparaît en même temps,Alors l'efficacité seraAsyncAppenderPrincipalement
AsyncLoggerL'asynchrone globale et l'asynchrone hybride de ne pas apparaître simultanément,Sans cette exigence,Les effets ne se superposent pas non plus
*/
Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
//Enregistrement du Journal
for (int i = 0; i < 2000; i++) {
logger.error("errorInformation");
logger.warn("warnInformation");
logger.info("infoInformation");
logger.debug("debugInformation");
logger.trace("traceInformation");
}
//Logique opérationnelle du système
for (int i = 0; i < 1000; i++) {
System.out.println("------------------");
}
}
}
边栏推荐
- 文件操作(详解!)
- Dynamic memory (advanced 4)
- How to Create a Beautiful Plots in R with Summary Statistics Labels
- 微信小程序利用百度api达成植物识别
- b格高且好看的代码片段分享图片生成
- Beautiful and intelligent, Haval H6 supreme+ makes Yuanxiao travel safer
- Fabric.js 3个api设置画布宽高
- to_ Bytes and from_ Bytes simple example
- K-Means Clustering Visualization in R: Step By Step Guide
- Webauthn - official development document
猜你喜欢
![[visual studio 2019] create and import cmake project](/img/51/6c2575030c5103aee6c02bec8d5e77.jpg)
[visual studio 2019] create and import cmake project

YYGH-BUG-05

Attribute acquisition method and operation notes of C # multidimensional array

Flesh-dect (media 2021) -- a viewpoint of material decomposition

PgSQL string is converted to array and associated with other tables, which are displayed in the original order after matching and splicing

A sharp tool for exposing data inconsistencies -- a real-time verification system

GGPLOT: HOW TO DISPLAY THE LAST VALUE OF EACH LINE AS LABEL

电脑无缘无故黑屏,无法调节亮度。

How to Create a Beautiful Plots in R with Summary Statistics Labels

File operation (detailed!)
随机推荐
mysql链表数据存储查询排序问题
R HISTOGRAM EXAMPLE QUICK REFERENCE
Data analysis - Matplotlib sample code
2022年遭“挤爆”的三款透明LED显示屏
Is it safe to open a stock account online? I'm a novice, please guide me
SSRF
多文件程序X32dbg动态调试
CMake交叉编译
to_ Bytes and from_ Bytes simple example
php 二维、多维 数组打乱顺序,PHP_php打乱数组二维数组多维数组的简单实例,php中的shuffle函数只能打乱一维
bedtools使用教程
Three transparent LED displays that were "crowded" in 2022
Amazon cloud technology community builder application window opens
Develop scalable contracts based on hardhat and openzeppelin (I)
Pyqt5+opencv project practice: microcirculator pictures, video recording and manual comparison software (with source code)
How to Create a Nice Box and Whisker Plot in R
Redis超出最大内存错误OOM command not allowed when used memory &gt; 'maxmemory'
How to Visualize Missing Data in R using a Heatmap
Is the stock account given by qiniu business school safe? Can I open an account?
Tidb DM alarm DM_ sync_ process_ exists_ with_ Error troubleshooting