Utilisez Slf4j pour intégrer Log4j2 pour créer une solution système de journal de projet (sans utiliser Common-logging, Log4j)

1. La différence entre Log4j, SLF4J, Common-logging

Slf4j et commons-logging sont des spécifications du framework de journalisation, et leur implémentation est très faible.Log4j est principalement destiné à l'implémentation des deux anciens frameworks de journalisation. Slf4j a tendance à remplacer la journalisation commune. Common-longing prend en charge log4j par défaut. La configuration suivante est requise pour utiliser d'autres outils de journalisation: common-logging.properties.

org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog

1.1 、 slf4j

slf4j (le nom complet est Simple Loging Facade For Java) est une interface unifiée qui fournit une sortie de journal pour les programmes Java. Ce n'est pas une solution d'implémentation de journal spécifique, tout comme le JDBC que nous utilisons souvent, mais juste une règle. Par conséquent, slf4j seul ne peut pas fonctionner. Il doit être combiné avec d'autres solutions d'implémentation de journaux spécifiques, telles que org.apache.log4j.Logger d'Apache, java.util.logging.Logger fourni avec jdk et ainsi de suite.
Le package jar correspondant:
    slf4j-log4j12-xxxjar utilise le pilote fourni par org.apache.log4j.Logger
    slf4j-jdk14-xxxjar utilise le pilote fourni par java.util.logging
    slf4j-simple-xxxjar lie directement System.err
    slf4j -jcl -xxxjar est le pilote fourni par commons-logging
    logback-classic-xxxjar est le pilote fourni par logback

1.2, la différence entre Log4j et Log4j2

log4j est un projet open source d'Apache, log4j2 et log4j en sont les auteurs, mais log4j2 est un composant de journal remodelé. Il a écarté les lacunes du précédent log4j et introduit un nouveau composant qui absorbait l'excellente conception de logback. La communauté log4j2 est très active et mise à jour rapidement.

1. Type de fichier de configuration

Log4j utilise un fichier .properties comme fichier de configuration principal, mais le log4j 2 actuel a abandonné cette méthode et utilise .xml, .json ou .jsn pour le faire.

2. Package JAR de base

log4j n'a besoin que d'introduire un package jar,

<dependency>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 <version>1.2.17</version>
</dependency>

Et log4j 2 nécessite 2 cœurs

          <!-- slf4j核心包-->  
          <dependency>  
              <groupId>org.slf4j</groupId>  
              <artifactId>slf4j-api</artifactId>  
              <version>1.7.13</version>  
          </dependency>  
          <dependency>  
              <groupId>org.slf4j</groupId>  
              <artifactId>jcl-over-slf4j</artifactId>  
              <version>1.7.13</version>  
              <scope>runtime</scope>  
        </dependency>  

2. Utilisez Slf4j pour intégrer Log4j2 afin de créer un système de journal de projet

Le système de journalisation basé sur log4j est restructuré en un système de journalisation basé sur Slf4j et log4j2, car l'utilisation de slf4j peut garantir que notre système de journalisation a une bonne compatibilité et est compatible avec plusieurs systèmes de journalisation courants. L'utilisation de log4j2 au lieu de log4j est parce que Log4j 1.x a une impasse dans la situation de forte concurrence, l'utilisation du processeur a grimpé anormalement, et les performances de Log4j2.0 basé sur le journal asynchrone de LMAX Disruptor dans un environnement multithread seront bien meilleures que Log4j 1.x et logback (les données officielles sont plus de 10 fois).

2.1 Étapes de construction

1. Gestion des dépendances

1) Supprimez les dépendances log4j et slf4j-log4j12 requises par Log4j1.x dans le projet.
2) Ajoutez les dépendances slf4j et log4j2 suivantes.

<!--核心log4j2jar包-->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.11.2</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.11.2</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-slf4j-impl</artifactId>
  <version>2.11.2</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-web</artifactId>
  <version>2.11.2</version>
</dependency>
<!--下面这个依赖与log4j-slf4j-impl只能二选一,一个是log4j2实现的一个是slf4j实现的-->
<!--
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.26</version>
</dependency>
-->
<!-- slf4j核心包-->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.26</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>1.7.26</version>
</dependency>

2. Définissez les écouteurs et les filtres log4j2 dans web.xml (cette étape n'est pas requise pour servlet3.0 et supérieur)

    <!--对于log4j2,Servlet2.5以前的版本需要-->  
    <listener>  
       <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>  
    </listener>  
    <filter>  
       <filter-name>log4jServletFilter</filter-name>  
       <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>  
    </filter>  
    <filter-mapping>  
      <filter-name>log4jServletFilter</filter-name>  
      <url-pattern>/*</url-pattern>  
      <dispatcher>REQUEST</dispatcher>  
      <dispatcher>FORWARD</dispatcher>  
      <dispatcher>INCLUDE</dispatcher>  
      <dispatcher>ERROR</dispatcher>  
   </filter-mapping>  

Comment déterminer la version du servlet que vous utilisez?

1. Déterminez le servlet-api.jar dans le dossier lib de tomcat, ouvrez le fichier MANIFEST.MF dans son dossier META-INF avec le Bloc-notes et voyez que le code suivant est le numéro de version

Specification-Version: 3.1

Il en va de même pour l'affichage du numéro de version jsp, et le dossier jsp-api.jar doit être ouvert.

2. Lorsque vous utilisez le projet Maven d'idée, vous devez ajouter les dépendances suivantes dans le fichier pom

<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
</dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/jsp-api -->
<dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
</dependency>

Parmi eux, fourni par scope signifie que vous n'avez pas besoin de le conditionner lors de l'emballage, et d'autres installations (Web Container) le fourniront. En fait, la dépendance peut théoriquement participer aux cycles de compilation, de test et d'exécution. Équivaut à compiler, mais l'action d'exclusion est effectuée au stade de l'empaquetage.

3. Log4j2 ne prend plus en charge les fichiers de propriétés. Il prend uniquement en charge xml, json ou yaml. Si l'emplacement n'est pas spécifié, il recherchera par défaut sous src / main / resources.

Si vous devez personnaliser l'emplacement, vous devez ajouter le code suivant dans le fichier web.xml ci-dessus

<context-param>  
   <param-name>log4jConfiguration</param-name>  
   <param-value>/WEB-INF/classes/log4j2.xml</param-value>  
</context-param> 

4. Explication détaillée du fichier log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--status日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL-->
<Configuration status="off" monitorInterval="1800">
    <properties>
        <property name="LOG_HOME">/src/logs/</property>
        <property name="ERROR_LOG_FILE_NAME">error</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout  charset="GB18030" pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
        </Console>
        <RollingRandomAccessFile name="ErrorLog"
                                         fileName="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log"
                                         filePattern="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log.%d{yyyy-MM-dd}.gz">
            <PatternLayout charset="UTF-8"
                    pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <!-- 3rdparty Loggers -->
        <logger name="org.springframework.core" level="error"/>
        <logger name="org.springframework.beans" level="error"/>
        <logger name="org.springframework.context" level="error"/>
        <logger name="org.springframework.web" level="error"/>
        <Logger name="com.opensymphony.xwork2" level="error"/>
        <Logger name="org.apache.struts2" level="error"/>
        <logger name="com.hafiz.www.controller" level="error" includeLocation="true" additivity="false">
            <appender-ref ref="ErrorLog"/>
            <appender-ref ref="Console"/>
        </logger>
        <Root level="warn" includeLocation="true">
            <Appender-ref ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

L'Appender qui est configuré avec un RollingRandomAccessFile qui roule en fonction du temps et de la taille du fichier a une grande amélioration des performances par rapport à RollingFileAppender. Le site officiel affirme qu'il est de 20 à 200%.
Le roulement signifie que lorsque certaines conditions sont remplies, le fichier journal d'origine est renommé pour la sauvegarde et un nouveau fichier journal est généré. Par exemple, il est nécessaire de générer un fichier journal tous les jours, mais si le volume du fichier journal en une journée a dépassé 1G, il est de nouveau généré et une seule des deux conditions est remplie. Ce n'est pas possible dans les fonctions natives de log4j 1.x, c'est très simple dans log4j2.
La signification spécifique
<properties> définit deux constantes pour faciliter la réutilisation ultérieure

Les attributs de RollingRandomAccessFile:
fileName spécifie l'emplacement et le nom de fichier du fichier journal en cours.
FilePattern spécifie les règles de transfert et de changement de nom de fichier lors du roulement.
SizeBasedTriggeringPolicy spécifie que lorsque la taille du fichier est supérieure à la valeur spécifiée par la taille, le roulement est déclenché .
DefaultRolloverStrategy spécifie le nombre maximal de fichiers à enregistrer
TimeBasedTriggeringPolicy Cette configuration doit être utilisée avec filePattern. Notez que la règle de changement de nom de fichier configurée dans filePattern est $ {FILE_NAME} -% d {yyyy-MM-dd HH-mm} - % i. La granularité temporelle la plus petite est mm, c'est-à-dire minutes. La taille spécifiée par TimeBasedTriggeringPolicy est 1, et une fois combiné, un nouveau fichier est généré toutes les 1 minute. S'il est remplacé par% d {aaaa-MM-jj HH} et que la granularité minimale est de l'heure, un fichier sera généré toutes les heures.

5. Il est très simple à utiliser,
introduisez d'abord la classe

  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;

Déclarer dans la classe

protected transient Logger logger = LoggerFactory.getLogger(getClass());

** 6 ** Chinois brouillé si la console, essayez le code ci-dessous dans
le

<PatternLayout charset="GB18030"  pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

charset = "GB18030" Remplacez UTF-8 par GB18030. Si la console est déformée, modifiez le PatternLayout de la console. Si le fichier de sortie est déformé, modifiez le PatternLayout du fichier pour
résoudre le problème.

Vous pouvez vous référer à
la solution parfaite pour utiliser Slf4j pour intégrer Log4j2 afin de créer un système de journal de projet

Je suppose que tu aimes

Origine blog.csdn.net/u011930054/article/details/88412063
conseillé
Classement