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

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值