[英]Different log files using Logback
I would like to log different log levels to different files , In addition to this I would like to have the default consoleAppender as well for each log level. 我想将不同的日志级别记录到不同的文件中,除此之外,我还希望每个日志级别都具有默认的consoleAppender。
So the output should be different log level files : 因此输出应为不同的日志级别文件:
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<charset>UTF-8</charset>
<pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{35}) - %msg %n</pattern>
</encoder>
</appender>
<!-- Logging settings for the info logs -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
</filter>
<file>logs\logFile.html</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logs\logFile.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 50MB -->
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 60 days' worth of history -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<charset>UTF-8</charset>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern>
</layout>
</encoder>
</appender>
<!-- Logging settings for the error logs -->
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
</filter>
<file>logs\logFileError.html</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logs\logFileError.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 50MB -->
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 60 days' worth of history -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<charset>UTF-8</charset>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern>
</layout>
</encoder>
</appender>
<!-- Logging settings for the warn logs -->
<appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
</filter>
<file>logs\logFileWarn.html</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logs\logFileWarn.%d{yyyy-MM-dd}.%i.html</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 50MB -->
<maxFileSize>5MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- keep 60 days' worth of history -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<charset>UTF-8</charset>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern>
</layout>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<root level="error">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILEERROR" />
</root>
<root level="warn">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILEWARN" />
</root>
</configuration>
The problem here is it writes each type of level in all files. 这里的问题是它将所有类型的级别写入所有文件。
Update the filter definitions to include: <onMismatch>DENY</onMismatch>
, for example: 更新过滤器定义以包括:
<onMismatch>DENY</onMismatch>
,例如:
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
The default behaviour for onMismatch
is FilterReply.NEUTRAL
so by not including a onMismatch
declaration you are effectively allowing all entries through the filter whether they match the given level or not. onMismatch
的默认行为是FilterReply.NEUTRAL
因此通过不包含onMismatch
声明,可以有效地允许所有条目通过过滤器,无论它们是否与给定级别匹配。
You should also remove the multiple <root>
declarations and replace them with this one: 您还应该删除多个
<root>
声明,并将其替换为此:
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
<appender-ref ref="FILEWARN" />
<appender-ref ref="FILEERROR" />
</root>
This declaration will cause all four of those appenders to be running and then the filter within each of the FILE
, FILEWARN
and FILEERROR
appenders will ensure that they only handle log events of the correct level. 此声明将导致所有这四个附加程序都在运行,然后每个
FILE
, FILEWARN
和FILEERROR
附加程序中的过滤器将确保它们仅处理正确级别的日志事件。
This is what I have done , and it is working. 这是我所做的,并且正在工作。
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder> <charset>UTF-8</charset> <pattern>%d{HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{35}) - %msg %n</pattern> </encoder> </appender> <!-- Logging settings for the info logs --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <file>logs\\logFile.html</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>logs\\logFile.%d{yyyy-MM-dd}.%i.html</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 50MB --> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!-- keep 60 days' worth of history --> <maxHistory>60</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <charset>UTF-8</charset> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern> </layout> </encoder> </appender> <!-- Logging settings for the error logs --> <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <file>logs\\logFileError.html</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>logs\\logFileError.%d{yyyy-MM-dd}.%i.html</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 50MB --> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!-- keep 60 days' worth of history --> <maxHistory>60</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <charset>UTF-8</charset> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern> </layout> </encoder> </appender> <!-- Logging settings for the warn logs --> <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>WARN</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <file>logs\\logFileWarn.html</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- daily rollover --> <fileNamePattern>logs\\logFileWarn.%d{yyyy-MM-dd}.%i.html</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- or whenever the file size reaches 50MB --> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!-- keep 60 days' worth of history --> <maxHistory>60</maxHistory> </rollingPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <charset>UTF-8</charset> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%d{HH:mm:ss.SSS}%thread%level%logger%line%msg</pattern> </layout> </encoder> </appender> <root level="debug"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> <appender-ref ref="FILEERROR" /> <appender-ref ref="FILEWARN" /> </root> <!-- <root level="info"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILE" /> </root> <root level="error"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILEERROR" /> </root> <root level="warn"> <appender-ref ref="STDOUT" /> <appender-ref ref="FILEWARN" /> </root> --> </configuration>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.