Log4j2设置与使用(基于Spring4的Maven项目)

Maven配置

属性设置:

<properties>
    <log4j2.version>2.5</log4j2.version>
</properties>

依赖设置:

<!--Log4j dependencies -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.5</version>
</dependency>

如果同时使用了slf4j包(例如使用quartz包就会自带一个slf4j包的依赖),则需额外添加依赖包(这个包目前还是beta版,以后可以查一下有没有新版的可以替换):

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.0-beta9</version>
</dependency>

web.xml配置

添加listener和filter:

<!-- log4j2-begin -->
<listener>
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
    <filter-name>log4jServletFilter</filter-name>
    <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>log4jServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
<!-- log4j2-end -->

添加配置文件

log4j2不再支持原来的log4j.properties配置。如需修改默认配置,需在classpath下配置log4j2.xml文件。

在不设置log4j2.xml文件时,log4j2默认采用下面的配置[1]

<?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>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

该配置只有一个Appender:Console,目标是SYSTEM_OUT,即日志内容,都会打印在eclipse控制台上。Root Logger的级别是error,即:所有error及以上级别的日志才会记录。(注:日志级别顺序为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL ),所以最终只有2日志会输出(error,fatal)。

配置第1行中的status="WARN",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF,设置成“WARN”指:所有log4j2的event信息中,只有WARN及以上级别的信息才记录。

下面是一个非默认log4j2.xml的配置范例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off"> <!--monitorInterval="1800" -->
    <properties>
        <property name="WEBAPP_HOME">${sys:catalina.home}/webapps</property>
        <property name="LOG_HOME">testApp/logs</property>
        <property name="FILE_NAME">testApp</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <RollingRandomAccessFile name="running-log"
            fileName="${WEBAPP_HOME}/${LOG_HOME}/${FILE_NAME}.log"
            filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout
                pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Logger name="com.test.common.TestApp" level="info" additivity="false">
            <AppenderRef ref="running-log" />
        </Logger>
        <Root level="trace">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

monitorInterval="1800" 指log4j2每隔1800秒(半小时),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置;

RollingRandomAccessFile 即表示以文件方式记录,注意一下filePattern 的设置,它与20行的SizeBasedTriggeringPolicy (表示单个文件最大多少容量)结合在一起,非常有用,以这段配置为例,当单个文件达到10M后,会自动将以前的内容,先创建(年-月)的目录,然后按 "xxx-年-月-日-序号"命名,打成压缩包;

DefaultRolloverStrategy max="20"表示压缩包,最多保留20个

Logger标签定义一个新logger,在level中设置级别 ,使用文件方式来记录日志,additivity="true" 这里注意一下,因为下面还有一个root logger,任何其它的logger最终都相当于继承自root logger,所以“com.test.common.TestApp”这个logger中,如果记录了info及以上级别的日志,除了文件里会记录外,root logger也会生效,即:控制台也会输出一次。如果把additivity="true" 中的true,改成false,root logger就不会再起作用,即只会记录在文件里,控制台无输出。

另外关于logger的命名,对于Logger配置中已经明确指定类名的(例如上面例子里的com.test.common.TestApp),那么在生成logger时,可以不用指定classname:

static Logger logger = LogManager.getLogger();

配置中的同名logger,相当于只对这一个类起作用。

参考链接:

[1] log4j2与spring mvc整合
[2] log4j2官方user's guide(PDF)

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 137,080评论 19 139
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,182评论 0 6
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,320评论 1 13
  • 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的 ...
    OzanShareing阅读 1,129评论 0 2
  • 转自:http://www.cnblogs.com/warking/p/5710303.html 一、logbac...
    chenzhong_阅读 1,592评论 0 3

友情链接更多精彩内容