log4j2配置文件学习笔记:
说明1:本文主要针对yml配置,其他xml配置或者json配置。
说明2:下面是大致介绍了结构,什么作用,当然还有其他分类,比如:logger,AsyncLogger | appenders fileAppenders | rollingFile,rollingRandomAccessFile这些不同的分类和里面具体的参数设置。见官网,官网写的非常好: log4j2官网
yaml格式可以参考:YAML语法入门
大致配置(比较长,看有注释的就可以,没注释的大致都相同):
Configuration:
status: warn
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
properties: #自定义一些常量,之后使用${变量名}引用
property:
# 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符
# %d{HH:mm:ss.SSS}——日志输出时间
# %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
# %-5level——日志级别,并且使用5个字符靠左对齐
# %logger- ——日志输出者的名字
# %msg——日志消息
# %n——平台的换行符
- name: LOG_FILE_SIZE #名字
value: 500MB #值
- name: FILE_PATH
value: ${sys:logPath}
#appenders:定义输出内容,输出格式,输出方式,日志保存策略等,常用其下三种标签[console,File,RollingFile]。appenders有哪些分类,见下图
appenders:
#console :控制台输出的配置
Console:
name: CONSOLE
target: SYSTEM_OUT
#PatternLayout :输出日志的格式,LOG4J2定义了输出代码,详见第二部分
PatternLayout:
charset: UTF-8
Pattern: '[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n'
#过滤器,后面详细介绍几类过滤器
ThresholdFilter:
level: info #过滤器等级
onMatch: ACCEPT #匹配 ACCEPT:接收,DENY:直接拒绝,NEUTRAL:中立,放过,有后面过滤器处理
onMismatch: DENY #不匹配
SMTP: #邮件发送日志
name: Mail
subject: "ERROR等级日志" #邮件标题
to: [email protected] #发给1,发给2,发给3,....
cc: [email protected] #抄送给谁,多个就逗号分开
from: [email protected] #发送的邮件
smtpHost: smtp.qq.com #发送邮箱服务器
smtpHost: 25 #邮箱端口
smtpProtocol: smtp #协议
smtpUsername: zhanbei #发送名称
smtpPassword: 123456 #发送者的密码,开启SMTP时候的那一串密码
smtpDebug: false #是否开启发送邮箱调试模式
bufferSize: 1024 #缓存区大小
filter: #过滤器,稍后详解
RollingRandomAccessFile: #也有RollingFile,日志滚动策略配置,RollingRandomAccessFile标识有缓存的日志滚动。
-
name: ROLLING_FILE_INFO #策略名称
fileName: ${FILE_PATH}info.log # 日志文件
filePattern: ${FILE_PATH}info-%d{yyyy-MM-dd}_%i.log.gz #指定当发生Rolling时,文件的转移和重命名规则
PatternLayout: #配置日志打印格式化内容
charset: UTF-8 #编码
Pattern: '%highlight{%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n}{INFO=bright white}'
#格式,具体%logger,%level表示的是啥,有啥,见官方文档
ThresholdFilter: #配置过滤器,过滤器类型见后面
level: info #等级
onMatch: ACCEPT #匹配后,决定
onMismatch: DENY #不匹配后策略
Policies: #Policies :日志滚动策略
TimeBasedTriggeringPolicy: #时间滚动策略
interval: 1 #时间间隔,1s
SizeBasedTriggeringPolicy: #文件大小滚动策略
size: ${LOG_FILE_SIZE} #文件大小滚动
DefaultRolloverStrategy: #默认滚动策略,同个文件夹中允许最多日志文件
max: 30 # DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置30个
-
name: ROLLING_FILE_ERROR
fileName: ${FILE_PATH}error.log
filePattern: ${FILE_PATH}error-%d{yyyy-MM-dd}_%i.log.gz
PatternLayout:
charset: UTF-8
Pattern: '%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%rEx%n}{INFO=bright white}'
ThresholdFilter:
level: error
onMatch: ACCEPT
onMismatch: DENY
Policies:
TimeBasedTriggeringPolicy:
interval: 1
SizeBasedTriggeringPolicy:
size: ${LOG_FILE_SIZE}
DefaultRolloverStrategy:
max: 30
-
name: ROLLING_P_FILE
fileName: ${FILE_PATH}p.log
filePattern: ${FILE_PATH}pay-%d{yyyy-MM-dd}_%i.log.gz
PatternLayout:
charset: UTF-8
Pattern: '%highlight{%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - %msg%n}{INFO=bright white}'
ThresholdFilter:
level: info
onMatch: ACCEPT
onMismatch: DENY
Policies:
TimeBasedTriggeringPolicy:
interval: 1
SizeBasedTriggeringPolicy:
size: ${LOG_FILE_SIZE}
DefaultRolloverStrategy:
max: 30
- #用户登录日志
name: ROLLING_ACCESS_LOG_FILE
fileName: ${FILE_PATH}access.log
filePattern: ${FILE_PATH}access-%d{yyyy-MM-dd}_%i.log.gz
PatternLayout:
charset: UTF-8
Pattern: '%highlight{%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{10} %class{36} %L %M - %msg%n}{INFO=bright white}'
ThresholdFilter:
level: info
onMatch: ACCEPT
onMismatch: DENY
Policies:
TimeBasedTriggeringPolicy:
interval: 1
SizeBasedTriggeringPolicy:
size: ${LOG_FILE_SIZE}
DefaultRolloverStrategy:
max: 30
- #第三方调用日志
name: ROLLING_THIRDPART_LOG_FILE
fileName: ${FILE_PATH}thirdpart.log
filePattern: ${FILE_PATH}thirdpart-%d{yyyy-MM-dd}_%i.log.gz
PatternLayout:
charset: UTF-8
Pattern: '%highlight{%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{10} %class{36} %L %M - %msg%n}{INFO=bright white}'
ThresholdFilter:
level: info
onMatch: ACCEPT
onMismatch: DENY
Policies:
TimeBasedTriggeringPolicy:
interval: 1
SizeBasedTriggeringPolicy:
size: ${LOG_FILE_SIZE}
DefaultRolloverStrategy:
max: 30
#
#
#
Loggers: #定义logger
AsyncLogger: #定义异步logger,Logger:是同步的。异步会提高代码性能,单独建立一个进程,进行日志打印和管理。这个线程由disruptor管理。disruptor要单独pom引入
- name: org.apache.kafka #名称,可以使报名,类路径,直接可以作用在该类上或者某一包下所有的类。如果自定义名称如:name:wangdacui,在springboot中@slf4h(topic="wangdacui"),就可以用了。
additivity: false
#是否重复,默认true,设置false,这表示在root定义日志记录器,不再重复打印。
#所有自定义的logger都是集成root里面的,所以默认会在root打印后再在自定义的logger中打印,
#additivity:false 标识和root日志记录器断绝关系。
level: ERROR #定义日志记录器记录日志等级
#Logger节点用来单独指定日志的形式,name为包路径,比如要为org.springframework包下所有日志指定为INFO级别等
- name: cn.itsource
additivity: false
- name: AccessLog
level: info
additivity: false
AppenderRef:
ref: ROLLING_ACCESS_LOG_FILE
- name: ThirdPartLog
level: info
additivity: false
AppenderRef:
ref: ROLLING_THIRDPART_LOG_FILE
Root: #设置根节点日志记录器,和自定义日志记录器模式一样
level: info
AppenderRef:
- ref: ROLLING_FILE_INFO
- ref: ROLLING_FILE_ERROR
appenders类型:
- FileAppender 普通地输出到本地文件
- FlumeAppender 将几个不同源的日志汇集、集中到一处
- RewriteAppender 对日志事件进行掩码或注入信息
- RollingFileAppender 对日志文件进行封存
- RoutingAppender 在输出地之间进行筛选路由
- SMTPAppender 将LogEvent发送到指定邮件列表
- SocketAppender 将LogEvent以普通格式发送到远程主机
- SyslogAppender 将LogEvent以RFC 5424格式发送到远程主机
- AsynchAppender 将一个LogEvent异步地写入多个不同输出地
- ConsoleAppender 将LogEvent输出到控制台
- FailoverAppender 维护一个队列,系统将尝试向队列中的Appender依次输出LogEvent,直到有一个成功为止。
Filter类型:
过滤器名称 | 说明 | 是否常用 |
---|---|---|
StringMatchFilter | 如果格式化后(即:最终)的日志信息中包含${指定的字符串},则onMatch,否则onMismatch即: msg.contains(this.text) ? onMatch : onMismatch; | 是 |
LevelRangeFilter | 若${maxLevel} <= 日志级别 <= ${minLevel}, 则onMatch,否则onMismatch如: 即为只记录日志info及warn级别的日志。 | 是 |
RegexFilter | 如果日志信息匹配${指定的正则表达式},则onMatch,否则onMismatch 注:可通过useRawMsg属性来控制这个日志信息是格式化处理后(即:最终)的日志信息,还是格式化处理前(即:代码中输入)的日志信息 | 是 |
ThresholdFilter | 若日志级别 >= ${指定的日志级别}, 则onMatch,否则onMismatch | 是 |
LevelMatchFilter | 如果日志级别等于${指定的日志级别},则onMatch,否则onMismatch | 是 |
ThreadContextMapFilter | 通过context(可以理解为一个Map)中对应的key-value值进行过滤注:上下文默认是ThreadContext,也可以自定义使用ContextDataInjectorFactory配置ContextDataInjector来指定。 | 是 |
DynamicThresholdFilter | 若上下文中包含指定的key,则触发DynamicThresholdFilter生效;若该key对应的value值等于任意一个我们指定的值,那么针对本条日志,可记录日志级别的约束下限调整为指定的级别 注:上下文默认是ThreadContext,也可以自定义使用ContextDataInjectorFactory配置ContextDataInjector来指定。 示例说明: 有以下情况: 情况一:存在键loginRole,假设从上下文(可以理解为一个Map)中取出来的对应的值为user,那么此时,对于日志级别大于等于warn的日志,会走onMatch;其它的日志级别走onMismatch。 情况二:存在键loginRole,假设从context(可以理解为一个Map)中取出来的对应的值为admin,那么此时,对于日志级别大于等于debug的日志,会走onMatch;其它的日志级别走onMismatch。 情况三:【上下文(可以理解为一个Map)中,不存在键loginRole】或【存在键loginRole,但从日志上下文中取出来的值(假设)为abc, 没有对应的KeyValuePair配置】,那么此时 |
是 |
CompositeFilter | 组合过滤器,即:按照xml配置中的配置,一个过滤器一个过滤器的走,如果在这过程中,任意一个过滤器ACCEPT或DENY了,那么就不会往后走了,直接返回对应的结果。 | 是 |
TimeFilter | 如果记录日志时的当前时间落在每天指定的时间范围[start, end]内,则onMatch,否则onMismatch 如: |
是 |
ScriptFilter | 是否匹配取决于指定的脚本返回值是否为true | 是 |
DenyAllFilter | This filter causes all logging events to be dropped | 是 |
BurstFilter | 对低于或等于${指定日志级别}的日志,进行限流控制 | 是 |
NoMarkerFilter | 如果从对应事件对象获取(LogEvent#getMarker)到的marker为null, 则onMatch,否则onMismatch | 是 |
MarkerFilter | 如果从对应事件对象获取(LogEvent#getMarker)到的marker的name值为等于${指定的值}, 则onMatch,否则onMismatch | 是 |
MapFilter | The MapFilter allows filtering against data elements that are in a MapMessage. 注:需要使用org.apache.logging.log4j.Loggerj进行记录,且记录org.apache.logging.log4j.message.MapMessage日志,才会生效。 注:因为暂时不兼容Slf4j这里不多作说明 |
是 |
StructuredDataFilter | The StructuredDataFilter is a MapFilter that also allows filtering on the event id, type and message. 注:需要使用org.apache.logging.log4j.Loggerj进行记录,且记录org.apache.logging.log4j.core.filter.StructuredDataFilter日志,才会生效。 注:因为暂时不兼容Slf4j这里不多作说明 |
是 |
...... | ..... | ...... |
备注:关于各种filter的配置参数见:官网filter介绍
springboot+slf4j+log4j2+yaml中使用:主要是@slf4j(topic="自定义的logger name")。
其实@slf4j注解就是实现:
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
//或者
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger("自定义logger 的名称");