log4j2在JavaWeb项目中的配置与使用

背景:
    Tomcat版本8.0
    spring版本5.2.9
    log4j2的依赖有:log4j-api-2.14.0.jar、log4j-core-2.14.0.jar、log4j-web-2.14.0.jar

log4j2.xml配置如下:
实现日志分级别分别记录,且根据日期自动存储每日日志文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- configuration的status,用来设置log4j2自身内部的信息输出,可以不设置。当设置为trace时,会有各种详细输出 -->
<!-- monitorInterval: log4j能够自动检测修改配置文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="300">
	<appenders>
		<!--控制台输出所有日志 -->
		<console name="Console" target="SYSTEM_OUT">
			<!--输出日志的格式 -->
			<PatternLayout pattern="[%-5p] %d{yyyy-MM-dd HH:mm:ss} method:%l%n" />
		</console>
		
		<!-- 打印出info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
		<RollingFile name="InfoFile"
					fileName="E://logs/info.log"
					filePattern="E://logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
			<!-- 过滤器,表示只输出info级别的日志。ACCEPT:接收;DENY:拒绝;NEUTRAL:中立 -->
			<Filters>
				<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />	
				<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
			</Filters>
			<PatternLayout pattern="[%-5p] %d{yyyy-MM-dd HH:mm:ss} METHOD:%l%n%m%n%n" />
			<Policies>
				<TimeBasedTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="10MB" />
			</Policies>
			<!-- DefaultRolloverStrategy如不设置,则默认同一文件夹下最多7个文件,这里设置了31 -->
			<DefaultRolloverStrategy max="31"></DefaultRolloverStrategy>
		</RollingFile>
		
		<RollingFile name="WarnFile"
				fileName="E://logs/warn.log"
				filePattern="E://logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
			<Filters>
				<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" />
				<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
			</Filters>
			<PatternLayout pattern="[%-5p] %d{yyyy-MM-dd HH:mm:ss} method:%l%n%m%n%n" />
			<Policies>
				<TimeBasedTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="10MB" />
			</Policies>
			<DefaultRolloverStrategy max="31" />
		</RollingFile>
		
		<RollingFile name="ErrorFile"
				fileName="E://logs/error.log"
				filePattern="E://logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
			<ThresholdFilter level="error" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="[%-5p] %d{yyyy-MM-dd HH:mm:ss} method:%l%n%m%n%n" />
			<Policies>
				<TimeBasedTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="10MB" />
			</Policies>
			<DefaultRolloverStrategy max="31" />
		</RollingFile>
	</appenders>
	
	
	<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
	<loggers>
		<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
         <logger name="org.springframework" level="INFO"></logger>
         <logger name="org.mybatis" level="INFO"></logger>
		<!-- 只输出INFO及以上级别的日志 -->
		<root level="INFO">
			<appender-ref ref="Console" />
			<appender-ref ref="InfoFile" />
			<appender-ref ref="WarnFile" />
			<appender-ref ref="ErrorFile" />
		</root>
	</loggers>
</configuration>

注:
    1、日志级别优先排序:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
    2、一些常用的日志配置的参数说明:
    %d:日志日期格式
    %l:完成的位置,包括类名、方法名、文件名、行数
    %L:行号
     %m|%msg:错误信息,即logger.error(String msg)中的msg
     %M|%method:所在的方法名
     %p:日志级别
    %n:换行
    %t:当前线程名称
    %c:logger名称
    %C:类名
    %F|%file:文件名

需要在web.xml中增加配置如下:

  <!--上面log4j2配置文件的路径-->
  <context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>classpath:log4j2.xml</param-value>
  </context-param>
  <context-param>
    <param-name>log4jContextName</param-name>
    <param-value>star</param-value>
  </context-param>
  <context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>600000</param-value>
  </context-param>
  <!--log4j2监听器-->
  <listener>
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
  </listener>
  <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>

然后就可以在代码里使用啦,在需要记录日志的类里使用如下:

//定义logger
private Logger logger=LogManager.getLogger(this.getClass().getName());	
//记录日志
logger.info("记录日志:");

猜你喜欢

转载自blog.csdn.net/qq_38118138/article/details/118968407