log4j v2版本的配置和使用

一、前言

  Log4j目前使用的有两个版本,分别是v1.x和2.x,相关的信息可以查看官方文档:http://logging.apache.org/log4j/2.x/index.html

 

二、引入依赖

  本文介绍log4j 2的用法,所以引入v2的jar包

<!--https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>2.12.1</version>
</dependency>

  

三、配置log4j

  可以参考官方文档:http://logging.apache.org/log4j/2.x/manual/configuration.html

  log4j v1使用properties文件进行配置;而log4j v2,常见的做法是使用xml进行配置。

  在resources目录下创建一个log4j2.xml,注意不是log4j.xml,先看下面的一个简单的配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
	<Appenders>
		<Console name="log_to_console" target="SYSTEM_OUT">
			<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
		</Console>

		<File name="log_to_file" fileName="/opt/logs/app.log">
			<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
		</File>
	</Appenders>

	<Loggers>
		<Root level="info">
			<AppenderRef ref="log_to_console"/>
		</Root>
	</Loggers>
</Configuration>

  上面这个配置中,<Configuration>下有<Appenders>和<Loggers>两个标签。

  其中<Appenders>可以理解为日志的输出方式,可以是日志文件(File),也可以是可控制台输出(Console)。

 

3.1、<appenders>配置日志输出方式

  日志输出方式一般有两种,控制台输出(Console)和日志文件输出(File),在log4j 2中,分别对应<Console>和<File>标签。

<Appenders>
	<Console name="log_to_console" target="SYSTEM_OUT">
		<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
	</Console>

	<File name="log_to_file" fileName="/opt/logs/app.log">
		<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
	</File>
</Appenders>

  上面定义了两个日志输出方式:

  Console的输出方式,名称为log_to_console(这个名称是为了后面需要引用它),输出到SYSTEM_OUT(也就是控制台了);

  File的输出方式,名称为log_to_file(名称可以随意指定),然后指定了日志文件的路径为/opt/logs/app.log。

  Console和File,其实可以统称为<Appender>(因为在<Appenders>标签下嘛)。

  这两个标签都有一个<PatternLayout>标签,这就是指定输出的日志格式,具体的格式可以查看官方文档。

  

  虽然日志有Console和File两种形式,但是还是<Appenders>中却可以配置多个Appender,比如虽然都为日志文件输出形式,但是文件名不同,就是不同的Appender,并不会冲突:

<Appenders>
	<Console name="log_to_console" target="SYSTEM_OUT">
		<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
	</Console>

	<File name="log_to_file" fileName="/opt/logs/app.log">
		<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
	</File>

	<!-- 再定义一个日志文件输出的Appender -->
	<File name="log_to_file_two" fileName="/opt/logs/app_2.log">
		<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
	</File>
</Appenders>

  

3.2、<Loggers>配置日志级别

  log4j 2有trace、debug、info、warn、error、fatal这几种日志级别,按照顺序严重程度递增。

  而<Loggers>可以理解配置不同的日志级别使用不同的日志输出方式,看下面的配置:

<Loggers>
	<Root level="error">
		<AppenderRef ref="log_to_file"/>
	</Root>
	
	<logger level="info">
		<AppenderRef ref="log_to_console"/>
	</logger>

	<logger level="warn">
		<AppenderRef ref="log_to_file_two"/>
	</logger>
</Loggers>

  上面的配置中,配置了三个<logger>(<Root>也算一个<logger>),每一个<logger>下面有一个<AppenderRef>,指定以什么形式输出日志(File还是Console)。

  <Root>是一个比较特殊的<logger>,用来定义全局的日志界别,

  一个<logger>下面可以有一个或者多个<AppenderRef>:

  1、上面定义了全局的,只要是error级别或者比如error更高,都会将将日志写到/opt/logs/app.log中(log_to_file是前面<Appenders>中配置的);

  2、日志界别为info或者比info更高的级别,就会将日志输出到控制台(log_to_console是前面<Appenders>中配置的);

  3、日志界别为warn或者比warn更高的级别,就会将日志输出到/opt/logs/app_2.log(log_to_file_two是前面<Appenders>中配置的);

 

3.3、稍微拓展

  一个级别的日志,比如info日志,我们可能既需要输出到控制台,也需要输出到日志文件中。

  log4j 2可以这样做,前面已经说过了,一个<logger>下可以有多个<AppenderRef>,比如下面这段配置:

<Loggers>
	<Root level="error">
		<AppenderRef ref="log_to_file"/>
	</Root>

	<!-- info或比info更高级别的日志,既输出到控制台,也输出到日志文件中-->
	<logger level="info">
		<AppenderRef ref="log_to_console"/>
		<AppenderRef ref="log_to_file"/>
	</logger>
</Loggers>

  

3.4、结合<Appenders>和<loggers>

  有了前面的了解,下面是一个例子,就可以理解了:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
	<Appenders>
		<Console name="log_to_console" target="SYSTEM_OUT">
			<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
		</Console>

		<Console name="log_to_console_two" target="SYSTEM_OUT">
			<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
		</Console>

		<File name="log_to_file" fileName="/opt/logs/app.log">
			<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
		</File>
		
		<File name="log_to_file_two" fileName="/opt/logs/app_2.log">
			<PatternLayout pattern=" %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %logger{36} - %msg%n"/>
		</File>
	</Appenders>

	<Loggers>
		<Root level="error">
			<AppenderRef ref="log_to_console"/>
			<AppenderRef ref="log_to_file"/>
		</Root>
		
		<logger level="info">
			<AppenderRef ref="log_to_console"/>
			<AppenderRef ref="log_to_file"/>
		</logger>

		<logger level="warn">
			<AppenderRef ref="log_to_console_two"/>
		</logger>
	</Loggers>
</Configuration>

  

 

  

  

 

 

 

  

posted @ 2018-12-11 14:33  寻觅beyond  阅读(1742)  评论(0编辑  收藏  举报
返回顶部