log4j每条日志末尾自动添加“sg”,如何解决该问题?
嘿,我来帮你排查这个奇怪的小问题!从你给的代码和日志示例来看,这个多余的"sg"大概率不是Log4j本身的锅,咱们一步步来找原因:
先从最可能的地方查起:日志消息本身
你看示例里的10:04:21.854 [main] System: Activated Botsg,会不会是你输出日志的时候,消息本身就带了"sg"?比如写代码时手滑把"Activated Bot"写成了"Activated Botsg",或者拼接字符串时某个变量的值刚好是"sg"?先去翻一翻输出这条日志的代码,确认原始消息有没有问题,这是最常见的原因哦。
排查getLogFile()方法的潜在影响
虽然看起来和文件名没关系,但保险起见,可以临时把getLogFile()改成返回一个固定路径(比如"test.log"),测试一下日志还会不会出现"sg"。毕竟万一这个方法里有什么奇怪的输出,不小心混到日志里了呢?不过这种情况概率很低,但排除一下总没错。
检查Appender是否重复添加
你的createLogger()是静态方法,会不会被多次调用?如果同一个Logger被重复添加了Appender,可能会导致消息被重复输出,而其中某一次的消息带了"sg"。可以在添加新Appender之前先清空旧的,避免重复:
// 添加新Appender前先清空所有旧的 logger.removeAllAppenders(); logger.addAppender(new ConsoleAppender(layout)); // 再添加FileAppender...
另外也可以加上logger.setAdditivity(false);,防止父Logger的Appender重复输出日志。
核对PatternLayout格式是否有误
你的格式是"%d{HH:mm:ss.SSS} [%t] %msg%n",这个本身是对的——%msg输出消息,%n是换行。不过还是再仔细看一眼,有没有不小心把"sg"写到格式串里了?比如是不是写成了"%d{HH:mm:ss.SSS} [%t] %msg%nsg"?虽然你代码里写的是对的,但有时候手滑打错字也很正常嘛。
确认Log4j版本兼容性
你说用了Maven最新版的Log4j,这里要注意:Log4j 1.x和2.x的API完全不一样!你的代码用的是org.apache.log4j.Logger这些1.x的类,要是Maven依赖不小心混了2.x的包,可能会出现奇怪的兼容性问题。确认一下你的依赖是纯1.x的,比如:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
如果是想用Log4j 2.x的话,代码写法得全部换掉,所以先确保版本和代码对应上。
快速测试排除干扰
写个极简的测试代码,把其他因素都排除掉:
import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.apache.log4j.ConsoleAppender; public class TestLogFix { private static Logger createLogger(){ Logger logger = Logger.getLogger(TestLogFix.class); PatternLayout layout = new PatternLayout("%d{HH:mm:ss.SSS} [%t] %msg%n"); logger.removeAllAppenders(); logger.addAppender(new ConsoleAppender(layout)); return logger; } public static void main(String[] args) { Logger logger = createLogger(); logger.info("System: Activated Bot"); } }
运行这个测试类,如果日志输出正常,那问题肯定出在你原来的代码里(比如getLogFile()或者日志消息);如果还是出现"sg",那可能是IntelliJ控制台的小bug?不过这个概率极低啦。
内容的提问来源于stack exchange,提问作者pikkuez

