开发 - log4j打印两次日志的问题

本文主要讨论了log4j配置中由于设置不当导致日志在控制台和文件中分别输出,从而造成日志重复存储的问题。通过调整logger的additivity属性,避免日志同时发送到root logger,从而解决了日志打印两次的问题。但在开发环境中,这可能导致无法在控制台查看日志,因此建议在开发阶段将root logger的日志级别设为INFO。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<!-- 在log4j的dtd中,明确定义了每个元素的顺序 <!ELEMENT log4j:configuration (renderer*,
throwableRenderer?,appender*,plugin*, (category|logger)*,root?,(categoryFactory|loggerFactory)?)>
如果不按照顺序,启动服务的时候会有警告 -->

<!-- 日志级别 日记记录的优先级priority,优先级由高到低分为 OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG
,ALL。 Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。 -->

<!-- 所有的Appender 记录 -->
<!-- 控制台的Appender 输出 -->
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c{2} %X{traceId}- %m%n" />
</layout>
</appender>
<!-- 文件的输出 -->
<appender name="normal-appender" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Encoding" value="UTF-8" />
<param name="Append" value="true" />
<param name="DatePattern" value="'.'yyyy-MM-dd"></param>
<param name="File"
value="/var/log/java/tradeuser/manager_serv/managerHandler.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c{2} %X{traceId}-%m%n" />
</layout>
</appender>
<!-- eagleye的输出 -->
<appender name="eagleye" class="com.eagleye.client.log4jappender.EagleyeAppender">
<!-- 这里的名称就是eagleye-admin中提到的app , eagleye会按照这个进行约定预警规则的绑定,可以和application name(loom中的)一致 -->
<param name="app" value="managerServApp" />
<layout class="org.apache.log4j.PatternLayout" />
</appender>



<!--loom 和启动日志 没有调用日志 除非发生错误 这里设置的additivity 是 是否传送到上游 root 里面,如果默认或者设置为true 就会传送到Root里面造成打印两次-->
<logger name="com.loom" additivity="false">
<level value="INFO" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="normal-appender" />
</logger>
<!-- 服务启动日志 -->
<logger name="com.manager.controller" additivity="false">
<level value="INFO" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="normal-appender" />
</logger>
<!-- 本地存储的日志格式-->
<logger name="com" additivity="false">
<level value="INFO" />
<appender-ref ref="eagleye" />
<appender-ref ref="normal-appender" />
</logger>




<!-- 所有的错误日志将其输出到 console中 进行查看 -->
<root>
<priority value="ERROR" />
<appender-ref ref="CONSOLE" />
</root>

</log4j:configuration

以上问题主要是因为每次收集的日志还会上传到console的控制台输出一份,不止在本地文件进行输出,还在控制台输出,运维对我们的日志是完全备份的,这样就带来了,重复日志存储两份的情况,所以使用这种方式进行优化。
但是也会带来不好的地方,不好的地方就是,在开发的时候看不到控制台输出的日志了,建议在开发的时候吧root的 权限改为info
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值