当我更改写入日志的文件时,我遇到此错误
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} - %msg%n"/>
</Console>
<File name="FileAppender" fileName="logs/api.log" append="false">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender" />
</Root>
<Logger name="myPackage" level="DEBUG" additivity="false">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender" />
</Logger>
</Loggers>
</Configuration>
这是更改添加日志的文件的方法
public static void updateLogger(String fileName, String appenderName, String packageName) {
LoggerContext context = (LoggerContext) LogManager.getContext(false);
Configuration configuration = context.getConfiguration();
Layout<? extends Serializable> oldLayout = configuration.getAppender(appenderName).getLayout();
// Delete old appender/logger
configuration.getAppender(appenderName).stop();
configuration.removeLogger(packageName);
// Create new appender/logger
LoggerConfig loggerConfig = new LoggerConfig(packageName, Level.ALL, false);
FileAppender appender = FileAppender.newBuilder()
.withFileName(fileName)
.withAppend(true)
.setName(appenderName)
.setLayout(oldLayout)
.build();
appender.start();
loggerConfig.addAppender(appender, Level.ALL, null);
configuration.addLogger(packageName, loggerConfig);
context.updateLoggers();
}
这里是我调用该方法的地方
FileUtils.updateLogger("logs/logs/log" + ".txt", "FileAppender", "mypackage");
Spring Boot中更改日志文件时出错 - 日志写入成功,但出现错误
2023-08-09 15:52:23,418 MessageBroker-8 ERROR Attempted to append to non-started appender FileAppender
2023-08-09 15:52:23,422 MessageBroker-8 ERROR Unable to write to stream logs/api.log for appender FileAppender org.apache.logging.log4j.core.appender.AppenderLoggingException: Error writing to stream logs/api.log
at org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDestination(OutputStreamManager.java:252)
at org.apache.logging.log4j.core.appender.FileManager.writeToDestination(FileManager.java:277)
at org.apache.logging.log4j.core.appender.OutputStreamManager.flushBuffer(OutputStreamManager.java:283)
at org.apache.logging.log4j.core.appender.OutputStreamManager.flush(OutputStreamManager.java:294)
at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:217)
at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:208)
at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:199)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:675)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:633)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:616)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:552)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2205)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2159)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2142)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2022)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1875)
at org.apache.commons.logging.LogAdapter$Log4jLog.log(LogAdapter.java:266)
at org.apache.commons.logging.LogAdapter$Log4jLog.info(LogAdapter.java:230)
at org.springframework.web.socket.config.WebSocketMessageBrokerStats.lambda$initLoggingTask$0(WebSocketMessageBrokerStats.java:128)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:308)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Stream Closed
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDestination(OutputStreamManager.java:250)
... 33 more
我希望深入了解发生此错误的原因并寻求潜在解决方案的指导。该场景涉及动态更改我的 Spring Boot 应用程序中的日志文件。尽管日志已成功写入新文件,但错误消息不断出现,我也希望日志也附加到控制台。如果您能帮助我理解为什么会发生此错误以及如何解决它,我将不胜感激。谢谢!
您收到状态记录器错误的直接原因是您从“myPackage”记录器配置中删除了附加程序,但没有从根记录器配置中删除它。
如果您想从所有记录器配置中删除附加程序并停止它,请运行:
// Removes from all logger configuration and stops the appender
configuration.removeAppender(appenderName);
// Now we can also remove the logger configuration
configuration.removeLogger(packageName);
如果您想从仅一个特定的记录器配置中删除附加程序,您需要:
LoggerConfig#removeAppender
),Configuration#getLoggers
以查看是否没有其他记录器配置使用它,