目 录CONTENT

文章目录

Log4j2.xml文件配置解析

FatFish1
2024-11-12 / 0 评论 / 0 点赞 / 47 阅读 / 0 字 / 正在检测是否收录...

依赖引入

       <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.23.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.23.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.23.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jul</artifactId>
            <version>2.23.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>2.0.13</version>
        </dependency>

节点解析

<Configuration> - 根节点

根节点<Configuration>有两个属性:status和monitorinterval

  • status用来指定log4j本身的打印日志的级别.

  • monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s

还有有两个子节点:<Appenders><Loggers>,每个<Configuration>下面应该有最多<Appenders><Loggers>各一个

<Configuration status="INFO" monitorInterval="60">
    ……
</Configuration>

这个案例表示日志输出的全局级别是INFO级别

<Appenders> - 添加日志输出位置

在<Appenders>节点下面可以添加日志输出位置并做相应配置,它有很多种字节点,代表可以添加的日志输出位置:<Async>、<Console>、<Failover>、<File>、<Flume>、<JDBC>、<JMS>、<JPA>、<MemoryMappedFile>、<NoSQL>、<RandomAccessFile>、<Rewrite>、<RollingFile>、<RollingRandomAccessFile>、<Routing>、<SMTP>、<Socket>、<Syslog>

其中最常用的有:

<Console> - 输出到控制台

  • <Console>节点用来定义输出到控制台的Appender,ConsoleAppender将输出结果写到System.errSystem.out。默认是System.err。必须要包含用来格式化LogEvent的Layout元素

    • 属性

      • name:指定该Appender名字

      • target:SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认,SYSTEM_OUT

    • 子标签

      • <PatternLayout>:输出格式,不设置默认为:%m%n,其格式规则如下:

        • %d{HH:mm:ss.SSS}:日期,输出格式为11:33:08.440

        • %t:线程名,输出格式为main

        • %-5level:日志级别,输出格式为FATAL

        • %logger{36}:日志名称,输出格式为org.apache.logging.log4j.Log4j2Test

        • %msg:日志信息,输出格式为fatal level log

        • %enc{%msg}{JSON}:表示转义,将消息体转义为JSON

        • %n:表示换行

<appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %enc{%msg}{JSON}%n"/>
    </Console>
</appenders>


<!--   11:33:08.440 [main] FATAL org.apache.logging.log4j.Log4j2Test - fatal level log  -->

<RollingFile> - 滚动文件

  • <RollingFile><File>一样,都是将日志写入到文件中,但<File>对文件的约束很简单,而<RollingFile>则较为灵活,比如多大文件时分拆,最多可以分拆成几个文件等等。另外,<RollingFile>需要触发条件。

    • 属性

      • name:appender命名

      • fileName:文件命名

      • filePattern:拆分子文件命名

      • filePermissions:文件权限

      • immediateFlush:启用缓冲io,提升性能,但是可能在系统崩溃时造成日志丢失

    • 子节点

      • <Policies> :日志滚动策略

        • <OnStartupTriggeringPolicy/>:JVM启动时触发一次分割

        • <SizeBasedTriggeringPolicy size="20MB"/> :根据大小分割,20M一个文件

        • <TimeBasedTriggeringPolicy/>:根据时间分割

      • <DefaultRolloverStrategy>:归档策略,可以调整清理策略或一段时间保留数量

<RollingFile name="serviceFile" fileName="servicelog/service.log" immediateFlush="true" append="true"
             filePattern="${base_dir}/service_%d{yyyyMMddHHmmssSSS}.zip" filePermissions="rw-------">
    <UsPatternLayout>
        <Pattern>${logPattern}</Pattern>
    </UsPatternLayout>
    <Policies>
        <SizeBasedTriggeringPolicy size="20 MB"/>
    </Policies>
    <DefaultRolloverStrategy tempCompressedFilePattern="${base_dir}/service_%d{yyyyMMddHHmmssSSS}.log.temp">
        <PosixViewAttribute basePath="${base_dir}" filePermissions="r--------">
            <IfFileName glob="service_*.zip"/>
        </PosixViewAttribute>
        <Delete basePath="${base_dir}" maxDepth="1">
            <IfFileName glob="service_*.zip">
                <IfAccumulatedFileCount exceeds="100"/>
            </IfFileName>
        </Delete>
    </DefaultRolloverStrategy>
</RollingFile>

<RollingRandomAccessFile> - 滚动可缓冲文件

  • <RollingRandomAccessFile>有缓冲区Buffer的概念,缓冲区满了后才会写入磁盘,所以可能看不到实时滚动更新的日志(但其性能更好)。要看到实时滚动更新的日志,则用<RollingFIle>

配置方法和<RollingFile>类似

<Loggers> - 日志

用于配置具体日志,字节点包括:

<Root> - 根节点日志

Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

<!--  日志根节点关联到serviceFile这个Appender上面  -->
<Root level="info" includeLocation="true">
    <AppenderRef ref="serviceFile"/>
</Root>

<Logger> - 日志节点

<Logger>节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。包括以下属性:

  • level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF

    • All:最低等级的,用于打开所有日志记录

    • Trace:是追踪,就是程序推进以下,一般也不用

    • Debug:指出细粒度信息事件对调试应用程序是非常有帮助的

    • Info:消息在粗粒度级别上突出强调应用程序的运行过程

    • Warn:输出警告及warn以下级别的日志

    • Error:输出错误信息日志

    • Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志

    • OFF:最高等级的,用于关闭所有日志记录

  • name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点。这个要关注的是name不是命名了,是类名

此外,还有<AppenderRef>字节点,与<Root>中的作用一样

<!-- 把project.myservice.java包下面的日志输出到servicelog文件 -->
<Logger name="project.myservice.java" level="error" includeLocation="true" additivity="false">
    <AppenderRef ref="servicelog"/>
</Logger>

<AsyncLogger> - 异步日志框架

<AsyncLogger>的异步记录器是Log4j2的一个新特性,可以通过在单独的线程中执行I/O操作来提高应用程序的性能。其内部使用了disruptor框架,其底层数据结构为无锁环形队列,每次日志信息保存在队列中,另一个线程将队列中日志写入文件

必须引入disruptor框架使用,用法和<Logger>一样

<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>xxxxx</version>
</dependency>

0

评论区