Mr.*_*r.Q 28 logging logback slf4j
有什么方法可以覆盖logback配置吗?我知道我们在名为logback.xml的文件中定义了logback配置(通常存储在src/resources路径中),我知道通过使用<include>tag我们可以设置一个外部文件添加到logback.xml,如下所示:
<configuration>
<!--<include url="file:///d:/ServerConfig.xml"/>-->
<include file="${outPut}/ServerConfig.xml"/>
<logger name="Server" LEVEL="DEBUG">
<appender-ref ref="FILEOUT" />
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<!--<appender-ref ref="FILEOUT" />-->
</root>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是如果我想覆盖这个默认配置怎么办(例如设置根记录器,级别为INFO)
顺便说一下这里是包含的文件:
<included>
<!-- <property file="d:/ServerSysVar.properties"/>-->
<property file="${outPut}/ServerSysVar.properties"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILEOUT" class="ch.qos.logback.core.FileAppender">
<file>${Sys_Location}/Serverfile4.log</file>
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %class{36}.%M %L CLIENT_PORT:%X{ClientPort}- %msg%n</pattern>
</encoder>
</appender>
<logger name="Service" LEVEL="DEBUG">
<appender-ref ref="FILEOUT" />
</logger>
<root>
<appender-ref ref="STDOUT" />
<!-- <appender-ref ref="FILEOUT" />-->
</root>
</included>
Run Code Online (Sandbox Code Playgroud)
Han*_*ank 23
我认为你不能覆盖logback.xml包含文件中的定义.
但我有一种方法可以解决关于覆盖root-logger级别的问题,使用默认值的变量替换:
logback.xml
<configuration>
<include file="includedFile.xml" />
<!-- STDOUT appender stuff -->
<root level="${root.level:-DEBUG}">
<appender-ref ref="STDOUT" />
</root>
<configuration>
Run Code Online (Sandbox Code Playgroud)
includedFile.xml
<included>
<!-- override the default value; or comment out to leave it at default -->
<property name="root.level" value="INFO" />
</included>
Run Code Online (Sandbox Code Playgroud)
有了这个概念,我甚至可以从包含的文件中控制输出到多个appender:
logback.xml
<configuration>
<include file="includedFile.xml" />
<!-- STDOUT appender stuff -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${file.level:-ALL}</level>
</filter>
<file>/path/to/logfeil.log</file>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${syslog.level:-OFF}</level>
</filter>
<syslogHost>localhost</syslogHost>
<facility>${syslog.facility:-LOCAL1}</facility>
<suffixPattern>${syslog.pattern:-[%thread] %logger{36} - %msg}</suffixPattern>
</appender>
<logger name="my.package" level="${logging.level:-INFO}" additivity="false">
<appender-ref ref="FILE" />
<appender-ref ref="SYSLOG" />
</logger>
<root level="${root.level:-DEBUG}">
<appender-ref ref="STDOUT" />
</root>
<configuration>
Run Code Online (Sandbox Code Playgroud)
并且在includedFile.xml我可以控制消息是否以及在什么级别消息将通过appender FILE并SYSLOG设置属性file.level,syslog.level当然logging.level.
小智 5
我遇到了类似的问题,这个答案似乎是最好的方法。
就我而言,我需要覆盖包含的文件以完全关闭其中一个附加程序。
使用变量作为日志级别值,可以将其更改为 OFF。
<included>
(...)
<root level="${root.level.console:-DEBUG}">
<appender-ref ref="CONSOLE" />
</root>
<root level="${root.level.file:-DEBUG}">
<appender-ref ref="FILE" />
</root>
</included>
Run Code Online (Sandbox Code Playgroud)
如http://logback.qos.ch/manual/configuration.html#rootElement中所述
<configuration>
<include resource="base.xml" />
(...)
<property name="root.level.console" value="OFF" />
</configuration>
Run Code Online (Sandbox Code Playgroud)