使用控制台和文件附加程序的非常简单的 log4j2 XML 配置文件

Posted

技术标签:

【中文标题】使用控制台和文件附加程序的非常简单的 log4j2 XML 配置文件【英文标题】:Very simple log4j2 XML configuration file using Console and File appender 【发布时间】:2014-02-08 00:41:12 【问题描述】:

我想要一个非常简单的 XML 配置文件,带有一个控制台和一个使用 log4j2 的文件追加器。

(Apache 网站提供了太多信息。)

【问题讨论】:

哈哈 - 很高兴你这么说“(Apache 网站的信息太多了。)” 你的那句话(Apache网站的信息太多了。)是我查看你问题的主要原因! 【参考方案1】:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%dHH:mm:ss.SSS [%t] %-5level %logger36 - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%dyyy-MM-dd HH:mm:ss.SSS [%t] %-5level %logger36 - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="MyFile"/>
        </Root>
    </Loggers>
</Configuration>

注意事项:

将以下内容放入您的配置文件中。 将配置文件命名为 log4j2.xml 将 log4j2.xml 放在类路径中的文件夹中(即您的源文件夹“src”) 使用Logger logger = LogManager.getLogger(); 初始化您的记录器 我确实设置了 immediateFlush="false",因为这更适合 SSD 寿命。如果您需要日志文件中的日志,请删除该参数或将其设置为 true

【讨论】:

为了完整起见,在使用 Async Loggers 或 AsyncAppender 时,特别推荐使用 immediateFlush="false"。 背景:immediateFlush="false" 允许 Log4J2 的异步组件在一次磁盘写入中批量处理多个日志事件。作为奖励,您最近的日志事件始终写入磁盘,并且永远不会挂在内存缓冲区中。 (我觉得 log4j-1.2 很烦人。) 我无法让 Log4j 2.0 站点上的示例正常工作,但这个可以。谢谢。 补充一点,使用 eclipse 的人可能需要进行清理。为了人类。 @ThorstenNiehues 我无法编辑我之前的评论,但是 Eclipse 在您构建时会复制配置,并且由于某种原因,即使它更改了它也不总是复制 log4j.xml。至少这就是为我解决的问题。【参考方案2】:

这是我的简单化log4j2.xml,它打印到控制台并写入每日滚动文件:

// java
private static final Logger LOGGER = LogManager.getLogger(MyClass.class);


// log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logPath">target/cucumber-logs</Property>
        <Property name="rollingFileName">cucumber</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%highlight%-5level] %dDEFAULT %c1.%M() - %msg%n%throwableshort.lineNumber" />
        </Console>
        <RollingFile name="rollingFile" fileName="$logPath/$rollingFileName.log" filePattern="$logPath/$rollingFileName_%dyyyy-MM-dd.log">
            <PatternLayout pattern="[%highlight%-5level] %dDEFAULT %c1.%M() - %msg%n%throwableshort.lineNumber" />
            <Policies>
                <!-- Causes a rollover if the log file is older than the current JVM's start time -->
                <OnStartupTriggeringPolicy />
                <!-- Causes a rollover once the date/time pattern no longer applies to the active file -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="DEBUG" additivity="false">
            <AppenderRef ref="console" />
            <AppenderRef ref="rollingFile" />
        </Root>
    </Loggers>
</Configuration>

TimeBasedTriggeringPolicy

间隔(整数) - 根据 日期模式中最具体的时间单位。例如,带有日期 以小时为最具体的项目并且增量为 4 的模式 翻转将每 4 小时发生一次。默认值为 1。

modulate (boolean) - 表示是否应该调整间隔 使下一次翻转发生在区间边界上。为了 例如,如果项目是小时,则当前时间是凌晨 3 点,而 间隔为 4,那么第一次翻转将在凌晨 4 点发生,然后下一次 会在上午 8 点、中午、下午 4 点等发生。

来源:https://logging.apache.org/log4j/2.x/manual/appenders.html

输出:

[INFO ] 2018-07-21 12:03:47,412 ScenarioHook.beforeScenario() - Browser=CHROME32_NOHEAD
[INFO ] 2018-07-21 12:03:48,623 ScenarioHook.beforeScenario() - Screen Resolution (WxH)=1366x768
[DEBUG] 2018-07-21 12:03:52,125 HomePageNavigationSteps.I_Am_At_The_Home_Page() - Base URL=http://simplydo.com/projector/
[DEBUG] 2018-07-21 12:03:52,700 NetIncomeProjectorSteps.I_Enter_My_Start_Balance() - Start Balance=348000

每天都会创建一个新的日志文件,前一天会自动重命名为:

cucumber_yyyy-MM-dd.log

在 Maven 项目中,您可以将 log4j2.xml 放入 src/main/resources src/test/resources

【讨论】:

我想知道我们是否在第一天成功运行了我们的程序并且我们所有的日志消息都写入了创建的文件,但是突然我们终止了我们的程序并在同一天重新启动它。当我们重新启动时,它会创建一个新文件并将其写入那里,还是会写入它在同一天创建的现有文件? @银【参考方案3】:

log4j2 有一个非常灵活的配置系统(恕我直言,这与其说是帮助,不如说是分散注意力),您甚至可以使用 JSON。请参阅https://logging.apache.org/log4j/2.x/manual/configuration.html 以获取参考。

就我个人而言,我最近才开始使用 log4j2,但我倾向于“严格的 XML”配置(即使用属性而不是元素名称),它可以进行模式验证。

这是我使用自动配置和严格模式的简单示例,使用“属性”设置文件名:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
    <Properties>
        <Property name="filename">log/CelsiusConverter.log</Property>
    </Properties>
    <Appenders>
        <Appender type="Console" name="Console">
            <Layout type="PatternLayout" pattern="%d %p [%t] %m%n" />
        </Appender>
        <Appender type="Console" name="FLOW">
            <Layout type="PatternLayout" pattern="%C1.%M %m %ex%n" />
        </Appender>
        <Appender type="File" name="File" fileName="$filename">
            <Layout type="PatternLayout" pattern="%d %p %C1. [%t] %m%n" />
        </Appender>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File" />
            <AppenderRef ref="Console" />
            <!-- Use FLOW to trace down exact method sending the msg -->
            <!-- <AppenderRef ref="FLOW" /> -->
        </Root>
    </Loggers>
</Configuration>

【讨论】:

当您尝试将配置与构建分开并将配置放入其他地方的存储库时,灵活的配置会派上用场。不幸的是,复杂性让它有点烦人,但我只是想我会放弃灵活的配置选项。 这里的File 政策是什么?最大文件大小是多少?它是如何写入文件的? (文件是否总是包含最后 10mb 的日志?)【参考方案4】:

有很好的答案,但如果您想为控制台日志着色,您可以使用该模式:

<PatternLayout pattern="%style%dateDEFAULTyellow
            [%t] %highlight%-5levelFATAL=bg_red, ERROR=red, WARN=yellow, INFO=green %logger36 - %message\n"/>

完整的 log4j2 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="APP_LOG_ROOT">/opt/test/log</Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="%style%dateDEFAULTyellow
                [%t] %highlight%-5levelFATAL=bg_red, ERROR=red, WARN=yellow, INFO=green %logger36 - %message\n"/>
        </Console>
        <RollingFile name="XML_ROLLING_FILE_APPENDER"
                     fileName="$APP_LOG_ROOT/appName.log"
                     filePattern="$APP_LOG_ROOT/appName-%dyyyy-MM-dd-%i.log.gz">
            <PatternLayout pattern="%dDEFAULT [%t] %-5level %logger36 - %msg%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB"/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="ConsoleAppender"/>
        </Root>
        <Logger name="com.compName.projectName" level="debug">
            <AppenderRef ref="XML_ROLLING_FILE_APPENDER"/>
        </Logger>
    </Loggers>
</Configuration>

日志将如下所示:

【讨论】:

以上是关于使用控制台和文件附加程序的非常简单的 log4j2 XML 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

Log4J2 - 在运行时分配文件附加程序文件名

log4j2 未找到 1 个记录器的附加程序

log4j2 - Syslog 附加程序和 PatternLayout

如何使用 Spring Boot 设置 log4j2 自定义附加程序?

如何以编程方式在运行时添加 Log4J2 附加程序?

在 Spring Boot 应用程序的 log4j2 中未生成日志文件