log4j2的配置以及代码实现

1.log4j2需要的jar包
地址1:http://logging.apache.org/
地址2:http://people.apache.org/~rgoers/log4j2/download.html

  1.1 Apache Log4j的Project site
  1.2 点击Download
  1.3 点击che-log4j-2.13.3-bin.zip,解压即可

2.log4j2的依赖

  <properties>
        <log4j.version>2.5</log4j.version>
  </properties>

  <dependencies>
        <!--引入log4j2必要的依赖(log4j-api、log4j-core)-->
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>  
              <groupId>org.apache.logging.log4j</groupId>  
              <artifactId>log4j-api</artifactId>  
              <version>2.5</version>  
        </dependency>  
        <dependency>  
              <groupId>org.apache.logging.log4j</groupId>  
              <artifactId>log4j-core</artifactId>  
              <version>2.5</version>  
        </dependency> 
  </dependencies>

3.log4j2的前奏须知

log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件
后缀名只能为".xml",".json"或者".jsn"。

配置文件的格式:log4j配置文件可以是xml格式的,也可以是json格式的。
配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的文件。

系统选择配置文件的优先级(从先到后)如下:

  1 classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
  2 classpath下的名为log4j2-test.xml的文件.`
  3 classpath下名为log4j2.json 或者log4j2.jsn的文件.
  4 classpath下名为log4j2.xml的文件.
  注: 我们一般默认使用log4j2.xml进行命名。
      如果本地要测试,可以把log4j2-test.xml放到classpath,
      正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。

4.log4j2配置文件节点解析

  根节点Configuration
  1.有两个属性:status和monitorinterval,
        1. status用来指定log4j本身的打印日志的级别.
        2. monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s.
  2.有两个子节点:Appenders和Loggers(表明可以定义多个Appender和Logger).
        1. **Appenders**节点,常见的有三种子节点:Console、RollingFile、File.
              1. **Console**节点用来定义输出到控制台的Appender.
                    name:指定Appender的名字.
                    target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
                    PatternLayout:输出格式,不设置默认为:%m%n.
              2. **File**节点用来定义输出到指定位置的文件的Appender.
                    name:指定Appender的名字.
                    fileName:指定输出日志的目的文件带全路径的文件名.
                    PatternLayout:输出格式,不设置默认为:%m%n.
                    append:当为true时,会在之前的日志里面续加内容,而不清空
              3. **RollingFile**节点用来定义超过指定大小自动删除旧的创建新的的Appender.
                    name:指定Appender的名字.
                    fileName:指定输出日志的目的文件带全路径的文件名.
                    filePattern:指定新建日志文件的名称格式.
                    PatternLayout:输出格式,不设置默认为:%m%n.
                    Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
                    TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。
                                modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am.
                    SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
                    DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。
        2. **Loggers**节点,常见的有两种:Root和Logger.
              1. **Root**节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出
                    level:日志输出级别,共有8个级别,见下面注
                    AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender.
              2. **Logger**节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
                    level:日志输出级别,共有8个级别,见下面注
                    name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
                    AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,
                                那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"
                                只在自定义的Appender中进行输出。

  注:关于日志level.共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
        1.All:最低等级的,用于打开所有日志记录.
        2.Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
        3.Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
        4.Info:消息在粗粒度级别上突出强调应用程序的运行过程.
        5.Warn:输出警告及warn以下级别的日志.
        6.Error:输出错误信息日志.
        7.Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
        8.OFF:最高等级的,用于关闭所有日志记录.
        程序会打印高于或等于所设置级别的日志,设置的日志等级越高,打印出来的日志就越少。

5.log4j2.xml的代码

  <?xml version="1.0" encoding="UTF-8"?>
  <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置, 当设置成trace时,log4j2内部详细输出-->
  <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,不需要重启服务, 设置间隔秒数,单位是s, 最小是5s-->
  <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL-->
  <configuration status="info" monitorInterval="10">
        <appenders>
              <!--这个输出控制台的配置-->
              <console name="CONSOLE" target="SYSTEM_OUT">
                    <!--输出日志的格式-->
                    <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%c{1}-%p %l] %m%n"/>
              </console>
	
              <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,当设为true时,不会清空-->
              <File name="log" fileName="applog/log/raiLway_den.log" 
              filePattern="applog/log/raiLway_den_%d{yyyy-MM-dd}_%i.log" append="true">
                    <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%c{1}-%p %l] %m%n"/>
                    <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
              </File>
	
              <!-- 每次大小超过size,则这size大小的日志会自动存入按yyyy-MM-dd建立.log,作为存档-->
              <!-- filePattern 指定新建日志文件的名称格式;  -->
              <!-- createOnDemand 解决重启tomcat或者java -jar 重新运行应用程序时数据丢失的问题 -->
              <RollingFile name="LOGFILE" fileName="applog/logs/raiLway_den.log" 
              filePattern="applog/logs/raiLway_den_%d{yyyy-MM-dd}_%i.log" createOnDemand="true">
                    <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->        
                    <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
                    <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%c{1}-%p %l] %m%n"/>
                    <!-- Policies指定滚动日志的策略,就是什么时候进行新建日志文件输出日志 -->
                    <Policies>
                          <!-- 基于时间的滚动策略,设置每天打包一次 -->
                          <TimeBasedTriggeringPolicy modulate="true" interval="1"/>
                          <!-- 自定义的策略,会不停的往一个里面加,直到满足其余的策略,才更换 -->
                          <!-- <CronTriggeringPolicy schedule="0 0 * * * ?"/> -->
                          <!-- 基于指定文件大小的滚动策略,设置日志文件满100MB后打包,,size属性用来定义每个日志文件的大小 -->
                          <SizeBasedTriggeringPolicy size="1KB"/>
                    </Policies>
                    <!-- DefaultRolloverStrategy属性如不设置,默认最多7个文件,这里设置10000, 这样才可以达到日志不被删除 -->
                    <!-- 用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的 -->
                    <!-- 从2.8版本开始,如果fileIndex属性设置为nomax,那么最大和最小值,都将会被忽略掉,文件编号将从1开发增加-->
                    <!-- 并且每次rollover时递增都从编码最大开始(项目于max效果),而且没有文件数的限制。 -->
                    <DefaultRolloverStrategy max="10000"/>
              </RollingFile>
        </appenders>

        <!--只有定义了logger并引入的appender,appender才会生效-->
        <loggers>
              <!--记录执行的HQL语句 -->
              <!-- additivity="false"是为了避免日志在root里再次输出 -->
              <Logger name="org.hibernate.hql" level="error" additivity="false">
                    <AppenderRef ref="CONSOLE" />
                    <AppenderRef ref="LOGFILE" />
              </Logger>
              <!-- 当解析查询语句时记录HQL和SQL -->
              <Logger name="org.hibernate.hql.ast.AST" level="error" additivity="false">
                    <AppenderRef ref="CONSOLE" />
                    <AppenderRef ref="LOGFILE" />
              </Logger>
              <!-- 记录与事务有关的活动 -->
              <Logger name="org.hibernate.transaction" level="error" additivity="false">
                    <AppenderRef ref="CONSOLE" />
                    <AppenderRef ref="LOGFILE" />
              </Logger>
              <!-- 与数据库连接的 -->
              <Logger name="org.hibernate.ps.PreparedStatementCache" level="error" additivity="false">
                    <AppenderRef ref="CONSOLE" />
                    <AppenderRef ref="LOGFILE" />
              </Logger>
              <!--level是日志记录的优先级 -->
              <root level="info">
                    <AppenderRef ref="CONSOLE"/>
                    <AppenderRef ref="LOGFILE"/>
                    <AppenderRef ref="log"/>
              </root>
        </loggers>
  </configuration>

6.参数解释

  %d{HH:mm:ss.SSS} 表示输出到毫秒的时间
  %t 输出当前线程名称
  %-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
  %logger 输出logger名称,因为Root Logger没有名称,所以没有输出
  %msg 日志文本
  %n 换行
  %F 输出所在的类文件名,如Log4j2Test.java
  %L 输出行号
  %M 输出所在方法名
  %l 输出语句所在的行数, 包括类名、方法名、文件名、行数

7.测试代码

  package coms;

  import org.apache.logging.log4j.LogManager;
  import org.apache.logging.log4j.Logger;

  public class log4j2Test {

  public static void main(String[] args) {
        Logger log = LogManager.getLogger(log4j2Test.class);	

        for(int i = 1;i < 10000; i++) {
              log.trace("这是测试trace" + i);
              log.debug("这是测试debug" + i);
              log.info("这是测试info" + i);
              log.warn("这是测试warn" + i);
              log.error("这是测试error" + i);
              log.fatal("这是测试fatal" + i);
		
              log.error("这是测试error====" + i);
              log.error("这是测试error====" + i);
	}	
}

}

8.测试结果

备注:开始遇到的问题是让日志不被删除,如果不设置DefaultRolloverStrategy的话,是默认为7,即每天只会保留最新的7份日志,
即使不写DefaultRolloverStrategy也会默认,所以想到的方法是,把max值设置得大点,就变相的做到了不删除日志的要求。

查阅的网址:
log4j2邮箱配置进去:https://blog.csdn.net/shiyong1949/article/details/54666992
log4j2日志删除规则:https://www.cnblogs.com/yeyang/p/7944899.html
多个日志版本对比:https://blog.csdn.net/weixin_44761910/article/details/104112489

posted @ 2020-10-30 15:34  何家有子初长成  阅读(1294)  评论(0编辑  收藏  举报