Spring Boot同时配置Logback与Log4j2后Syslog无法正常工作求助
Spring Boot同时配置Logback与Log4j2的问题解决
需求背景
最初仅使用Logback配置Syslog Appender,但Logback不支持RFC5424格式,而Log4j2支持该标准,因此希望同时配置两者,保留Logback的滚动日志功能,用Log4j2处理符合RFC5424的Syslog输出。
当前配置
Logback配置(logback.xml)
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="DEV_HOME" value="/data/storage/log"></property> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern> %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable </Pattern> </layout> </appender> <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>/data/storage/log/cms.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%d %p %C{1.} [%t] %m%n</Pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- roll over daily and when the file reaches 10 MB, max of 7 days or 3GB threshold --> <fileNamePattern>/data/storage/log/cms.%d{yyyy-MM-dd}.%i.Logs.gz </fileNamePattern> <maxFileSize>100MB</maxFileSize> <maxHistory>7</maxHistory> <totalSizeCap>3GB</totalSizeCap> </rollingPolicy> </appender> <appender name="SPECIFIC_CLASS" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${DEV_HOME}/sizeTimeOutputlogFile.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>[%d{yyyy-MM-dd HH:mm:ss}] %p %c{1.} [%t]- %m%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${DEV_HOME}/archived/sizeTimeOutputlogFile.%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!--Max Size of file to start Archive --> <maxFileSize>10KB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <!-- Days till log history to keep --> <maxHistory>3</maxHistory> </rollingPolicy> </appender> <!--syslog appender--> <appender name="SYSLOG" class="ch.qos.logback.classic.net.SyslogAppender"> <syslogHost>127.0.0.1</syslogHost> <facility>LOCAL0</facility> <port>514</port> <throwableExcluded>true</throwableExcluded> <suffixPattern>%thread: %-5level %logger{36} - %msg%n</suffixPattern> </appender> <!-- LOG everything at ERROR level --> <root level="ERROR"> <appender-ref ref="RollingFile" /> <appender-ref ref="Console" /> </root> <!-- LOG "com.myapp*" at ERROR level --> <logger name="com.myapp" level="ERROR" additivity="false"> <appender-ref ref="RollingFile" /> <appender-ref ref="Console" /> </logger> <logger name="sysLogger" level="DEBUG" additivity="false"> <appender-ref ref="SYSLOG" /> </logger> </configuration>
Log4j2配置(log4j2.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <Configuration strict="true" name="XMLConfig"> <Appenders> <Syslog name="Syslog" format="RFC5424" host="localhost" port="514" protocol="UDP" appName="cms" facility="LOCAL0" /> </Appenders> <Loggers> <Logger name="com.mavenir.cms.vnf.util.ActivityLogAspect" level ="debug" additivity="false"> <AppenderRef ref="Syslog"/> </Logger> </Loggers> </Configuration>
问题描述
- 应用运行后,Syslog无法正常输出日志
- 无法完全从Logback切换到Log4j2,因为找不到Log4j2中等效于Logback的滚动文件追加器配置
解决方案
一、直接切换到Log4j2(推荐)
Log4j2完全支持Logback的滚动日志功能,无需同时维护两个日志框架,避免依赖冲突和资源浪费。
1. 调整Maven依赖
排除Spring Boot默认的Logback依赖,引入Log4j2 starter:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
2. 配置Log4j2等效滚动追加器
修改log4j2.xml,添加对应Logback的两个滚动文件追加器:
<?xml version="1.0" encoding="UTF-8"?> <Configuration strict="true" name="XMLConfig" status="WARN"> <Properties> <Property name="DEV_HOME">/data/storage/log</Property> </Properties> <Appenders> <!-- Console Appender --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%black{%d{ISO8601}} %highlight{%-5level} [%blue{%t}] %yellow{%C{1.}}: %msg%n%throwable"/> </Console> <!-- 对应Logback的RollingFile追加器 --> <RollingFile name="RollingFile" fileName="${DEV_HOME}/cms.log" filePattern="${DEV_HOME}/cms.%d{yyyy-MM-dd}.%i.Logs.gz"> <PatternLayout pattern="%d %p %C{1.} [%t] %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="100MB"/> </Policies> <DefaultRolloverStrategy max="7"> <Delete basePath="${DEV_HOME}" maxDepth="1"> <IfFileName glob="cms.*.Logs.gz"/> <IfLastModified age="7d"/> <IfAccumulatedFileSize exceeds="3GB"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- 对应Logback的SPECIFIC_CLASS追加器 --> <RollingFile name="SPECIFIC_CLASS" fileName="${DEV_HOME}/sizeTimeOutputlogFile.log" filePattern="${DEV_HOME}/archived/sizeTimeOutputlogFile.%d{yyyy-MM-dd}.%i.log"> <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] %p %c{1.} [%t]- %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="10KB"/> </Policies> <DefaultRolloverStrategy max="3"> <Delete basePath="${DEV_HOME}/archived" maxDepth="1"> <IfFileName glob="sizeTimeOutputlogFile.*.log"/> <IfLastModified age="3d"/> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- RFC5424格式Syslog追加器 --> <Syslog name="Syslog" format="RFC5424" host="127.0.0.1" port="514" protocol="UDP" appName="cms" facility="LOCAL0" messageId="cms" mdcId="mdc" includeMdc="true" enterpriseNumber="18060" newLine="true" exceptionPattern="%throwable{full}"/> </Appenders> <Loggers> <Root level="ERROR"> <AppenderRef ref="RollingFile"/> <AppenderRef ref="Console"/> </Root> <Logger name="com.myapp" level="ERROR" additivity="false"> <AppenderRef ref="RollingFile"/> <AppenderRef ref="Console"/> </Logger> <Logger name="com.mavenir.cms.vnf.util.ActivityLogAspect" level="DEBUG" additivity="false"> <AppenderRef ref="Syslog"/> </Logger> <!-- 原Logback中的sysLogger对应配置 --> <Logger name="sysLogger" level="DEBUG" additivity="false"> <AppenderRef ref="Syslog"/> </Logger> </Loggers> </Configuration>
二、解决Syslog输出问题
如果坚持同时使用Logback和Log4j2,需先解决依赖冲突,再检查Syslog配置:
1. 处理依赖冲突
在pom.xml中同时引入Logback和Log4j2,并排除冲突依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 引入Log4j2依赖 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </dependency> <!-- 保留Logback --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency>
注意:这种方式会导致SLF4J绑定冲突,需通过org.slf4j:slf4j-api的桥接包处理,不推荐生产环境使用
2. 检查Syslog服务状态
- 确认本地Syslog服务(如rsyslog)已启动并监听514端口
- 检查防火墙规则,允许UDP 514端口的入站/出站流量
- 查看Syslog服务日志(如
/var/log/syslog),确认是否有接收日志的记录
内容的提问来源于stack exchange,提问作者manjosh
相关产品推荐
相关产品推荐

