以下是两个Logback配置文件的主要区别,用表格形式列出:
区别点 | 文件1 | 文件2 |
---|---|---|
ADMIN Logger的additivity 属性 |
additivity="false" (日志不会传递给父Logger) |
未设置additivity 属性(默认值为true ,日志会传递给父Logger) |
root Logger的appender-ref |
仅包含FILEERROR 、FILEWARN 、FILEINFO 和STDOUT |
包含FILEERROR 、FILEWARN 、FILEINFO 、STDOUT 和ADMIN |
INFO Appender的rollingPolicy 配置 |
包含多余的> 符号( ) |
无多余符号( ) |
ADMIN Logger的配置 |
明确指定additivity="false" |
未指定additivity 属性,默认值为true |
ADMIN
Logger的additivity
属性:
ADMIN
Logger的additivity
属性设置为false
,表示日志不会传递给父Logger(即root
Logger)。ADMIN
Logger未设置additivity
属性,默认值为true
,表示日志会传递给父Logger。root
Logger的appender-ref
:
root
Logger仅引用了FILEERROR
、FILEWARN
、FILEINFO
和STDOUT
。root
Logger额外引用了ADMIN
,这意味着ADMIN
的日志会同时输出到ADMIN
Appender和root
Logger的其他Appender。INFO
Appender的rollingPolicy
配置:
INFO
Appender的rollingPolicy
配置多了一个多余的>
符号,这是一个语法错误。INFO
Appender的rollingPolicy
配置正确,没有多余的符号。ADMIN
Logger的配置:
ADMIN
Logger明确指定了additivity="false"
,确保日志不会传递给父Logger。ADMIN
Logger未指定additivity
属性,日志会传递给父Logger。>
符号)。ADMIN
Logger的日志会传递给父Logger,而文件1中不会。root
Logger额外引用了ADMIN
Appender,可能会导致日志重复输出,具体取决于业务需求是否需要。好的,明白了。如果你在控制台没有看到 loggerAdmin.info()
的日志,结合我们之前的分析,以及你提供的信息,我们可以更精确地定位问题:
问题核心:ADMIN
logger 的 additivity="false"
配置,以及 root
logger 没有配置 ADMIN
appender。
以下是更详细的解释:
ADMIN
Logger 配置:
additivity="false"
: 如我们所说,这阻止了 loggerAdmin.info()
产生的日志事件传递到 root
logger。root
Logger 配置:
STDOUT
appender 存在,但它不会接收 ADMIN
logger 的日志,因为 ADMIN
日志没有传递到 root
logger。详细分析:
代码执行 loggerAdmin.info()
:
info
级别的日志事件。name="ADMIN"
的 logger。ADMIN
logger 的 level
为 info
,所以日志事件被接受。additivity="false"
,日志事件不会传递给 root
logger。ADMIN
logger 关联的 ADMIN
appender。ADMIN
Appender 的行为:
ADMIN
appender 将日志写入到 admin_log.log
文件。root
Logger 和 STDOUT
Appender 的行为:
root
logger 接收所有级别大于等于 info
的日志事件。root
logger 没有收到 ADMIN
logger 的日志事件,因为它的 additivity
设置为 false
。STDOUT
appender 只会输出 root
logger 收到的日志事件,而不会输出来自 ADMIN
logger 的日志事件。为什么在控制台看不到:
STDOUT
appender 实现的。STDOUT
appender 只会打印那些被 root
logger 处理的日志事件。loggerAdmin.info()
的日志事件不会传递到 root
logger,因此不会通过 STDOUT
appender 输出到控制台。核心原因:
控制台输出和 admin_log.log
的输出是由不同的 appender 控制的,并且 ADMIN
logger 设置了 additivity="false"
,导致日志只写入 admin_log.log
文件,不输出到控制台。
如何让日志在控制台显示?
你有以下几种方法可以选择:
修改 ADMIN
logger 的 additivity
属性:
ADMIN
logger 的 additivity
设置为 true
(或者移除该属性,因为默认为 true)。<logger name="ADMIN" level="info" additivity="true">
<appender-ref ref="ADMIN"/>
logger>
loggerAdmin.info()
的日志事件会同时传递给 ADMIN
appender 和 root
logger,然后被 STDOUT
appender 输出到控制台。
admin_log.log
文件中的日志重复,因为日志会同时被 ADMIN
appender和 root
logger 的appender处理。修改 root
logger 配置,添加 ADMIN
appender:
ADMIN
appender 添加到 root
logger。<root level="${LOG_LEVEL}">
<appender-ref ref="FILEERROR"/>
<appender-ref ref="FILEWARN"/>
<appender-ref ref="FILEINFO"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="ADMIN"/>
root>
root
logger 会接收所有级别大于等于 info
的日志事件,包括来自 ADMIN
logger (并且additivity
属性为默认 true
时) 的日志事件。同时,ADMIN
appender 也会收到一份日志副本。修改代码,使用 root
logger:
private static final Logger loggerAdmin = LoggerFactory.getLogger("ADMIN");
修改为 private static final Logger logger = LoggerFactory.getLogger(YourClassName.class);
loggerAdmin.info("保存识别点信息后,identificationPoint.getId(): {}", identificationPoint.getId());
修改为 logger.info("保存识别点信息后,identificationPoint.getId(): {}", identificationPoint.getId());
推荐的方法:
ADMIN
日志输出的同时,也将其发送到控制台。admin_log.log
文件记录,那么方法3最简单,建议修改代码,使用root logger, 但通常不建议这么做。appender
输出所有日志,哪些 appender
只输出特定 logger 的日志。结论:
你之所以在控制台看不到 loggerAdmin.info()
的日志,是因为默认情况下它被 ADMIN
logger 和 additivity="false"
配置隔离了。修改 Logback 配置(additivity
或者 将 appender添加到 root
)可以解决这个问题。
希望这次的解释能够帮助你更好地理解问题的本质。 请告诉我你是否已经解决了这个问题!
<configuration>
<property name="LOG_PATH" value="logs/productQualification/"/>
<property name="LOG_LEVEL" value="info"/>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}pattern>
<charset>utf8charset>
encoder>
appender>
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/error_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/error_log/error_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger Line:%-3L - %msg%npattern>
<charset>utf-8charset>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>errorlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/warn_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/warn_log/warn_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger Line:%-3L - %msg%npattern>
<charset>utf-8charset>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warnlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/info_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">>
<fileNamePattern>${LOG_PATH}/info_log/info_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger Line:%-3L - %msg%npattern>
<charset>utf-8charset>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>infolevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="WECHAT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/wechat_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/wechat_log/wechat_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<appender name="ADMIN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/admin_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/admin_log/admin_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<appender name="ali" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/ali_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/ali_log/ali_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<appender name="FRONTEND" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/frontend_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/frontend_log/frontend_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<appender name="LIST_DETAIL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/listDetail_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/listDetail_log/listDetail_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<logger name="com.o2o.api.config.wechat" level="info" additivity="false">
<appender-ref ref="WECHAT"/>
logger>
<logger name="com.o2o.api.controller.wechat" level="info" additivity="false">
<appender-ref ref="WECHAT"/>
logger>
<logger name="me.chanjar.weixin" level="debug" additivity="false">
<appender-ref ref="WECHAT"/>
logger>
<logger name="com.github.binarywang" level="debug" additivity="false">
<appender-ref ref="WECHAT"/>
logger>
<logger name="ADMIN" level="info" additivity="false">
<appender-ref ref="ADMIN"/>
logger>
<logger name="ali" level="info" additivity="false">
<appender-ref ref="ali"/>
logger>
<logger name="FRONTEND" level="info" additivity="false">
<appender-ref ref="FRONTEND"/>
logger>
<logger name="LIST_DETAIL" level="info" additivity="false">
<appender-ref ref="LIST_DETAIL"/>
logger>
<logger name="org.springframework" level="WARN"/>
<logger name="org.hibernate" level="WARN"/>
<root level="${LOG_LEVEL}">
<appender-ref ref="FILEERROR"/>
<appender-ref ref="FILEWARN"/>
<appender-ref ref="FILEINFO"/>
<appender-ref ref="STDOUT"/>
root>
configuration>
<configuration>
<property name="LOG_PATH" value="logs/productQualification/"/>
<property name="LOG_LEVEL" value="info"/>
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}pattern>
<charset>utf8charset>
encoder>
appender>
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/error_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/error_log/error_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger Line:%-3L - %msg%npattern>
<charset>utf-8charset>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>errorlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/warn_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/warn_log/warn_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger Line:%-3L - %msg%npattern>
<charset>utf-8charset>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warnlevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/info_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/info_log/info_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger Line:%-3L - %msg%npattern>
<charset>utf-8charset>
encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>infolevel>
<onMatch>ACCEPTonMatch>
<onMismatch>DENYonMismatch>
filter>
appender>
<appender name="WECHAT" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/wechat_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/wechat_log/wechat_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<appender name="ADMIN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/admin_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/admin_log/admin_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<appender name="ali" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/ali_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/ali_log/ali_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<appender name="FRONTEND" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/frontend_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/frontend_log/frontend_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<appender name="LIST_DETAIL" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/listDetail_log.logfile>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/listDetail_log/listDetail_log.%d{yyyy-MM-dd}.logfileNamePattern>
<maxHistory>60maxHistory>
<totalSizeCap>1GBtotalSizeCap>
rollingPolicy>
<append>trueappend>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %msg%npattern>
<charset>utf-8charset>
encoder>
appender>
<logger name="com.o2o.api.config.wechat" level="info" additivity="false">
<appender-ref ref="WECHAT"/>
logger>
<logger name="com.o2o.api.controller.wechat" level="info" additivity="false">
<appender-ref ref="WECHAT"/>
logger>
<logger name="me.chanjar.weixin" level="debug" additivity="false">
<appender-ref ref="WECHAT"/>
logger>
<logger name="com.github.binarywang" level="debug" additivity="false">
<appender-ref ref="WECHAT"/>
logger>
<logger name="ADMIN" level="info">
<appender-ref ref="ADMIN"/>
logger>
<logger name="ali" level="info" additivity="false">
<appender-ref ref="ali"/>
logger>
<logger name="FRONTEND" level="info" additivity="false">
<appender-ref ref="FRONTEND"/>
logger>
<logger name="LIST_DETAIL" level="info" additivity="false">
<appender-ref ref="LIST_DETAIL"/>
logger>
<logger name="org.springframework" level="WARN"/>
<logger name="org.hibernate" level="WARN"/>
<root level="${LOG_LEVEL}">
<appender-ref ref="FILEERROR"/>
<appender-ref ref="FILEWARN"/>
<appender-ref ref="FILEINFO"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="ADMIN"/>
root>
configuration>