1 日志级别
日志记录器(Logger)的行为是分等级的。如下表所示
分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是 ERROR>WARN>INFO>DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来,也是说大于等于的级别的日志才输出。
2 log4j2文件的配置大致结构
log4j2.xml文件的配置大致如下:
Configuration
properties
Appenders
Console
PatternLayout
File
RollingRandomAccessFile
Filters(过滤机制)
PatternLayout(控制日志信息输出格式)
Polices(控制日志何时when滚动)
Strategy(控制日志如何how滚动)
Loggers
AsyncLogger(异步日志器)
AppenderRef
Logger(同步日志器)
AppenderRef
RootLogger
AppenderRef
2.1 Configuration
Configuration:为根节点,有status和monitorInterval等多个属性
* status的值有 “trace”, “debug”, “info”, “warn”, “error” and “fatal”,用于控制log4j2日志框架本身的日志级别,如果将stratus设置为较低的级别就会看到很多关于log4j2本身的日志,如加载log4j2配置文件的路径等信息
* monitorInterval,含义是每隔多少秒重新读取配置文件,可以不重启应用的情况下修改配置
2.2 Appenders: 输出源,用于定义日志输出的地方,log4j2支持的输出源有很多,有控制台Console、文件File、MongoDB、Flume、RollingRandomAccessFile等。
1. Console: 控制台输出源是将日志打印到控制台上,开发的时候一般都会配置,用于调试;
2. File:文件输出源,用于将日志写入到指定的文件,需要配置输入到哪个位置(如/data/applogs);
3. RollingRandomAccessFile: 该输出源也是写入到文件,不同的是不同的是比File更加强大,可以指定当文件达到一定大小(如20MB)时,另起一个文件继续写入日志,另起一个文件就涉及到新文件的名字命名规则,因此需要配置文件命名规则。这种方式更加实用,因为你不可能一直往一个文件中写,如果一直写,文件过大,打开就会卡死,也不便于查找日志。
* name: 日志器名
* fileName: 指定当前日志文件的位置和名称;
* filePattern: 指定当发生Rolling时,文件的转移和重命名规则
* SizeBasedTriggeringPolicy: 指定当文件体积大于size指定的值时,触发Rolling,生成一个新的日志文件;
* DefaultRolloverStrategy: 指定最多保存的文件个数,默认是9;
* TimeBasedTriggeringPolicy: 与filePattern结合使用,比如filePattern="${LOG_HOME}/apibiz_%d{yyyyMMdd}.log”、TimeBasedTriggeringPolicy的interval=1,则表示每天生成一个文件,若filePattern改成{yyyyMMddHHmm},则每分钟生成一个文件;
2.4 Filters:可以配置一系列的过滤器
Log4j2的onMatch和onMismatch属性值详解如下:
onMatch和onMismatch都有三个属性值,分别为Accept、DENY和NEUTRAL;
分别介绍这两个配置项的三个属性值: -
--------------------
onMatch="ACCEPT" 表示匹配该级别及以上
onMatch="DENY" 表示不匹配该级别及以上
onMatch="NEUTRAL" 表示该级别及以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别及以上
onMismatch="ACCEPT" 表示匹配该级别以下
onMismatch="NEUTRAL" 表示该级别及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的
onMismatch="DENY" 表示不匹配该级别以下的 -
--------------------
2.5 PatternLayout
* charset ##指定字符集
* pattern ##指定格式
* alwaysWriteExceptions ##默认为true,输出异常
* header ##可选项。包含在每个日志文件的顶部
* footer ##可选项。包含在每个日志文件的尾部。
2.5.1 pattern属性参数格式描述
######### 常见参数 #########
%c{参数} 或 %logger{参数} ##输出日志名称
%C{参数} 或 %class{参数 ##输出类型
%d{参数}{时区te{参数}{时区} ##输出时间
%F|%file ##输出文件名
highlight{pattern}{style} ##高亮显示
%l ##输出错误的完整位置
%L ##输出错误行号
%m 或 %msg 或 %message ##输出错误信息
%M 或 %method ##输出方法名
%n ##输出换行符
%level{参数1}{参数2}{参数3} ##输出日志的级别
%t 或 %thread ##创建logging事件的线程名
*/
######### 特殊符号 ############
#有些特殊符号不能直接打印,需要使用实体名称或者编号
//
& —— & 或者 &
< —— < 或者 <
> —— > 或者 >
“ —— " 或者 "
‘ —— ' 或者 '
*/
######## pattern对齐修饰 ##########
// 对齐修饰,可以指定信息的输出格式,如是否左对齐,是否留空格等。
## 编写格式为在任何pattern和%之间加入一个小数,可以是正数,也可以是负数。
## 整数表示右对齐,负数表示左对齐;
## 整数位表示输出信息的最小n个字符,如果输出信息不够n个字符,将用空格补齐;
## 小数位表示输出信息的最大字符数,如果超过n个字符,则只保留最后n个字符的信息
## (注意:保留的是后20个字符,而不是前20个字符)
*/
#示例如下
%20 —— 右对齐,不足20个字符则在信息前面用空格补足,超过20个字符则保留原信息
%-20 —— 左对齐,不足20个字符则在信息后面用空格补足,超过20个字符则保留原信息
%.30 —— 如果信息超过30个字符,则只保留最后30个字符
%20.30 —— 右对齐,不足20个字符则在信息前面用空格补足,超过30个字符则只保留最后30个字符
%-20.30 —— 左对齐,不足20个字符则在信息后面用空格补足,超过30个字符则只保留最后30个字符
2.6 Loggers:日志器,分为跟日志器Root和自定义日志器自定义时需要指定每个Logger的名称name(对于命名可以以包名作为日志的名字,不同的包配置不同的级别等),日志级别level,相加性additivity(是否继承下面配置的日志器), 对于一般的日志器(如Console、File、RollingRandomAccessFile)一般需要配置一个或多个输出源AppenderRef; 每个logger可以指定一个level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定时level默认为ERROR
additivity指定是否同时输出log到父类的appender,缺省为true。
log4j.xml配置样例
<?xml version="1.0" encoding="UTF-8"?>
<!—日志框架本身的日志级别为warn,也就是说不会看到日志框架本身warn以下级别的日志信息-->
<configuration status="WARN">
<Properties>
<!—日志输出格式,不足5个字符时左对齐,比对2.5中对pattern参数的解释来看-->
<Property name="PATTERN_LAYOUT">[search-mobile-web]%d %-5p [%c] %m%n</Property>
<!—日志路径-->
<Property name="LOG_HOME">/data/applogs/search-mobile-web/</Property>
</Properties>
<appenders>
<!—没有filter,表示不过滤,任何级别的日志都匹配-->
<RollingRandomAccessFile
name="rootAppender"
fileName="${LOG_HOME}/root.log"
filePattern="${LOG_HOME}/root_%d{yyyyMMdd}.log">
<PatternLayout pattern="${PATTERN_LAYOUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>
<!—filePattern与TimeBasedTriggerPolicy共同决定了日志的滚动级别,filePattern格式决定滚动的时间、TimeBasedTriggerPolicy决定滚动间隔,比如当前这个配置表示滚动时间为天级别、间隔为1天-->
<RollingRandomAccessFile
name="apiBizAppender"
fileName="${LOG_HOME}/apibiz.log"
filePattern="${LOG_HOME}/apibiz_%d{yyyyMMdd}.log”>
<Filters>
<!—表示不匹配warn级别及以上的,warn级别以下由下一个 filter处理-->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL”/>
<!—表示匹配info级别及以上的,info级别以下不匹配-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${PATTERN_LAYOUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>
<RollingRandomAccessFile
name="apiSysAppender"
fileName="${LOG_HOME}/apisys.log"
filePattern="${LOG_HOME}/apisys_%d{yyyyMMdd}.log">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${PATTERN_LAYOUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>
<RollingRandomAccessFile
name="apiErrAppender"
fileName="${LOG_HOME}/syserror.log"
filePattern="${LOG_HOME}/syserror_%d{yyyyMMdd}.log">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${PATTERN_LAYOUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>
<RollingRandomAccessFile
name="apiQueryAppender"
fileName="${LOG_HOME}/query.log"
filePattern="${LOG_HOME}/query_%d{yyyyMMdd}.log">
<Filters>
<ThresholdFilter level="warn" onMatch=“DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${PATTERN_LAYOUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>
<RollingRandomAccessFile
name="serviceQueryAppender"
fileName="${LOG_HOME}/servicelogs/query.log"
filePattern="${LOG_HOME}/servicelogs/query.log_%d{yyyyMMdd}.log”>
<!—表示仅匹配info级别-->
<Filters>
<ThresholdFilter level="warn" onMatch=“DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${PATTERN_LAYOUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>
<RollingRandomAccessFile
name="serviceErrorAppender"
fileName="${LOG_HOME}/servicelogs/error.log"
filePattern="${LOG_HOME}/servicelogs/error.log_%d{yyyyMMdd}.log">
<Filters>
<ThresholdFilter level=“warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${PATTERN_LAYOUT}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingRandomAccessFile>
</appenders>
<loggers>
<AsyncLogger name="query-monitor" additivity="false" level="info">
<appender-ref ref="serviceQueryAppender"/>
</AsyncLogger>
<AsyncLogger name="service-error-monitor" additivity="false" level="error">
<appender-ref ref="serviceErrorAppender"/>
</AsyncLogger>
<AsyncLogger name="api-biz-monitor" additivity="false" level="warn">
<appender-ref ref="apiBizAppender"/>
</AsyncLogger>
<AsyncLogger name="api-sys-monitor" additivity="false" level="warn">
<appender-ref ref="apiSysAppender"/>
</AsyncLogger>
<AsyncLogger name="sys-error-monitor" additivity="false" level="error">
<appender-ref ref="apiErrAppender"/>
</AsyncLogger>
<AsyncLogger name="query-monitor" additivity="false" level="info">
<appender-ref ref="apiQueryAppender"/>
</AsyncLogger>
<asyncRoot level="info">
<appender-ref ref="rootAppender"/>
</asyncRoot>
</loggers>
</configuration>
//按如上配置生产的日志格式样例
相关jar包配置样例
<!--log4j2依赖-start-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j-api.version}</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.1</version>
</dependency>
<!--log4j2依赖-end-->