【问题标题】:How to make a log file with only one line which is overwritten every time?如何制作只有一行的日志文件,每次都被覆盖?
【发布时间】:2018-01-26 00:48:13
【问题描述】:

我在 Java 8 中使用 log4j2(2.5 版)。

我需要一个只有一行的日志文件。因此,对于每次写入,如果前一行存在,则必须被新行覆盖。

log4j.properties:

name=testLoggerOneLine
appenders=console, logFile

appender.console.type=Console
appender.console.name=STDOUT
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=[%-5level] %d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} 
[%t] %c{1} - %msg%n

appender.logFile.type=File
appender.logFile.name=LOGFILE
appender.logFile.fileName=C:/Users/mggl/workspace/Test/logs/Test.log
#appender.logFile.immediateFlush=true
#appender.logFile.append=false
#appender.logFile.createOnDemand=false
appender.logFile.layout.type=PatternLayout
appender.logFile.layout.pattern=%msg%n

loggers=logFile

logger.logFile.name=Test
logger.logFile.level=debug
logger.logFile.appenderRefs=logFile
logger.logFile.appenderRef.logFile.ref=LOGFILE
logger.logFile.additivity=false

rootLogger.level=debug
rootLogger.appenderRefs=stdout
rootLogger.appenderRef.stdout.ref=STDOUT

虚拟代码:

package Test.loggingTest;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class OneLineLog
{
    public static void main( String[] args )
    {
        Logger logger = LogManager.getLogger("testLoggerOneLine");

        logger.info("first writing");

        logger.info("second writing");

        logger.info("third writing");
     }
}

在 Test.log 中必须只写入最后的日志信息。

附加值为 false 的选项会在每次应用程序启动时获取大量日志信息。我想在不重新启动应用程序的情况下对每一行执行相同的操作。

感谢任何线索或建议。提前致谢。

【问题讨论】:

  • 出于好奇:为什么?
  • 这是一个要求。如果是我,我不会这样写日志。
  • 为什么会有人需要这个?顺便说一句,我不知道 log4j,但一条线的旋转可能是解决方案。
  • 手动轮换对我有用。谢谢。

标签: java log4j2 overwrite


【解决方案1】:

我在 log4j.properties 中使用 append 和 immediateFlush 选项(分别设置为 false 和 true)解决了这个问题,并在与记录器关联的 appender 上强制翻转。我在这个讨论中使用了 rgoers 写的 sn-p: How to rotate a log4j log manually

log4j.properties:

name=Test

appenders=console, logFile

appender.console.type=Console
appender.console.name=STDOUT
appender.console.layout.type=PatternLayout
appender.console.layout.pattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} - %msg%n

appender.logFile.type=RollingFile
appender.logFile.name=LOGFILE
appender.logFile.fileName=.../logs/Test.log
appender.logFile.filePattern=.../logs/%d{yyyyMMdd'T'HH:mm:ss.SSSZ}-Test.log.gz
appender.logFile.layout.type=PatternLayout
appender.logFile.layout.pattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}: %m%n
appender.logFile.policies.type=Policies
appender.logFile.policies.time.type=TimeBasedTriggeringPolicy
appender.logFile.policies.time.interval=1
appender.logFile.policies.time.modulate=true
appender.logFile.policies.size.type=SizeBasedTriggeringPolicy
appender.logFile.policies.size.size=500MB
appender.logFile.strategy.type=DefaultRolloverStrategy
appender.logFile.strategy.max=10
appender.logFile.append=false
appender.logFile.immediateFlush=true

loggers=logFile

logger.logFile.name=Test
logger.logFile.level=debug
logger.logFile.appenderRefs=logFile
logger.logFile.appenderRef.logFile.ref=LOGFILE
logger.logFile.additivity=false

rootLogger.level=debug
rootLogger.appenderRefs=stdout
rootLogger.appenderRef.stdout.ref=STDOUT

代码:

package Test.loggingTest;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.appender.RollingFileAppender;
import org.apache.logging.log4j.core.config.AbstractConfiguration;

public class OneLineLog {
    public static void main(String[] args) {

        Logger logger = LogManager.getLogger("Test");

        try {

            logger.info("first writing");

            LoggerContext loggerContext = (LoggerContext) LogManager.getContext();
            AbstractConfiguration logConfig = (AbstractConfiguration) loggerContext.getConfiguration();
            Appender logAppender = logConfig.getAppender("LOGFILE");
            if (logAppender instanceof RollingFileAppender) {
                RollingFileAppender rollingFileAppender = (RollingFileAppender) logAppender;
                rollingFileAppender.getManager().rollover();
            }

            Thread.sleep(5000);

            logger.info("second writing");
        } catch (Exception e) {
            System.out.println("Exception: " + e);
        }

    }
}

【讨论】:

    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 2014-12-24
    • 2012-11-16
    • 2015-07-13
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多