Log4J2日志文件随机缺失条目问题求助
Log4J日志异常排查(SAP Hybris环境)
环境信息
- SAP Hybris 6.0.0(SAP Commerce)
- openJDK 8
- Apache Tomcat
- Log4j2 2.4.1(SLF4J作为门面)
- CentOS 7
日志使用代码
Logger LOGGER = LoggerFactory.getLogger(SomeClass.class); try { // 抛出异常的业务代码 } catch (Exception e) { LOGGER.error("Some exception occured."); }
Log4j2 XML配置
<?xml version="1.0" encoding="UTF-8"?> <!-- ~ [y] hybris Platform ~ ~ Copyright (c) 2000-2016 SAP SE ~ All rights reserved. ~ ~ This software is the confidential and proprietary information of SAP ~ Hybris ("Confidential Information"). You shall not disclose such ~ Confidential Information and shall use it only in accordance with the ~ terms of the license agreement you entered into with SAP Hybris. --> <!-- Platform-only xml configuration for Log4j2. Not used by default, can be treated as an example --> <!-- To enable set in local.properties: log4j2.config.xml=hybris-log4j2.xml --> <!-- Keep in mind that xml configurations cannot be merged together unlike ones set via hybris properties. --> <!-- shutdownHook is disabled because we invoke it programatically after shutting down hybris registry --> <Configuration status="WARN" shutdownHook="disable" packages="de.hybris.platform.util.logging"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%highlight{%-5p [%t] %X{RemoteAddr}%X{Tenant}%X{CronJob}[%c{1}] %m%n}"/> </Console> </Appenders> <Loggers> <Logger name="de.hybris.platform.servicelayer.hmc" level="warn"> <AppenderRef ref="Console"/> </Logger> <Logger name="de.hybris.platform.spring.ctx.TenantIgnoreXmlWebApplicationContext" level="warn"> <AppenderRef ref="Console"/> </Logger> <Logger name="de.hybris.platform.spring.ctx.CloseAwareApplicationContext" level="warn"> <AppenderRef ref="Console"/> </Logger> <Logger name="org.apache.ddlutils.alteration.ModelComparator" level="warn"> <AppenderRef ref="Console"/> </Logger> <Logger name="hsqldb.db" level="warn"> <AppenderRef ref="Console"/> </Logger> <Logger name="de.hybris.platform.spring.IgnoreTenantScopeMetadataResolver" level="warn"> <AppenderRef ref="Console"/> </Logger> <Logger name="de.hybris.platform.spring.ctx.ScopeTenantIgnoreDocReader" level="warn"> <AppenderRef ref="Console"/> </Logger> <Logger name="de.hybris.platform.util.logging.LoggingFrameworksBridgeTest" level="ALL" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Logger name="de.hybris.cronjobtutorial.MyJobPerformable" level="ALL" additivity="false"> <AppenderRef ref="Console"/> </Logger> <Logger name="org.springframework.aop.framework.Cglib2AopProxy" level="error"> <AppenderRef ref="Console"/> </Logger> <Logger name="org.springframework" level="warn"> <AppenderRef ref="Console"/> </Logger> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
异常现象
- 部分日志仅显示ANSI颜色控制符号,自定义日志消息缺失
- 部分Logger仅打印异常堆栈跟踪,自定义消息被省略
- 甚至
System.out.println输出的内容也无法正常显示 - 多数Logger工作正常,已排除日志级别及Log4J配置本身的问题;移除
%highlight高亮格式后问题依旧
排查更新
- 已附上HAC日志面板截图
- 将Log4J配置改为使用RollingFile Appender(而非输出到SYSTEM_OUT)后,所有日志条目正常显示,怀疑问题出在Tomcat与控制台输出相关的环节
排查方向建议
- 检查Tomcat的
catalina.out输出是否存在缓冲或编码问题:CentOS环境下Tomcat默认的控制台输出可能使用特定编码,需确认是否与Log4J输出的编码一致(比如UTF-8) - 检查Tomcat的
conf/logging.properties配置:确认控制台Handler的设置,比如java.util.logging.ConsoleHandler的编码、格式化规则,是否与Log4J的输出产生冲突 - 验证Hybris平台对Tomcat输出的拦截或重写逻辑:检查
de.hybris.platform.util.logging包下的相关类是否对SYSTEM_OUT做了特殊处理 - 测试直接在Tomcat中运行简单的Log4J控制台输出程序:排除Hybris平台本身的干扰,确认Tomcat环境下Log4J控制台输出是否正常
- 检查JVM参数中是否有影响控制台输出的配置:比如
-Dfile.encoding、-Dsun.stdout.encoding等参数是否设置正确,是否与系统终端编码匹配
内容的提问来源于stack exchange,提问作者jahra
相关产品推荐
相关产品推荐

