type
status
date
slug
summary
tags
category
icon
password

一、Log4j2集成

1、引入依赖

以 Maven 依赖为例,下面三种方式三选一即可。
  1. 引入核心包 log4j-api.jarlog4j-core.jar
注意2.17.1以下的版本会有远程代码执行的安全漏洞,具体参考Apache官方文档(https://logging.apache.org/log4j/2.x/security.html)。推荐使用最新的版本。
  1. 如果需要接入 Slf4j,直接引入log4j-slf4j-impl.jar 依赖即可,其中除了包含两个 API 之间的桥梁,还包含上面的两个核心包。
  1. 如果使用 Spring Boot 项目,可以直接使用 spring-boot-starter-log4j2 ,但是需要先排除默认的logback

2、创建配置文件

新建 log4j2.xml 配置文件,并放到项目的 classpath 里面,一般会放到 resources 目录里面。下面是一个参考的配置,当然也可以使用 properties 文件和 yaml 文件来进行配置。下面是一个最简配置。

3、在程序中打印日志

输出如下:

二、Log4j2配置文件加载

Log4j2 包含 4 种 ConfigurationFactory 的实现,分别适用于 JSON、YAML、properties 和 XML 配置文件。所有元素和属性名均不区分大小写。但推荐标签首字母大写,属性小写
配置文件的加载顺序如下:
  1. log4j将检查 log4j.configuration file 系统属性,如果设置了,将尝试使用与文件扩展名匹配的configurationfactory 加载配置。
  1. 如果未设置系统属性,则属性配置工厂将在类路径中查找 log4j2-test.properties
  1. 如果没有找到这样的文件,yaml 配置工厂 将在类路径中查找 log4j2-test.yamllog4j2-test.yml
  1. 如果找不到这样的文件,json 配置工厂将在类路径中查找 log4j2-test.jsonlog4j2-test.jsn
  1. 如果找不到这样的文件,XML 配置工厂将在类路径中查找 log4j2-test.xml
  1. 如果找不到测试文件,properties 配置工厂将在类路径上查找 log4j2.properties
  1. 如果找不到属性文件,yaml 配置工厂将在类路径上查找 log4j2.yamllog4j2.yml
  1. 如果找不到 yaml文 件,json 配置工厂将在类路径上查找 log4j2.jsonlog4j2.jsn
  1. 如果找不到 JSON 文件,XML 配置工厂将尝试在类路径上找到 log4j2.xml
  1. 如果找不到配置文件,将使用默认配置 DefaultConfiguration,默认配置等同下面的配置(这也就是为什么控制台没有 info 级别以下日志输出的原因)
    💡
    我们一般默认使用 log4j2.xml 进行命名。如果本地要测试,可以把 log4j2-test.xml 放到 classpath,而正式环境使用 log4j2.xml。在打包部署的时候不要打包 log4j2-test.xml 即可。
    我们可以在配置文件 application.yml 通过下面方式修改日志级别,就是因为 Log4j2 支持 JSON 格式。
    Log4j 可以使用两种 XML 格式:简明和严格。简明格式可以简化配置,元素名匹配其代表的组件,但不能通过 XML Schema 来验证。例如
    是等价的。根据上面的介绍就可以理解下面所示的 XML 配置结构。其中,小写字母开头的元素为简明格式。

    三、配置文件解析

    一个经典的 log4j2.xml 的配置结构如下图所示

    Configuration

    Configuration 是根结点,常用属性是 status 和 monitorinterval
    属性
    作用
    status
    用来指定log4j本身的打印日志的级别。共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。 • All:最低等级的,用于打开所有日志记录。 • Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。 • Debug:指出细粒度信息事件对调试应用程序是非常有帮助的。 • Info:消息在粗粒度级别上突出强调应用程序的运行过程。 • Warn:输出警告及warn以下级别的日志。 • Error:输出错误信息日志。 • Fatal;输出每个严重的错误事件将会导致应用程序的退出的日志。 • OFF:最高等级的,用于关闭所有日志记录。
    monitorinterval
    用于指定 log4j 自动重新配置的监测间隔时间,单位是 s,最小是5s。

    Properties

    Log4j2支持在配置中定义全局属性,name属性必须存在且唯一,允许使用${name}来引用该变量。
    例如:以下配置定了LOG_HOME的全局属性
    要使用该属性,需要使用 ${LOG_HOME} 来引用

    Appenders

    Appenders 负责将日志传送至配置目的地,配置日志打印内容、格式、方式、保存策略等。下面的节点都必须有 name 属性,且该 name 值唯一,该 name 将在 Logger 标签中被使用。

    Console

    用来定义输出到控制台的Appender。
    属性
    作用
    name
    必填,指定Appender的名字。
    target
    SYSTEM_OUT 或 SYSTEM_ERR,一般只设置默认:SYSTEM_OUT
    ThresholdFilter
    决定日志事件能否被输出。过滤条件有三个值:ACCEPT(接受)DENY(拒绝)NEUTRAL(中立)。ACCEPT 和 DENY 之后,后续的过滤器就不会执行了,只有在 NEUTRAL 的时候才会执行后续的过滤器。 onMatch="ACCEPT"匹配该级别及以上级别 onMatch="DENY"不匹配该级别及以上级别 onMismatch="ACCEPT" 表示匹配该级别以下的级别 onMismatch="DENY" 表示不匹配该级别以下的级别 匹配INFO级别以及以上级别,不匹配INFO级别以下级别,即: 匹配 >= INFO的级别 <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> 不匹配WARN级别以及以上级别,匹配WARN级别以下级别,即: 匹配 < WARN的级别 <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="ACCEPT"/> 不匹配ERROR级别及以上级别,然后走下一个过滤器,匹配DEBUG级别以及以上级别,所以匹配 >= DEBUG & < EROOR 的级别,即使匹配DEBUG和INFO级别 <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
    PatternLayout
    输出格式,不设置默认为 %m%n。PatternLayout 可以使用与C语言printf函数类似的转换模式来指定输出格式。常见的配置如下: • %d{yyyy-MM-dd HH:mm:ss.SSS} : 日志生成时间,输出格式为“年-月-日 时:分:秒.毫秒” • %p : 日志输出格式 • %c : logger的名称 • %m : 日志内容,即 logger.info("message") • %n : 换行符 • %T : 线程号 • %L : 日志输出所在行数 • %M : 日志输出所在方法名

    File

    用来定义输出到指定位置的文件的Appender。比较少用。
    属性
    作用
    name
    指定Appender的名字。
    fileName
    指定输出日志的目的文件带全路径的文件名。
    PatternLayout
    输出格式,不设置默认为 %m%n

    RollingFile

    用来定义超过指定大小自动删除旧的创建新的的Appender。
    • 其支持缓存并可设置缓存大小,默认开启,记录首先会写入缓冲区,当缓冲区满再写入磁盘,性能显著提高
    • 支持文件滚动更新,当文件的大小或时间满足一定条件,可自动将日志写入新的文件
    属性
    作用
    name
    指定Appender的名字。
    fileName
    指定输出日志的目的文件带全路径的文件名。
    filePattern
    指定新建日志文件的名称格式。
    PatternLayout
    输出格式,不设置默认为 %m%n
    Policies
    是指定滚动日志的策略,就是什么时候进行新建日志文件输出日志。有两种策略 • TimeBasedTriggeringPolicy:基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am。 • SizeBasedTriggeringPolicy:基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小。
    DefaultRolloverStrategy
    用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

    RollingRandomAccessFile

    RollingRandomAccessFileAppender 与 RollingFileAppender 相似,除了它会被缓存且在内部它使用 ByteBuffer + RandomAccessFile 而不是 BufferedOutputStream。与 RollingFileAppender 相比,性能提高了20-200%。

    Loggers

    日志打印配置,只有此处配置了Appender,Appender才会生效。

    Root

    用来指定项目的根日志,如果没有单独指定 Logger,那么就会默认使用该 Root 日志输出
    属性
    作用
    level
    日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
    AppenderRef
    Root 的子节点,用来指定该日志输出到哪个 Appender。

    Logger

    用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。
    属性
    作用
    name
    用来指定该 Logger 所适用的类或者类所在的包全路径,继承自Root节点
    level
    非必填,日志输出级别,默认ERROR。共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。
    additivity
    非必填,默认true。该 Logger 是否附加给Root
    AppenderRef
    Logger 的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root。如果指定了,那么会在指定的这个 Appender 和 Root 的 Appender 中都会输出,此时我们可以设置 Logger 的 additivity="false" 只在自定义的 Appender 中进行输出。

    四、配置文件示例

     
    MongoDB地理位置查询正则表达式总结
    mcbilla
    mcbilla
    一个普通的干饭人🍚
    Announcement
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    🎉欢迎来到飙戈的博客🎉
    -- 感谢您的支持 ---
    👏欢迎学习交流👏