【问题标题】:Change JUST the logging rollover policy in a logger仅更改记录器中的记录翻转策略
【发布时间】:2018-05-24 18:00:24
【问题描述】:

我正在使用 2 个记录器(logger1 和 logger2)记录到文件“file.log”。一个将基于时间的翻转策略设置为每天,而另一个设置为每小时。一旦我切换到 logger2,我就不会回到 logger1。 但是,切换到 logger2 后翻转停止,因为 file.log 具有来自两个记录器的日志。我不想记录到与每个记录器相对应的单独文件,然后独立翻转每个文件。

与 logger1 关联的 Rollingfile appender:

<FileName>file.log</FileName>
<FilePattern>../archive/log-%d{yyyy-MM-dd}.log</FilePattern>

与 logger2 关联的 Rollingfile appender:

<FileName>file.log</FileName>
<FilePattern>../archive/log-%d{yyyy-MM-dd-HH}.log</FilePattern>

当服务器基于代码切换运行时,如何将日志文件的翻转策略从每天更改为每小时? (可以是 1 个记录器/2 个记录器,但翻转应该从每天更改为每小时)

【问题讨论】:

  • 你试过RoutingAppender吗?
  • @D.B.嘿,是的。但这只是使在记录器之间切换变得容易。我能够做到这一点。当我切换到每小时滚动的附加程序时,我只希望日志文件每小时滚动一次(尽管日志文件包含来自两个记录器的日志)。

标签: logging log4j log4j2


【解决方案1】:

我不太确定您想要的输出到底是什么,但我认为这可能非常接近。请注意,我将提供一个在每毫秒和每秒滚动一次日志之间切换的示例,但您可以根据需要进行修改。

这是一个生成一些日志的示例类。它将上下文键设置为“毫秒”,以便 log4j2 将选择一个每毫秒滚动一次日志的附加程序,生成一些日志,等待几秒钟,然后将上下文键设置为“秒”以选择一个每毫秒滚动一次日志的附加程序第二,然后生成更多的日志。

package example;

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


public class SomeClass {
    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args){
        ThreadContext.put("rollTime", "millis");

        log.debug("This is some debug!");
        log.info("Here's some info!");
        log.error("Some error happened!");

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        ThreadContext.put("rollTime", "sec");
        log.debug("This is some debug!");
        log.info("Here's some info!");
        log.error("Some error happened!");
    }
}

这里是 log4j2 配置文件(XML 格式):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <Routing name="MyRoutingAppender">
            <Routes pattern="$${ctx:rollTime}">
                <Route key="millis">
                    <RollingFile name="fileAppender1" fileName="logs/file.log"
                        filePattern="logs/file.%d{yyyy-MM-dd HH_mm_ss_SSS}.log">
                        <PatternLayout
                            pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger:%L - %msg%n" />
                        <Policies>
                            <TimeBasedTriggeringPolicy />
                        </Policies>
                        <DefaultRolloverStrategy max="2" />
                    </RollingFile>
                </Route>
                <Route key="sec">
                    <RollingFile name="fileAppender2" fileName="logs/file.log"
                        filePattern="logs/file.%d{yyyy-MM-dd HH_mm_ss}.log">
                        <PatternLayout
                            pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger:%L - %msg%n" />
                        <Policies>
                            <TimeBasedTriggeringPolicy />
                        </Policies>
                        <DefaultRolloverStrategy max="2" />
                    </RollingFile>
                </Route>
            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Root level="trace">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyRoutingAppender" />
        </Root>
    </Loggers>
</Configuration>

希望这个示例能够接近您想要实现的目标,并且可以帮助您找到解决方案。

【讨论】:

  • 但是使用这个配置,当我移动到第二个路由键时,不会发生翻转。我有一个配置,我从每日格式转换为每 3 分钟翻转一次的格式。因此,在路由到基于分钟的翻转策略后,翻转不会发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2012-12-10
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多