Java 日志记录器日志记录两次
我想在我的应用程序中使用slf4j+logback有两个目的——日志和审计 对于日志记录,我使用常规方式记录:Java 日志记录器日志记录两次,java,slf4j,logback,Java,Slf4j,Logback,我想在我的应用程序中使用slf4j+logback有两个目的——日志和审计 对于日志记录,我使用常规方式记录: static final Logger logger = LoggerFactory.getLogger(Main.class); logger.debug("-> main()"); 为了进行审计,我创建了一个特殊的命名记录器并记录到其中: static final Logger logger = LoggerFactory.getLogger("
static final Logger logger = LoggerFactory.getLogger(Main.class);
logger.debug("-> main()");
为了进行审计,我创建了一个特殊的命名记录器并记录到其中:
static final Logger logger = LoggerFactory.getLogger("AUDIT_LOGGER");
Object[] params =
{ new Integer(1) /* TenantID */, new Integer(10) /* UserID */, msg};
logger.info("{}|{}|{}", params);
回写配置:
<logger name="AUDIT_LOGGER" level="info">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS}|%msg%n
</pattern>
</encoder>
</appender>
</logger>
<root level="all">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
</root>
%d{HH:mm:ss.SSS}|%msg%n
%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n
问题:
通过audit logger记录的消息显示两次-一次在audit_logger下,一次在root logger下
14:41:57.975[main]DEBUG com.gammay.example.main-->main()
14:41:57.978 | 1 | 10 |欢迎来到梅因
14:41:57.978[main]信息审计记录程序-1 | 10 |欢迎来到main
如何确保审核消息仅在审核日志下显示一次?更改审核日志定义,如下所示。注意记录器定义中的
additivity=“false”
标志
<logger name="AUDIT_LOGGER" level="info" additivity="false">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS}|%msg%n
</pattern>
</encoder>
</appender>
</logger>
%d{HH:mm:ss.SSS}|%msg%n
这将避免在根记录器中再次记录此日志。有关更多信息,请阅读logback配置文档。我遇到了相同的问题,但我认为正确的解决方案不同于此处通过添加性提出的解决方案。所附图表试图直观显示两种不会导致重复日志的方法:
,您还可以添加一个解决方案:
将additivity=“false”
添加到“审核日志记录程序”
,如上面的一个答案所述,以不从根日志记录程序继承附加程序
从“审核日志程序”
中删除追加器
元素。这将导致“AUDIT\u LOGGER”
从根
记录器继承附加器
小心包含其他配置文件,这也可能导致重复日志记录。在我的例子中,我必须删除base.xml
include块,它定义了根记录器和附加器
关闭审计记录器上的可加性。@RaviH抱歉,您能解释一下吗?您的意思是删除审核记录器的appender吗?
<include resource="org/springframework/boot/logging/logback/base.xml">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS}|%msg%n</pattern>
</encoder>
</appender>
<logger name="AUDIT_LOGGER" level="info" additivity="false">
<appender-ref ref="STDOUT" />
</logger>