首页 > 其他分享 >一文搞定Log4j2日志配置文件

一文搞定Log4j2日志配置文件

时间:2024-07-18 23:29:05浏览次数:19  
标签:文件 配置文件 输出 指定 节点 Logger Log4j2 日志

1.在 Spring Boot 应用中集成 Log4j2

首先在项目pom文件中引入Log4j的依赖

<!--log4j2-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

在当前项目的resource目录下增加文件 log4j2.xml

 

下面介绍配置文件中各个节点,感兴趣的小伙伴也可以去官网查看

2.配置节点

2.1 根节点configuration

        有两个属性:status,monitorinterval,两个子节点:Appenders和Loggers表名可以定义多个Appender和Logger

  • status,用来指定log4j本身的打印日志级别  OFF>FATAL>ERROR>WARN>INFO>DEBUG>TRACE>ALL
  • monitorinterval 重新读取配置文件的监测间隔时间,单位是s,最小是5s.

2.2 Properties

        属性(可选),用来定义常量(例如日志打印的模版),之后在其他配置项中通过${变量名}引用

2.3 Appenders

        常见的有三种子节点:Console、RollingFile、File

2.3.1 Console

       用来定义输出到控制台的Appender两个属性:name、target,一个节点:PatternLayout

  • name(属性):指定Appender的名字
  • target(属性):SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT.
  • PatternLayout(节点):指定输出日志的格式,可以使用pattern属性与Properties中定义的日志打印模板常量相结合,控制日志输出的模版,不设置则默认为:%m%n

2.3.2 File

       文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(例如:D:/logs/info.log)

  • name(属性)::指定Appender的名字.
  • fileName(属性):指定输出日志的目的文件带全路径的文件名.
  • PatternLayout(节点):输出格式,不设置默认为:%m%n.

2.2.3 RollingFile

        也是写入到文件,不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则 
        这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。

  • name(属性):指定Appender的名字.
  • fileName(属性):指定输出日志的目的文件带全路径的文件名
  • PatternLayout(节点):输出格式,不设置默认为:%m%n
  • filePattern:指定新建日志文件的名称格式.
  • Policies(节点):指定滚动日志的策略,就是什么时候进行新建日志文件输出日志.
    • TimeBasedTriggeringPolicy(节点):Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am..而不是7am.
    • SizeBasedTriggeringPolicy(节点):Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小.
    • DefaultRolloverStrategy(节点):用来指定同一个文件夹下最多有几个日志文件时开始删除最l旧的,创建新的(通过max属性);可以指定压缩级别(通过compressionLevel属性),compressionLevel的值通常是一个介于0到9之间的整数,其中:0表示无压缩,1表示最快的压缩速度(但压缩率最低),9表示最高的压缩率(但压缩速度最慢)
      • Delete:清理旧日志文件的策略;basePath指定了日志文件所在的基目录;maxDepth用于指定清理或删除日志文件时搜索的目录深度,值是一个整数,表示从basePath开始向下搜索的目录层级数
        • IfFileName:Delete子节点,用于匹配要删除的文件名模式。glob接受一个通配符模式,用来匹配文件名。
        • IfLastModified:Delete子节点,用于检查文件的最后修改时间,并基于该时间点决定文件是否应该被清理或删除;age指定了文件最后修改时间与当前时间之间最大允许的时间差

                        如果maxDepth="0",则只会考虑basePath所指向的目录本身,不包括任何子目录。

                        如果maxDepth="1",则会考虑basePath所指向的目录及其直接子目录。

                        如果maxDepth="2",则会考虑basePath所指向的目录、其直接子目录以及这些子目录下的子目录(即二级子目录)。

2.4 Logger

        Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。level:日志输出级别,共有8个级别,按照从低到高为: All < Trace < Debug < Info < Warn < Error < Fatal < OFF

  • root :设定根日志的日志级别
  • name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
  • AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出。
  • additivity:是否继承root节点,默认是true继承。默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。

       

3.日志输出模板参数介绍

    格式化输出:
    %date{yyyy-MM-dd HH:mm:ss.SSS}: 简写为%d 日期 2023-08-12 15:04:30,123
    %thread: %t 线程名, main
    %-5level:%p 日志级别,从左往右至少显示5个字符宽度,不足补空格 INFO
    %msg:%m 日志消息 info msg
    %n: 换行符
    {cyan}: 蓝绿色(青色)
    %logger{36}: %c 表示 Logger 名字最长36个字符
    %C: 类路径 com.qq.demolog4j2.TestLog4j2
    %M: 方法名 main
    %F: 类名 TestLog4j2.java
    %L: 行号 12
    %l: 日志位置, 相当于 %C.%M(%F.%L)  com.qq.demolog4j2.TestLog4j2.main(TestLog4j2.java:16)
    %highlight:高亮显示,%highlight{%-5level}

如果控制台输出的日志级别没有高亮显示,Log4j2默认关闭了Jansi:一个支持输出ANSI颜色的类库 IDEA中,点击右上角->Edit+Configurations,在VM+options中添加-Dlog4j.skipJansi=false

下面就是我在开发中使用的一些配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">

    <properties>
        <!-- 日志打印级别 -->
        <property name="LOG_LEVEL">INFO</property>
        <!-- APP名称 -->
        <property name="APP_NAME" value="spring-mvc-log"/>
        <!-- 日志文件存储路径 -->
        <property name="LOG_HOME">./logs/</property>
        <!-- 存储天数 -->
        <property name="LOG_MAX_HISTORY" value="10d"/>
        <!-- 单个日志文件最大值, 单位 = KB, MB, GB -->
        <property name="LOG_MAX_FILE_SIZE" value="10 MB"/>
        <!-- 每天每个日志级别产生的文件最大数量 -->
        <property name="LOG_TOTAL_NUMBER_DAILY" value="10"/>
        <!-- 压缩文件的类型,支持zip和gz,建议Linux用gz,Windows用zip -->
        <property name="ARCHIVE_FILE_SUFFIX" value="zip"/>
        <!-- 日志文件名 -->
        <property name="LOG_FILE_NAME" value="${LOG_HOME}"/>
        <property name="FILE_NAME_PATTERN" value="${LOG_HOME}.%d{yyyy-MM-dd}"/>

        <!--
            格式化输出:
            %date{yyyy-MM-dd HH:mm:ss.SSS}: 简写为%d 日期 2023-08-12 15:04:30,123
            %thread: %t 线程名, main
            %-5level:%p 日志级别,从左往右至少显示5个字符宽度,不足补空格 INFO
            %msg:%m 日志消息 info msg
            %n: 换行符
            {cyan}: 蓝绿色(青色)
            %logger{36}: %c 表示 Logger 名字最长36个字符
            %C: 类路径 com.qq.demolog4j2.TestLog4j2
            %M: 方法名 main
            %F: 类名 TestLog4j2.java
            %L: 行号 12
            %l: 日志位置, 相当于 %C.%M(%F.%L)  com.qq.demolog4j2.TestLog4j2.main(TestLog4j2.java:16)
        -->
        <!-- %d: 日期
        %-5level: 日志级别,显示时占5个字符不足
        [%t]: 线程名
        %c{1.}: 显示调用者,只显示包名最后一截及方法名,前面的只取首字母
        .%M(代码行号%L):
        %msg%n": 需要打印的日志信息,换行:INFO>[MsgToMP:99]
        Bright: 加粗 -->
        <!--日志输出格式-控制台彩色打印-->
        <property name="ENCODER_PATTERN_CONSOLE">%blue{%d{yyyy-MM-dd HH:mm:ss.SSS}} | %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} | %yellow{%t} | %cyan{%c{1.}}  : %white{%msg%n}</property>
        <!--日志输出格式-文件-->
        <property name="ENCODER_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5level | %t | %c{1.} : %msg%n</property>
        <property name="DEFAULT_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight{%-5level} %style{%5pid}{bright,magenta} --- [%15.15t] %cyan{%c{1.} [%L]} : %m%n</property>
    </properties>

    <Appenders>
        <!-- 控制台的输出配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${DEFAULT_PATTERN}" />
        </Console>
        <!-- 打印出所有的info及以下级别的信息,每次大小超过size进行压缩,作为存档-->
        <RollingFile name="RollingFileAll" fileName="${LOG_FILE_NAME}/${date:yyyy-MM}/info.log" filePattern="${FILE_NAME_PATTERN}/ALL.%i.log.${ARCHIVE_FILE_SUFFIX}">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="${LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY" />
            <!--输出日志的格式-->
            <PatternLayout pattern="${ENCODER_PATTERN}" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="${APP_NAME}.*.ALL.*.log.${ARCHIVE_FILE_SUFFIX}" />
                    <IfLastModified age="${LOG_MAX_HISTORY}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="RollingFileDebug"
                     fileName="${LOG_FILE_NAME}/${date:yyyy-MM}/debug.log"
                     filePattern="${FILE_NAME_PATTERN}/DEBUG.%i.log.${ARCHIVE_FILE_SUFFIX}">
            <Filters>
                <ThresholdFilter level="DEBUG" />
                <ThresholdFilter level="INFO" onMatch="DENY"
                                 onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="9"
                                     max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="${APP_NAME}.*.DEBUG.*.log.${ARCHIVE_FILE_SUFFIX}" />
                    <IfLastModified age="${LOG_MAX_HISTORY}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${LOG_FILE_NAME}/${date:yyyy-MM}/warn.log"
                     filePattern="${FILE_NAME_PATTERN}.WARN.%i.log.${ARCHIVE_FILE_SUFFIX}">
            <Filters>
                <ThresholdFilter level="WARN" />
                <ThresholdFilter level="ERROR" onMatch="DENY"
                                 onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="9"
                                     max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="${APP_NAME}.*.WARN.*.log.${ARCHIVE_FILE_SUFFIX}" />
                    <IfLastModified age="${LOG_MAX_HISTORY}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="RollingFileError"
                     fileName="${LOG_FILE_NAME}/${date:yyyy-MM}/error.log"
                     filePattern="${FILE_NAME_PATTERN}.ERROR.%i.log.${ARCHIVE_FILE_SUFFIX}">
            <Filters>
                <ThresholdFilter level="ERROR" />
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}" />
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}" />
            </Policies>
            <DefaultRolloverStrategy compressionLevel="9"   max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="${APP_NAME}.*.ERROR.*.log.${ARCHIVE_FILE_SUFFIX}" />
                    <IfLastModified age="${LOG_MAX_HISTORY}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>

    <!--只有定义了logger并引入以上Appenders,Appender才会生效-->
    <Loggers>
        <root level="${LOG_LEVEL}">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileAll"/>
            <appender-ref ref="RollingFileDebug"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </Loggers>
</configuration>

标签:文件,配置文件,输出,指定,节点,Logger,Log4j2,日志
From: https://blog.csdn.net/weixin_45462869/article/details/140489775

相关文章

  • # Windows 定时删除指定路径下N天前的日志文件
    Windows下bat脚本文件的内容为1.删除指定路径下5天前的所有文件@echooffsetSrcDir=E:\WORK\GitsetDaysAgo=5forfiles/p%SrcDir%/s/m*.*/d-%DaysAgo%/c"cmd/cdel/f/q/a@path"2.删除指定路径下5天前的所有log文件@echooffsetSrcDir=E:\WORK\Git//指......
  • 错误日志(没什么,但是想学一下(以后),暂时存起来)
    [root@masterconf]#jps1648SupportToolServer58545NodeManager113575HMaster15447NameNode16952Jps58248ResourceManager57883QuorumPeerMain15084DataNode113901HRegionServer1581AmbariServer[root@masterconf]#[root@bigdata1lib]#netstat-anp......
  • Java开发手册中-要求日志输出时字符串变量之间的拼接使用占位符与使用字符串拼接性能
    场景Java中使用JMH(JavaMicrobenchmarkHarness微基准测试框架)进行性能测试和优化:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131723751参考以上性能测试工具的使用。Java开发手册中有这样一条:【强制】在日志输出时,字符串变量之间的拼接使用占位符的方式......
  • 分析nirsoft出品的几个日志查看工具 windows
    介绍官网https://www.nirsoft.net/包含lastactivityview(程序打开日志查看)、turnedontimesview(系统开关机日志)、winlogonview(系统登陆日志查看)以上三个均为个人经常使用,并已经打好中文补丁。均为绿色免安装版本,解压直接食用。打包下载下载:https://damon8.lanzoub.com/izGOX2......
  • 实现基于Java的分布式日志收集与分析系统
    实现基于Java的分布式日志收集与分析系统大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代分布式系统中,日志收集与分析是非常重要的一环。分布式日志系统需要高效地收集、存储和分析来自不同节点的日志,以便及时发现和解决问题。本文将介绍如何使用Ja......
  • nginx出现499错误码的原因以及proxy_ignore_client_abort配置 及 nginx日志配置变量大
    一、nginx出现499错误码的原因以及proxy_ignore_client_abort配置1. nginx出现499错误码的原因    最近发现服务器上出现很多499的错误,出现499错误的原因是客户端关闭了连接,在我这篇文章:服务端在执行时中途关闭浏览器退出之后php还会继续执行吗?个人实践实验得到结果( h......
  • 实验11 数据库日志及数据库恢复
    一、实验目的了解Mysql数据库系统中数据恢复机制和主要方法。二、实验环境操作系统:MicrosoftWindows7旗舰版(32&64位)/Linux。硬件:容量足以满足MySQL5.7(8.0)安装及后续实验的使用。软件:数据库版本:MySQL5.7(8.0)。三、实验内容(1)利用配置文件开启各种MYSQL日志需要......
  • 使用Spring Boot AOP和自定义注解优雅实现操作日志记录
    使用SpringBootAOP和自定义注解优雅实现操作日志记录大家好,今天我们来聊聊如何在SpringBoot项目中,通过AOP(面向切面编程)和自定义注解,优雅地实现操作日志记录。操作日志对于系统的可维护性和安全性至关重要,它能帮助我们追踪用户行为,排查问题。什么是AOP?AOP,全称Aspect-Oriented......
  • C++日志头文件[gpt]
    只要include头文件就能使用,单例模式#ifndefMONITORING_LOGGER_H#defineMONITORING_LOGGER_H#include<iostream>#include<string>#include<sstream>#include<mutex>#include<cstdarg>#include<iomanip>//Setloglevel#defineMO......
  • 机械学习—零基础学习日志(高数04——函数概念与特性)
    零基础为了学人工智能,真的开始复习高数然后开始学习复合函数,主要掌握复合的方法。求解复合函数,先稍微百度百科一下,什么是因式分解:因式分解:​把一个多项式在一个范围(如实数范围内分解,即所有项均为实数)化为几个整式的积的形式,这种式子变形叫做这个多项式的因式分解,也叫作把......