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,相当于只对这一个类起作用。