学习Java springMVC的系列文章,在这里使用log4j2输出日志。
视频发布在youtube上面了
https://youtu.be/0IJPTKJGNhA
优酷上面的链接
http://v.youku.com/v_show/id_XMjc4NzY2NTcyOA==.html?f=49760672
005 使用log4j2输出日志(重构)
接着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>
|
备注:
- age的单位:D、H、M、S,分别表示天、小时、分钟、秒
- 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
|