千家信息网

基于log4j2.properties踩坑与填坑的示例分析

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍基于log4j2.properties踩坑与填坑的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!log4j2.properties踩坑与填坑日志配置门面
千家信息网最后更新 2026年11月04日基于log4j2.properties踩坑与填坑的示例分析

这篇文章主要介绍基于log4j2.properties踩坑与填坑的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

log4j2.properties踩坑与填坑

日志配置

门面模式:slf4j

日志库:log4j2

引入依赖:compile('org.springframework.boot:spring-boot-starter-log4j2:2.0.4.RELEASE')

采坑

启动Application时,出现Multiple bindings were found on the class path的问题

  • 坑点:没有排除对默认logback的依赖

  • 填坑:在build.gradle中加入:

configurations {    compile.exclude module: 'spring-boot-starter-logging'}

启动后,没有按照配置好的格式输出

  • 坑点:没有在application.[yml|properties]中声明配置文件的路径

  • 填坑:在application.yml中加入

#指定log4j2配置文件的位置与名称logging:  config: classpath:log4j2.properties

格式化日志输出参数

  • %m 输出代码中指定的消息

  • %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL

  • %r 输出自应用启动到输出该log信息耗费的毫秒数

  • %c 输出所属的类目,通常就是所在类的全名

  • %t 输出产生该日志事件的线程名

  • %n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n"

  • %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921

  • %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

  • %F 输出日志消息产生时所在的文件名称

  • %L 输出代码中的行号

  • %x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中

  • %% 输出一个"%"字符

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:

  • %5c: 输出category名称,最小宽度是5,category<5,默认的情况下右对齐

  • %-5c:输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格

  • %.5c:输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格

  • %20.30c:category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

记录一份自己的配置文件

实现控制台打印,以及基于时间和基于文件大小的本地保存策略。

name=PropertiesConfig# 定义变量。指定日志文件的位置和文件名称,以便记录多份日志时,直接引用property.fileName=qiyinzoneproperty.fileDir=./logsproperty.filePath=${fileDir}/${fileName}.logappenders=console, rolling # rootLogger, 根记录器,所有记录器的父辈# 指定根日志的级别rootLogger.level=info# 指定输出的appender引用rootLogger.appenderRef.stdout.ref=StdoutrootLogger.appenderRef.rolling.ref=InfoRollingFile # console# 指定输出源的类型与名称appender.console.type=Consoleappender.console.name=Stdoutappender.console.layout.type=PatternLayout# 输出模板appender.console.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue} # rolling fileappender.rolling.type=RollingFileappender.rolling.name=InfoRollingFileappender.rolling.fileName=${filePath}# 指定当发生Rolling时,文件的转移和重命名规则appender.rolling.filePattern=${fileDir}/${fileName}_%d{yyyy-MM-dd}_%i.logappender.rolling.layout.type=PatternLayoutappender.rolling.layout.pattern=%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}# 指定记录文件的封存策略,该策略主要是完成周期性的日志文件封存工作appender.rolling.policies.type=Policies# 基于时间的触发策略appender.rolling.policies.time.type=TimeBasedTriggeringPolicy# 当前记录周期为每1h生成一个文件appender.rolling.policies.time.interval=1appender.rolling.policies.time.modulate=true# 基于日志文件体积的触发策略appender.rolling.policies.size.type=SizeBasedTriggeringPolicy# 当日志文件体积大于size指定的值时,触发Rollingappender.rolling.policies.size.size=20M# 文件封存的覆盖策略appender.rolling.strategy.type=DefaultRolloverStrategy# 生成分割(封存)文件的个数appender.rolling.strategy.max=100

打印效果

打印时,对不同level的日志定义了不同的字体颜色,方便定位。

%highlight{%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] - %m%n}{FATAL=white, ERROR=red, WARN=blue, INFO=Green, DEBUG=Yellow, TRACE=blue}

Log4j2 properties配置文件

原工作组比较清闲,被临时借调到新的工作组。组长给了个任务是把Log4j的XML配置文件改成properties,原因是XML格式的看着不舒服。哈,以上不算吐槽,只是交待一下,为什么我要这么费劲的使用properties做配置文件。

Log4j2 一开始抛弃了properties配置文件格式,到2.4版本时,又开始支持properties配置文件格式。到2.6版本又有新的要求。我用的是写本文时的最近版本2.8

status = errorproperty.LOG_HOME=/output/logsproperty.BACKUP_HOME=backupproperty.SERVER_NAME=buddie-Serviceproperty.EVERY_FILE_SIZE=10Mproperty.OUTPUT_LOG_LEVEL=INFOproperty.FILE_MAX=10appender.console.type = Consoleappender.console.name = STDOUTappender.console.layout.type = PatternLayoutappender.console.layout.pattern = %m%nappender.rolling.type=RollingFileappender.rolling.name=RollingFileAllappender.rolling.filter.threshold.level = traceappender.rolling.filter.threshold.type = ThresholdFilterappender.rolling.fileName=${LOG_HOME}/dev_${SERVER_NAME}_all.logappender.rolling.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_all.%d{yyyy-MM-dd-HH}.logappender.rolling.layout.type=PatternLayoutappender.rolling.layout.pattern=%d %p %C{1.} [%t] %m%nappender.rolling.policies.type=Policiesappender.rolling.policies.time.type=TimeBasedTriggeringPolicyappender.rolling.policies.time.interval=2appender.rolling.policies.time.modulate=trueappender.rolling.policies.size.type=SizeBasedTriggeringPolicyappender.rolling.policies.size.size=${EVERY_FILE_SIZE}appender.rolling.strategy.type=DefaultRolloverStrategyappender.error.type=RollingFileappender.error.name=RollingFileErrorappender.error.filter.threshold.level = errorappender.error.filter.threshold.type = ThresholdFilterappender.error.fileName=${LOG_HOME}/dev_${SERVER_NAME}_error.logappender.error.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_error.%d{yyyy-MM-dd-HH}.logappender.error.layout.type=PatternLayoutappender.error.layout.pattern=%d %p %C{1.} [%t] %m%nappender.error.policies.type=Policiesappender.error.policies.time.type=TimeBasedTriggeringPolicyappender.error.policies.time.interval=2appender.error.policies.time.modulate=trueappender.error.policies.size.type=SizeBasedTriggeringPolicyappender.error.policies.size.size=${EVERY_FILE_SIZE}appender.error.strategy.type=DefaultRolloverStrategyappender.charge.type=RollingFileappender.charge.name=RollingFileChargeappender.charge.filter.threshold.level = traceappender.charge.filter.threshold.type = ThresholdFilterappender.charge.fileName=${LOG_HOME}/dev_${SERVER_NAME}_charge.logappender.charge.filePattern=${LOG_HOME}/dev_${BACKUP_HOME}/dev_${SERVER_NAME}_charge.%d{yyyy-MM-dd-HH}.logappender.charge.layout.type=PatternLayoutappender.charge.layout.pattern=%d %p %C{1.} [%t] %m%nappender.charge.policies.type=Policiesappender.charge.policies.time.type=TimeBasedTriggeringPolicyappender.charge.policies.time.interval=2appender.charge.policies.time.modulate=trueappender.charge.policies.size.type=SizeBasedTriggeringPolicyappender.charge.policies.size.size=${EVERY_FILE_SIZE}appender.charge.strategy.type=DefaultRolloverStrategylogger.activity.name = buddie.activitylogger.activity.level = debuglogger.activity.additivity = falselogger.activity.appenderRef.all.ref = RollingFileAlllogger.activity.appenderRef.error.ref = RollingFileErrorlogger.activity.appenderRef.stdout.ref = STDOUTlogger.login.name = buddie.loginlogger.login.level = debuglogger.login.additivity = falselogger.login.appenderRef.all.ref = RollingFileAlllogger.login.appenderRef.error.ref = RollingFileErrorlogger.login.appenderRef.stdout.ref = STDOUTlogger.charge.name = buddie.chargelogger.charge.level = tracelogger.charge.additivity = falselogger.charge.appenderRef.all.ref = RollingFileAlllogger.charge.appenderRef.error.ref = RollingFileErrorlogger.charge.appenderRef.charge.ref = RollingFileChargelogger.charge.appenderRef.stdout.ref = STDOUTrootLogger.level = inforootLogger.appenderRef.stdout.ref = STDOUTrootLogger.appenderRef.all.ref = RollingFileAllrootLogger.appenderRef.error.ref = RollingFileError

以上是"基于log4j2.properties踩坑与填坑的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

输出 文件 日志 配置 名称 格式 策略 字符 宽度 时间 线程 最小 代码 位置 版本 工作 示例 分析 不同 最大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技有限公司经营范围 金诺互联网科技 时间互联网络科技 苏州大垚互联网科技 互联网金融和金融科技 盛创互联网科技有限公司 互联网科技素材视频竖屏 华中科技有哪些互联网大佬 互联网汽车科技小镇 华服互联网科技官网 福建科技产业互联网发展 广西互联网科技孵化中心 四川慕妮娅互联网科技有限公司 互联网与数字科技关系 江苏互联网科技小贷 山东大美朱楼互联网科技有限公司 信承诺互联网科技有限公司 互联网科技职业技能培训学校 青岛互联网科技园 知域互联网科技有限公司官网 互联网科技公司 深圳市人人互联网科技有限公司 互联网科技公司有哪些 科技类的互联网平台 顺网科技2021年互联网排名 晓花互联网科技有限公司网址 互联网科技公司有风险吗 互联网数据科技专业 互联网科技和医药行业 山东亿川互联网科技有限责任公司
0