zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

使用log4j 的三种配置组合详解

配置log4j 详解 三种 组合 使用
2023-09-11 14:16:44 时间

方式① 使用Commons Logging + Log4j 方式 (获得 Log)

  1. 导入

    • 正常导入

      导入(下载) 三个 jar 包

      • log4j-api-xxx.jar
      • log4j-core-xxx.jar
      • log4j-jcl-xxx.jar

      且需要 使用 Commons Logging 的 jar包

      • commons-logging-xxx.jar
    • meven 导入

      <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.18.0</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.18.0</version>
      </dependency>
      <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-jcl</artifactId>
        <version>2.18.0</version>
      </dependency>
      
  2. 使用

    需要打印日志: 只需要 按 Commons-Logging 的写法写,不需要改动任何代码,即可以得到 Log4j 的日志输出

    即:LogFactory.getLog() 方式获得 Log

    • 注意 导入包的 地址
    package _2022_08_18_demo;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    
    public class Test_Log4j {
        public static void main(String[] args) {
            Log log = LogFactory.getLog(Test_Log4j.class);
            log.info("Log4j info...");
            log.warn("Log4j warn...");
            log.error("Log4j error...");
        }
    }
    
  3. 配置

    • 只能使用 .xml 配置方式

      文件解释

      <?xml version="1.0" encoding="UTF-8"?>
      <Configuration>
      	<Properties>
              <!-- 定义日志格式 -->
      		<Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
              <!-- 定义文件名变量 -->
      		<Property name="file.err.filename">log/err.log</Property>
      		<Property name="file.err.pattern">log/err.%i.log.gz</Property>
      	</Properties>
          <!-- 定义Appender,即目的地 -->
      	<Appenders>
              <!-- 定义输出到屏幕 -->
      		<Console name="console" target="SYSTEM_OUT">
                  <!-- 日志格式引用上面定义的log.pattern -->
      			<PatternLayout pattern="${log.pattern}" />
      		</Console>
              <!-- 定义输出到文件,文件名引用上面定义的file.err.filename -->
      		<RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
      			<PatternLayout pattern="${log.pattern}" />
      			<Policies>
                      <!-- 根据文件大小自动切割日志 -->
      				<SizeBasedTriggeringPolicy size="1 MB" />
      			</Policies>
                  <!-- 保留最近10份 -->
      			<DefaultRolloverStrategy max="10" />
      		</RollingFile>
      	</Appenders>
      	<Loggers>
      		<Root level="info">
                  <!-- 对info级别的日志,输出到console -->
      			<AppenderRef ref="console" level="info" />
                  <!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
      			<AppenderRef ref="err" level="error" />
      		</Root>
      	</Loggers>
      </Configuration>
      

方式② 单独Log4j 方式 (获得 Logger)

  1. 导入

    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    
  2. 使用

    使用:Logger.getLogger() 获得 Logger

    package _2022_08_18_demo;
    
    import org.apache.log4j.Logger;
    
    public class Test_log4j2 {
        public static void main(String[] args) {
            Logger logger = Logger.getLogger(Test_log4j2.class.getName());
            logger.info("Log4j info...");
            logger.warn("Log4j warn...");
            logger.error("Log4j error...");
        }
    }
    
  3. 配置文件

    • 使用 .properties 文件配置 (建议)

      #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
      log4j.rootLogger=DEBUG,console,file
      
      #控制台输出的相关设置
      log4j.appender.console = org.apache.log4j.ConsoleAppender
      log4j.appender.console.Target = System.out
      log4j.appender.console.Threshold=DEBUG
      log4j.appender.console.layout = org.apache.log4j.PatternLayout
      log4j.appender.console.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss.SSS}][%l] %n <%m> %n
      
      #文件输出的相关设置
      log4j.appender.file = org.apache.log4j.RollingFileAppender
      #下面的语句是将在项目目录里 创建一个文件,文件里面就是输出的日志。
      log4j.appender.file.File=./Java_meven/untitled1/src/main/resources/err2.log
      #单个文件最大值为10mb
      log4j.appender.file.MaxFileSize=10mb
      log4j.appender.file.Threshold=DEBUG
      log4j.appender.file.layout=org.apache.log4j.PatternLayout
      log4j.appender.file.layout.ConversionPattern=[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c] <%m>%n
      
      #日志输出级别
      log4j.logger.org.mybatis=DEBUG
      log4j.logger.java.sql=DEBUG
      log4j.logger.java.sql.Statement=DEBUG
      log4j.logger.java.sql.ResultSet=DEBUG
      log4j.logger.java.sql.PreparedStatement=DEBUG
      
      参数解释输出示例
      %c输出 所在包+类的位置_2022_08_18_demo.Test1
      %t输出 调用函数main
      %l输出 包名 +函数名+ 第几行
      包括( %c.%t)_2022_08_18_demo.Test1.main(Test1.java:10)
      %p表示 输出级别INFO
      %d表示设置时间格式
      一般设置为
      %-d{yyyy-MM-dd HH:mm:ss.SSS}2022-08-18 16:24:52.326
      %m表示 输出信息
      %n换行
      %数字表示 最少输出字符个数
      %-设置左对齐 (默认右对齐)
    • xml 配置方式

      • 不经常使用 ( 省略 )
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
        <log4j:configuration>
            <!-- 
                 appender指定输出目的地,如控制台或文件;
                 appender的名称任意
            -->
            <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
                <layout class="org.apache.log4j.PatternLayout">
                    <param name="ConversionPattern"
                        value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
                </layout>
            </appender>
         
            <!-- 
                 category(类别)为'org.springframework'的logger只记录level为“info”或更高级别的消息;
                 即:如果您使用的类名获取logger(如Logger.getLogger(AClass.class))
                 而且AClass是org.springframework包的一部分,则它属于这一category
            -->
            <logger name="org.springframework">
                <level value="info"/>
            </logger>
        
            <!-- 
                 spring的所有日志消息都被设置为“info”等级,但对于类PropertyEditorRegistrySupport,
                 我们想将其日志消息设置为“debug”等级
            -->
            <logger name="org.springframework.beans.PropertyEditorRegistrySupport">
                <level value="debug"/>
            </logger>
         
            <logger name="org.acegisecurity">
                <level value="info"/>
            </logger>
            
            
            <root>
                <!-- 
                    所有日志消息的级别为“debug”或更高的将被记录,除非另有定义
                    所有日志消息将都记录到appender “stdout”中,除非另有定义
                -->
                <level value="debug" />
                <appender-ref ref="stdout" />
            </root>
        </log4j:configuration>
        

### 使用 SLF4J + log4j 方式

  1. 导入包

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.36</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.36</version>
      <!-- <scope>test</scope> -->
    </dependency>
    
  2. 使用

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class Test_slf4j2 {
        public static void main(String[] args) {
            Logger logger = LoggerFactory.getLogger(Test_slf4j2.class.getClass());
            logger.info("sfl4j+log4j info");
            logger.warn("sfl4j+log4j warn");
            logger.error("sfl4j+log4j error");
        }
    }
    
  3. 配置
    使用 Log4j 的配置方式 即可

何为SLF4j
何为Commons Logging

简单来说

  • 一般Commons Logging 与 Log4j 为好基友(一组),
  • SLF4j 与 Logback 为好基友(一组)
    但是 也可以 强硬的将 SLF4j 与 Log4j 一组