您的位置:首页 > 数据库

log4j2 配置(mybatis | 日志分级 | 打印指定类SQL)

2018-01-25 14:13 846 查看
上次急于做个小项目,直接copy一个项目框架,结果上线不到几天,“网管”说日志文件已经几十G了,差点被打死,

原因是把debug模式 把SQL 全部打印出来了,还有日志文件也没设置压缩,这次网上找找资料就改造了一下日志,(我也 一知半解,如有缺陷请留言) 日志采用 log4j2, (据说多线程下性能10倍于 log4j, logback)

1. 在 web.xml 中配置如下:

<!-- 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 -->
项目类路径下 ,一般为src/main/resources 添加文件 log4j2.xml ( 对就是这个名字) 内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="1800">
<properties>
<!-- 下面这二行随意,sys:catalina.home为tomcat的路径,这里的monitor只是我项目的名字  -->
<property name="LOG_HOME">${sys:catalina.home}/logs/monitor</property>
<property name="FILE_NAME">monitor</property>
</properties>

<Appenders>
<!-- 控制台日志  -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%-5level %logger{36} - %msg%n" />
</Console>

<!-- error 日志 -->
<RollingFile name="error-log" fileName="${LOG_HOME}/${FILE_NAME}_error.log"
filePattern="${LOG_HOME}/error/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.%level_log.gz"
immediateFlush="true">
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="90" />
</RollingFile>

<!-- warn 日志 -->
<RollingFile name="warn-log" fileName="${LOG_HOME}/${FILE_NAME}_warn.log"
filePattern="${LOG_HOME}/warn/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.%level_log.gz"
immediateFlush="true">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="90" />
</RollingFile>

<!-- info 日志 -->
<RollingFile name="info-log" fileName="${LOG_HOME}/${FILE_NAME}_info.log"
filePattern="${LOG_HOME}/info/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.%level_log.gz"
immediateFlush="true">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="90" />
</RollingFile>

<!-- debug 日志 -->
<RollingFile name="debug-log" fileName="${LOG_HOME}/${FILE_NAME}_debug.log"
filePattern="${LOG_HOME}/debug/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz"
immediateFlush="true">
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout
pattern="%date{yyyy-MM-dd HH:mm:ss} %level [%thread][%file:%line] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<DefaultRolloverStrategy max="90" />
</RollingFile>
</Appenders>
<Loggers>
<!-- 正式环境↓ 改为 info 级别 -->
<Root level="debug">
<!-- 这里是输入到文件-->
<appender-ref ref="error-log" />
<appender-ref ref="warn-log" />
<appender-ref ref="info-log" />
<!-- 正式环境 下面 ↓  两项删除     -->
<appender-ref ref="debug-log" />
<appender-ref ref="Console" />
</Root>
</Loggers>
</Configuration>


error > warn > info > debug

这里是做了日志的分级别存储,例如 warn-log 中 配置为

<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>

<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>

表示 如果出现error 的日志 因为 error > warn 所以这个也会记录error级别的日志,所以配置了上面表示不记录error的日志,

由于info ,debug 均小于 warn 所以不会记录,

日志输出的样子:





参数 <DefaultRolloverStrategy max="90" /> 表示 只保留最新的90个压缩文件

<SizeBasedTriggeringPolicy size="10 MB" /> 表示超过10M就会压缩,

TimeBasedTriggeringPolicy 这个参数表示根据时间来触发压缩间隔

大家可以如下代码测试一下 , (可以写for循环打印更多日志)

@RequestMapping("/log4j2")
@Controller
public class TestLog4j2Controller {

public static final Logger logger = LogManager.getLogger();

@RequestMapping("/debug")
public void debug() {
logger.debug("ddddddddddddddddddddddddddddddd");
}
@RequestMapping("/info")
public void info() {
logger.info("iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii");
}
@RequestMapping("/error")
public void error() {
logger.error("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
}
@RequestMapping("/warn")
public void warn() {
logger.warn("wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww");
}
}

LogManager.getLogger(); 这里不用写成 LogManager.getLogger(Xxx.class);(我看别人log4j都是这么写,不明嚼栗)

也可以指定 log4j2.xml 中配置的 RollingFile 名字 例如: LogManager.getLogger("info-log");

如果你想测试指定的 包下的SQL日志,或指定类的,

可以如下配置:在 <Loggers> 标签下加入

<logger name="com.XXX.monitor.mapping.XXXXMapper" level="TRACE" additivity="false">
<appender-ref ref="Console"/>
</logger>
name 可以写为指定的类,或者包名, (没测试过正则表达式)

<appender-ref ref="Console"/> 引用的就是上方打印控制台的日志

TRACE 还会打印查询出的数据。

差点忘记 mybatis配置文件中需要添加

<setting name="logImpl" value="LOG4J2"/>
还有 相关jar 包

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


完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: