Log4j2的核心概念及应用

本文从官网摘出log4j2核心应用以及概念,帮助理解log4j2。

Log4j2 配置

Log4j2 配置方式

四种配置方式:
1) 通过配置文件。支持的文件格式:XML, JSON, YAML, or properties
2)编程方式。创建ConfigurationFactory 以及Configuration
3)编程方式。通过调用Configuration 提供的api接口,创建组件
4) 编程方式。调用Logger 类的内置接口
编程方式可以浏览http://logging.apache.org/log4j/2.x/manual/customconfig.html。本文主要描述了配置文件的方式。

Log4j2 自动配置

Log4j2根据ConfigurationFactory查询加载环境中的配置,目前官方的四种实现是:JSON, YAML, properties, XML。
ConfigurationFactory的加载配置,优先级由高到低(如果发现了优先级高的配置,则不会加载优先级低的配置文件)
1 系统环境变量"log4j.configurationFile"
2 classpath中寻找log4j2-test.properties
3 classpath中寻找log4j2-test.yaml或者 log4j2-test.yml
4 classpath中寻找log4j2-test.json或者 log4j2-test.jsn
5 classpath中寻找log4j2-test.xml
6 classpath中寻找log4j2.properties
7 classpath中寻找log4j2.yaml 或者 log4j2.yml
8 classpath中寻找log4j2.json 或者 log4j2.jsn
9 classpath中寻找log4j2.xml
10 如果上面的配置都找不到,则采用默认配置DefaultConfiguration 。默认配置会将日志打印到console。

Log4j2 architecture

在这里插入图片描述
获取Logger的调用顺序:LogManager-》LoggerContext-》LoggerConfig(实际Logger的创建者)

应用程序通过LogManager的接口获取Logger。在内部,LogManager通过LoggerContext提供Logger(官方没有细说怎样定位到合适的LoggerContext)。如果LoggerContext中没有对应的Logger,则会使用LoggerConfig创建一个Logger。LoggerContext通过三种规则,匹配到创建Logger的LoggerConfig:
1)和LoggerConfig和Logger相同的名字。
2)LoggerConfig的名字是Logger名字的包路径前缀
3)根LoggerConfig

LoggerConfig通过名字组成了一个层级结构。如果一个LoggerConfig的名字是另一个LoggerConfig名字的包路径前缀,那么第一个LoggerConfig则为第二个的父节点。
比如说,名字为"com.foo"的LoggerConfig,是"com.foo.Bar" LoggerConfig的parent。根LoggerConfig是所有LoggerConfig的祖先。

Logger的日志级别(TRACE, DEBUG, INFO, WARN, ERROR, and FATAL),是可以继承和覆盖的。
如果Logger有Level定义,则采用Logger自身的定义。
如果Logger没有Level定义,则继承parent的Level定义。

Log4j2 Appender

Logger可以将日志打印到多个目标上,每一个目标称为Appender(当前系统支持console, files, remote socket servers, Apache Flume, JMS, remote UNIX Syslog daemons, and various database APIs)。
Logger的日志会发送给对应LoggerConfig的所有appender,以及父LoggerConfig的所有appender。
但是,我们可以通过Additivity=false,让appender不接收日志数据。
下面是官网给出的例子,很好的解释了这种append关系。
在这里插入图片描述

变量替换

配置文件中,可以使用${name}的方式,使用变量。以下是Log4j2内置的可用变量。

PrefixContext
base64Base64 encoded data. The format is ${base64:Base64_encoded_data}. For example: ${base64:SGVsbG8gV29ybGQhCg==} yields Hello World!.
bundleResource bundle. The format is ${bundle:BundleName:BundleKey}. The bundle name follows package naming conventions, for example: ${bundle:com.domain.Messages:MyKey}.
ctxThread Context Map (MDC)
dateInserts the current date and/or time using the specified format
envSystem environment variables. The formats are ${env:ENV_NAME} and ${env:ENV_NAME:-default_value}. 系统环境变量。比如/etc/profile中的变量,启动脚本,应用程序启动参数。
jndiA value set in the default JNDI Context.
jvmrunargsA JVM input argument accessed through JMX, but not a main argument; see RuntimeMXBean.getInputArguments(). Not available on Android.
log4jLog4j configuration properties. l o g 4 j : c o n f i g L o c a t i o n l o g 4 j 2 配 置 文 件 的 绝 对 路 径 。 {log4j:configLocation} log4j2配置文件的绝对路径。 log4j:configLocationlog4j2{log4j:configParentLocation}绝对路径的parent路径
mainA value set with MapLookup.setMainArguments(String[]) 。按照数组下标取: m a i n : 0 。 按 照 参 数 名 称 取 值 : {main:0} 。按照参数名称取值: main:0{main:–file},${main:-x}
mapA value from a MapMessage
sdA value from a StructuredDataMessage. The key “id” will return the name of the StructuredDataId without the enterprise number. The key “type” will return the message type. Other keys will retrieve individual elements from the Map.
sysSystem properties. The formats are ${sys:some.property} and ${sys:some.property:-default_value}.
javaJava 环境信息。${java:vm}

date变量支持的时间格式:
在这里插入图片描述

java环境信息:
在这里插入图片描述

Spring Boot 1.* 配置Log4j2

配置

配置maven依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

spring boot的配置文件中配置log4j2配置文件位置:

logging
    config: classpath:conf/log4j2-dev.xml

src/main/resources下放conf/log4j2-dev.xml文件。

问题

按照如上的配置,在所有的log之前,会打印一条System.out的日志:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

但是随着spring的启动,日志会正常打印。
这是因为在spring启动之前,log4j2已经启动了,但是无法加载配置文件。spring启动时,才会读取配置文件,找到配置classpath:conf/log4j2-dev.xml。所以才会发生上面的错误日志,但不会影响程序执行。

按照上文的配置文件加载优先级列表,我们只要把log4j2.xml放到src/main/resources下就可以。

log4j2配置文件

摘自网络:
https://www.cnblogs.com/new-life/p/9246143.html

<?xml version="1.0" encoding="UTF-8"?>
 <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
 <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
 <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
 <configuration status="WARN" monitorInterval="30">
     <!--先定义所有的appender-->
     <appenders>
     <!--这个输出控制台的配置-->
         <console name="Console" target="SYSTEM_OUT">
         <!--输出日志的格式-->
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
         </console>
     <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
     <File name="log" fileName="log/test.log" append="false">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
     </File>
     <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
         <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
             <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->        
             <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
         <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
             <DefaultRolloverStrategy max="20"/>
         </RollingFile>
         <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
             <Policies>
                 <TimeBasedTriggeringPolicy/>
                 <SizeBasedTriggeringPolicy size="100 MB"/>
             </Policies>
         </RollingFile>
     </appenders>
     <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
     <loggers>
         <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
         <logger name="org.springframework" level="INFO"></logger>
         <logger name="org.mybatis" level="INFO"></logger>
         <root level="all">
             <appender-ref ref="Console"/>
             <appender-ref ref="RollingFileInfo"/>
             <appender-ref ref="RollingFileWarn"/>
             <appender-ref ref="RollingFileError"/>
         </root>
     </loggers>
 </configuration>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值