005 使用log4j2输出日志(重构)

来源:互联网 发布:linux php编译 编辑:程序博客网 时间:2024/06/02 01:12

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