更改日志文件以在 Spring Boot 应用程序中附加日志时出错

问题描述 投票:0回答:1

当我更改写入日志的文件时,我遇到此错误

<?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 应用程序中的日志文件。尽管日志已成功写入新文件,但错误消息不断出现,我也希望日志也附加到控制台。如果您能帮助我理解为什么会发生此错误以及如何解决它,我将不胜感激。谢谢!

java spring-boot logging log4j2
1个回答
0
投票

您收到状态记录器错误的直接原因是您从“myPackage”记录器配置中删除了附加程序,但没有从根记录器配置中删除它。

如果您想从所有记录器配置中删除附加程序并停止它,请运行:

// Removes from all logger configuration and stops the appender
configuration.removeAppender(appenderName);
// Now we can also remove the logger configuration
configuration.removeLogger(packageName);

如果您想从一个特定的记录器配置中删除附加程序,您需要:

  1. 从记录器配置中删除附加程序(
    LoggerConfig#removeAppender
    ),
  2. 迭代
    Configuration#getLoggers
    以查看是否没有其他记录器配置使用它,
  3. 如果不再使用追加器,请将其停止。
© www.soinside.com 2019 - 2024. All rights reserved.