【问题标题】:Custom log level issue in log4j2log4j2 中的自定义日志级别问题
【发布时间】:2017-04-04 02:26:18
【问题描述】:

根记录器配置为INFO 级别的同步记录器。我也有几个异步记录器。其中一个异步记录器配置为自定义的更高日志级别TOAST (789)。这高于TRACE 级别(600)。

这样做的原因是有一个日志级别,可用于通过异步记录器及其自己的附加程序记录特殊事件。

我们不希望 TOAST 事件发送到同步根记录器或其他记录器.. 而是只发送到异步 TOAST 记录器及其相应的附加程序.. 可能吗?

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="120" packages=“com.pack.toast”>
     <CustomLevels>
        <CustomLevel name=“TOAST” intLevel=“789” />
    </CustomLevels>

    <Appenders>
        <RollingFile fileName="${sys:catalina.base}/logs/packiu.log"
            append="true" name="DRFILE"
            filePattern="${sys:catalina.base}/logs/packiu-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>%d [%t] %c %M - %p: %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="30" />
        </RollingFile>          
        <RollingFile name="RollingFile" fileName="/Users/toasty/logs/roll_file_app.log"
                     filePattern="logs/app-%d{MM-dd-yyyy}.log.gz" immediateFlush="true" >
               <PatternLayout>
                        <pattern>%m%n</pattern>
              </PatternLayout>
              <TimeBasedTriggeringPolicy />
        </RollingFile>
        <Rewrite name="Rewrite" ignoreExceptions = "true"  >
            <ToastAppenderPolicy toastNeeded="true">
            </ToastAppenderPolicy>
            <AppenderRef ref="RollingFile"/>
        </Rewrite>

    </Appenders>
    <Loggers>
        <Logger name="net.rubyeye" level="off" />
        <Logger name="com.google.code" level="off" />               

        <AsyncLogger name="com.pack.toast.ToastLoggerImpl" level=“TOAST” includeLocation="true">
            <AppenderRef ref="Rewrite" />
        </AsyncLogger>

        <Root level="info">
            <AppenderRef ref="DRFILE" />
        </Root>

    </Loggers>
</Configuration>

【问题讨论】:

    标签: java asynchronous logging customization log4j2


    【解决方案1】:

    在我看来,您真的想要一个命名记录器而不是自定义级别,因为您只希望您的消息发送到一个记录器及其附加程序。也许你应该使用类似的东西:

    <AsyncLogger name="TOAST_LOGGER" level=“INFO” includeLocation="true">
        <AppenderRef ref="Rewrite" />
    </AsyncLogger>
    

    然后在你的代码中

    private static final Logger TOAST_LOGGER = LogManager.getLogger("TOAST_LOGGER");
    ...
    TOAST_LOGGER.info("Toast message");
    ...
    

    否则,如果您必须使用自定义日志级别,那么您可以通过 filteringThreshold Filter 完成您想要的。

    【讨论】:

    • 感谢@D.B. 的信息。我完全按照概述做了命名记录器,但日志消息仍然在两个记录器的输出中结束,不幸的是.. (Synchronous Root and also with Asynchronous Named Logger) 。以下是 SYNC 记录器的输出示例 - 2017-04-03 23:04:42,534 [http-nio-8443-exec-1] TOAST_LOGGER log - INFO: blah。有什么想法吗?如果可以使这种方法起作用,那么没有自定义日志级别我很好。谢谢
    • 我相信这可能是由于可加性。请参阅 log4j2 文档的 additivity 部分,并在适当的记录器上将 additivity 设置为 false。我认为在 toast 记录器上将其设置为 false 就足够了,因为它说:“一旦事件到达一个记录器,其可加性设置为 false,该事件将不会传递给它的任何父记录器,无论它们的可加性设置如何。”
    • 谢谢@D.B.可加性似乎解决了将值传递给父级的问题。
    猜你喜欢
    • 2020-08-02
    • 2012-08-18
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多