在项目中,我有一堆业务日志需要打印,另一部分的日志,是没有格式的,需要被云平台离线解析并收集到kafka或者hdfs、hive等,需要将日志隔离打印到不同的文件
正常的log4j配置是下面这样的,配合@Sl4j直接使用默认的log.info()打印日志,会汇总到web.log中;
如果是其他的logger,则需要:
private Logger dumpLog = LoggerFactory.getLogger("dump_logger");
yml
Configuration:
status: info
monitorInterval: 30
properties:
property:
name: log.path
value: /opt/mnt/web/logs
Appenders:
RollingFile:
- name: error_file
# 清除策略
DefaultRolloverStrategy:
# 删除的触发条件
Delete:
# 要删除扫描的文件夹
basePath: ${log.path}
# 限定扫描的文件名
IfFileName:
# 匹配规则 以log结尾的
glob: "*log"
# 文件的最新的修改时间间隔
IfLastModified:
# 1s 表示1秒前 7d表示7天
age: 7d
fileName: ${log.path}/error.log
filePattern: "${log.path}/error_%d{yyyy-MM-dd}.log"
PatternLayout:
Pattern: "[%X{request_id}] %-d{yyyy-MM-dd HH:mm:ss.SSS} - [%p] [%C{1} %M] %m%n"
Policies:
TimeBasedTriggeringPolicy:
interval: 1
modulate: true
- name: web_file
# 清除策略
DefaultRolloverStrategy:
# 删除的触发条件
Delete:
# 要删除扫描的文件夹
basePath: ${log.path}
# 限定扫描的文件名
IfFileName:
# 匹配规则 以log结尾的
glob: "*log"
# 文件的最新的修改时间间隔
IfLastModified:
# 1s 表示1秒前 7d表示7天
age: 7d
fileName: ${log.path}/web.log
filePattern: "${log.path}/web_%d{yyyy-MM-dd}.log"
PatternLayout:
Pattern: "[%X{request_id}] %-d{yyyy-MM-dd HH:mm:ss.SSS} - [%p] [%C{1} %M] %m%n"
Policies:
TimeBasedTriggeringPolicy:
interval: 1
modulate: true
- name: dump_appender
# 清除策略
DefaultRolloverStrategy:
# 删除的触发条件
Delete:
# 要删除扫描的文件夹
basePath: ${log.path}
# 限定扫描的文件名
IfFileName:
# 匹配规则 以log结尾的
glob: "*log"
# 文件的最新的修改时间间隔
IfLastModified:
# 1s 表示1秒前 7d表示7天
age: 7d
fileName: ${log.path}/dump/dump_log.log
filePattern: "${log.path}/dump_log%d{yyyy-MM-dd}.log"
PatternLayout:
Pattern: "%m%n%ex"
Policies:
TimeBasedTriggeringPolicy:
interval: 1
modulate: true
Console:
name: console
target: SYSTEM_OUT
PatternLayout:
Pattern: "[%X{request_id}] %-d{yyyy-MM-dd HH:mm:ss} - [%p] [%C{1} %M] %m%n"
Loggers:
Root:
level: info
AppenderRef:
- ref: error_file
level: ERROR
- ref: web_file
level: INFO
- ref: console
level: debug
Logger:
- name: dump_logger
level: info
AppenderRef:
- ref: dump_appender
level: INFO
算法同学希望单独在dump.log中进行日志打印,而后他们去配置采集的逻辑,发现web.log居然也有dump.log的日志,重复打印了;
关键代码:additivity
shell
Logger:
- name: dump_logger
level: info
additivity: false
AppenderRef:
- ref: dump_appender
level: INFO
指定了包的日志输出,又指定了这个包下面子包的日志输出,如果在子包的定义标签上加上additivity=false,那么子包中的日志不会打印在父包中,只会在子包中输出