如何配置log4j2.xml文件

后端 潘老师 7个月前 (10-25) 171 ℃ (0) 扫码查看

学习配置log4j2.xml文件以将日志语句输出到控制台、滚动文件等。 学习配置log4j2的appender、级别和模式。

Apache Log4j2是对Log4j 1.x的升级,与前一个版本相比提供了显着的改进,例如性能提高、自动重新加载修改的配置文件、Java 8 lambda支持和自定义日志级别。

1. Log4j2 依赖关系

1.1 Maven

要包含Log4j2,请包括最新版本的log4j-core和log4j-api依赖项。请注意,使用Log4j2与SLF4J一起是推荐的方法。

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.20.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.20.0</version>
</dependency>

1.2 Gradle

dependencies {
    implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
    implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
}

2. ConsoleAppender – 记录到控制台

我们可以使用下面的log4j2.xml文件将日志输出到控制台。 它使用ConsoleAppender API。 请注意,如果在初始化Log4j2时找不到配置文件,则将使用DefaultConfiguration。 默认配置将导致日志输出到控制台。

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 与Log4j初始化相关的额外日志记录。如果log4j初始化失败,则设置为调试或跟踪。 -->
<Configuration status="warn">
    <Appenders>
        <!-- Console appender 配置-->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
        </Console>
    </Appenders>
    <Loggers>
        <!-- Root logger 指向 console appender -->
        <Root level="info" additivity="false">
            <AppenderRef ref="console" />
        </Root>
    </Loggers>
</Configuration>

3. RollingFileAppender – 记录到文件

我们可以使用下面的log4j2.xml文件将日志输出与基于时间和大小的滚动文件。 给定的RollingFileAppender配置每天滚动日志,或者当日志文件大小大于10 MB时。 它还将删除所有超过30天的旧日志文件。

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Properties>
        <Property name="basePath">C:/temp/logs</Property>
    </Properties>
    <Appenders>
        <RollingFile name="fileLogger"
            fileName="${basePath}/app.log"
            filePattern="${basePath}/app-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                </pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <!-- 每天最多创建 10 个文件 -->
            <DefaultRolloverStrategy max="10">
                <Delete basePath="${basePathr}" maxDepth="10">
                    <!-- 删除所有30天以上的文件 -->
                    <IfLastModified age="30d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info" additivity="false">
            <appender-ref ref="fileLogger" />
        </Root>
    </Loggers>
</Configuration>

4. 配置多个Appender

使用此简单的log4j2.xml进行快速参考以将日志语句记录到多个日志文件中。 此配置使用LevelRangeFilter将不同级别的日志(例如调试,信息等)记录到不同的文件,以便我们的日志清晰且易于分离,从而易于调试和报告。 根据您的需求更改多个appender的配置。

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <!-- Logging Properties -->
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %p %m%n</Property>
        <Property name="APP_LOG_ROOT">c:/temp/logs</Property>
    </Properties>
    <Appenders>
        <!-- Console Appender -->
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        <!-- 根据需要使用File Appenders -->
        <RollingFile name="frameworkLog" fileName="${APP_LOG_ROOT}/app-framework.log"
            filePattern="${APP_LOG_ROOT}/app-framework-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <RollingFile name="debugLog" fileName="${APP_LOG_ROOT}/app-debug.log"
            filePattern="${APP_LOG_ROOT}/app-debug-%d{yyyy-MM-dd}-%i.log">
            <LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <RollingFile name="infoLog" fileName="${APP_LOG_ROOT}/app-info.log"
            filePattern="${APP_LOG_ROOT}/app-info-%d{yyyy-MM-dd}-%i.log" >
            <LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <RollingFile name="errorLog" fileName="${APP_LOG_ROOT}/app-error.log"
            filePattern="${APP_LOG_ROOT}/app-error-%d{yyyy-MM-dd}-%i.log" >
            <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
        <RollingFile name="perfLog" fileName="${APP_LOG_ROOT}/app-perf.log"
            filePattern="${APP_LOG_ROOT}/app-perf-%d{yyyy-MM-dd}-%i.log" >
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="1"/>
        </RollingFile>
        <RollingFile name="traceLog" fileName="${APP_LOG_ROOT}/app-trace.log"
            filePattern="${APP_LOG_ROOT}/app-trace-%d{yyyy-MM-dd}-%i.log" >
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="1"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="com.howtodoinjava.app.pref" additivity="false" level="trace">
            <AppenderRef ref="traceLog" />
            <AppenderRef ref="Console" />
        </Logger>
        <Logger name="com.howtodoinjava.app" additivity="false" level="debug">
            <AppenderRef ref="debugLog" />
            <AppenderRef ref="infoLog"  />
            <AppenderRef ref="errorLog" />
            <AppenderRef ref="Console"  />
        </Logger>
        <Logger name="org.framework.package" additivity="false" level="info">
            <AppenderRef ref="perfLog" />
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="warn">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

5. log4j2.xml 文件的位置

我们应将log4j2.xml放置在应用程序类路径的任何位置。 Log4j将扫描所有类路径位置以查找此文件并然后加载它。 我们大多可以在’src/main/resources’文件夹中找到此文件。

如果我们使用外部的log4j2配置文件,那么我们可以通过应用程序启动参数或系统属性log4j.configurationFile提供配置文件的路径。请注意,此属性值不仅限于本地文件系统上的位置,还可以包含URL。

-Dlog4j2.configurationFile=file:/home/lokesh/log4j2.xml

一个常见的做法是在junit测试类中标注@BeforeAll的方法中设置log4j.configurationFile属性。这将允许在测试期间使用任意命名的文件。

6.Demo

让我们编写一个Java类并写一些日志语句来验证日志是否出现在控制台和日志文件中。它将不同的日志级别记录到不同的日志中。

6.1 Core Log4j2 API

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Main {
    private static final Logger logger = LogManager.getLogger(Main.class);
    public static void main(final String... args)
    {
        logger.debug("Debug Message Logged !!!");
        logger.info("Info Message Logged !!!");
        logger.error("Error Message Logged !!!", new NullPointerException("NullError"));
    }
}

6.2. Log4j2 with SLF4j

正如开头所述,建议使用带有SLF4j API的Log4j。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);
    public static void main(final String[] args)
    {
        logger.debug("Debug Message Logged !!!");
        logger.info("Info Message Logged !!!");
        logger.error("Error Message Logged !!!", new NullPointerException("NullError"));
    }
}

 


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10374.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】