005 使用log4j2输出日志(重构)
视频发布在youtube上面了
https://youtu.be/0IJPTKJGNhA
优酷上面的链接
http://v.youku.com/v_show/id_XMjc4NzY2NTcyOA==.html?f=49760672
接着004的项目操作。
添加log4j2依赖,这个会自动添加相关依赖包
<!-- 日志依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.8.2</version>
</dependency>
添加log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- status 是否记录log4j2本身的event信息默认OFF print level:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
monitorInterval 300秒检查一下配置,如果有变化不需要重启服务,会自动更新
-->
<Configuration package="log4j.test" status="WARN" monitorInterval="300">
<properties>
<!-- sys:user.home catalina.base -->
<property name="LOG_HOME">${sys:user.home}/logs</property>
</properties>
<!-- output destination -->
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout charset="UTF-8"
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<!-- fileName:当前日志存储路径
filePattern 历史日志存储路径 -->
<RollingRandomAccessFile name="RollingFileInfo"
fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd HH-mm}-%i.log.gz">
<Filters>
<ThresholdFilter level="WARN" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<!-- 这里的1的单位是filePattern里面的%d{yyyy-MM-dd HH-mm}-%i.log 最小的单位mm表示分钟 -->
<TimeBasedTriggeringPolicy interval="1" />
<!-- 日志文件大小 -->
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<!-- 最多保留文件数 -->
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="RollingFileWarn"
fileName="${LOG_HOME}/warn.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd HH-mm}-%i.log.gz">
<Filters>
<ThresholdFilter level="ERROR" onMatch="DENY"
onMismatch="NEUTRAL" />
</Filters>
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<!-- 这里的1的单位是filePattern里面的%d{yyyy-MM-dd HH-mm}-%i.log 最小的单位mm表示分钟 -->
<TimeBasedTriggeringPolicy interval="1" />
<!-- 日志文件大小 -->
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<!-- 最多保留文件数 -->
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="RollingFileError"
fileName="${LOG_HOME}/error.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd HH-mm}-%i.log.gz">
<ThresholdFilter level="ERROR" />
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
<Policies>
<!-- 这里的1的单位是filePattern里面的%d{yyyy-MM-dd HH-mm}-%i.log 最小的单位mm表示分钟 -->
<TimeBasedTriggeringPolicy interval="1" />
<!-- 日志文件大小 -->
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
<!-- 最多保留文件数 -->
<DefaultRolloverStrategy max="20" />
</RollingRandomAccessFile>
</Appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
<Loggers>
<Logger name="com.study.test.TestUser" level="trace"
additivity="false">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFileInfo" />
<AppenderRef ref="RollingFileWarn" />
<AppenderRef ref="RollingFileError" />
</Logger>
<logger name="org.mybatis" level="trace" additivity="false">
<AppenderRef ref="Console" />
</logger>
<Root level="all">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
注意这里Logger后面的name是类的名字,可以根据灵活配置,这里Root设置为all是为了方便看输出信息,正常使用时根据需要配置,additivity是表示会不会叠加输出日志,没有声明的logger都是继承Root的设置,如果没有additivity=false,会输出2次同样的信息
删除24小时之前的日志
<DefaultRolloverStrategy max="24">
<Delete basePath="${MSG_LOG_HOME}" maxDepth="2">
<IfFileName glob="*/msg.*.zip" />
<IfLastModified age="24H" />
</Delete>
</DefaultRolloverStrategy>
备注:
1. age的单位:D、H、M、S,分别表示天、小时、分钟、秒
2. basePath表示日志存储的基目录,maxDepth=“1”表示当前目录。因为我们封存的历史日志在basePath里面的backup目录,所以maxDepth设置为2。
在类里面创建一个对象,注意引入的包
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
...
private static final Logger logger = LogManager.getLogger(TestUser.class.getName());
调用样例
for (int i = 0; i < 10; ++i)
{
logger.trace("trace level");
logger.debug("debug level");
logger.info("info level");
logger.warn("warn level");
logger.error("error level");
logger.fatal("fatal level");
try {
Thread.sleep(1000 );
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
输出类对象格式化使用fastjson
引入依赖包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
代码里面直接调用即可
logger.info(JSON.toJSONString(user));
这里数据库增加了时间字段,所以json输出的时候需要换个接口
logger.info(JSON.toJSONStringWithDateFormat(user,"yyyy-MM-dd HH:mm:ss"));
修改springMVC.xml里面的druid数据源配置,增加log4j2输出
...
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />
<!-- 配置监控统计拦截的filters,采用log4j2作为日志实现 -->
<!-- <property name="filters" value="stat" /> -->
<property name="filters" value="mergeStat,log4j2" />
</bean>
配置mybatis支持log4j2输出,在resources目录下创建mybatis.xml文件
参考官方网址
http://www.mybatis.org/mybatis-3/configuration.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- 配置日志类,默认是Commons Logging -->
<setting name="logImpl" value="LOG4J2" />
<setting name="cacheEnabled" value="true" />
<setting name="lazyLoadingEnabled" value="true" />
<setting name="multipleResultSetsEnabled" value="true" />
<setting name="useColumnLabel" value="true" />
<setting name="useGeneratedKeys" value="false" />
<setting name="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="100" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<setting name="jdbcTypeForNull" value="OTHER" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>
</configuration>
上面的大部分内容都是网上考过来的,具体用途目前还没用到,所以没去研究,只有第一个logImpl是本次要用到的,配置mybatis的日志系统。
还要配置一下springMVC.xml把mybatis的配置文件包含进去,找到如下字段然后添加
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="mapperLocations" value="classpath:com/test/t2/mapping/*.xml"></property>
<property name="configLocation" value="classpath:mybatis.xml" />
</bean>
正常就可以看到mybatis的输出信息了
如果有需要交流的,或者有更好的实现方法的同学,欢迎通过电子邮件来互通有无,共同进步。
ascomtohom@126.com