log4j2实战--将MyBatis执行SQL记录到文件,按天分存

需求:将Mybatis的执行SQL,按天存日志文件。项目使用的是log4j2。

原先项目,都是将所有日志通通打印到控制台。现在需要将系统接收用户请求后,Mybatis的执行SQL,按天存日志文件。

当时在想:
把Mybatis的SQL打印到控制台容易实现,
日志按Level级别 按天存文件也容易实现,
但如何单独把Mybatis的SQL,按天存日志文件呢?

于是找了MyBatis日志配置说明
http://www.mybatis.org/mybatis-3/zh/logging.html

Mybatis 的内置日志工厂提供日志功能,内置日志工厂将日志交给以下其中一种工具作代理:

  • SLF4J
  • Apache Commons Logging
  • Log4j 2
  • Log4j
  • JDK logging

MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具。它会使用第一个查找得到的工具(按上文列举的顺序查找)。如果一个都未找到,日志功能就会被禁用。

可以在mybatis-config.xml 中,设定使用的日志组件。

<configuration>
  <settings>
    ...
    <setting name="logImpl" value="LOG4J2"/>
    ...
  </settings>
</configuration>

logImpl 可选的值有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING,或者是实现了接口org.apache.ibatis.logging.Log 的,且构造方法是以字符串为参数的类的完全限定名。



通过学习发现:Mybatis 中 SQL 语句的日志级别被设为DEBUG(JDK 日志设为 FINE),SQL执行结果的日志级别为 TRACE(JDK 日志设为 FINER)。

所以,如果某些查询可能会返回庞大的结果集,此时只想记录其执行的 SQL 语句而不想记录结果该怎么办,只要将日志级别调整为 DEBUG 即可达到目的。

可见:无论使用哪个日志组件、无论打印什么内容,均是按日志级别进行输出的。所以在本需求中,Mybatis的SQL按debug级别输出到指定地方即可。

无论是Mybatis框架,还是Spring、Java Mail框架,如果想看到框架底层运行的日志信息,配置日志级别为debug即可。

再次说明下,Mybatis 内置日志工厂将日志交给其中一种日志工具作代理。具体怎么做,由使用的日志工具决定,因此本需求MyBatis执行SQL的文件保存,是取决于使用的log4j2日志组件实现。

下面就来看一下log4j2具体的配置。

在log4j2中, 共有8个输出级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。

log4j2 的配置文件支持 xml、json、jsn 三种格式,默认情况下由系统自动加载,其要在classpath 可加载到的目录下。

日志配置文件主要配置2大类
1、配置输出源<Appenders>:日志输出到哪里。如控制台、file等
2、具体的日志配置<Loggers>:配置name,启用哪个Appender,以及日志级别等。

下面给出本需求的简单配置实现:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" monitorInterval="600">
    <!-- configure.status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE、ALL -->
    <!-- configure.monitorInterval 监控间隔 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置 -->

    <Properties>
        <property name="pattern">%d{yyyy/MM/dd HH:mm:ss.SSS} [%p] %t %c %m%n</property>
        <property name="basePath">/Users/lijianhua/Documents/my-log</property>
    </Properties>

    <!--配置appenders源:日志输出的地址-->
    <Appenders>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${pattern}"/>
        </Console>

        <RollingRandomAccessFile name="fileLogger"
                                 fileName="${basePath}/mybatis-sql.log"
                                 filePattern="${basePath}/mybatis-sql-%d{yyyy-MM-dd}.log"
                                 append="true">
            <PatternLayout pattern="${pattern}"/>

            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>

    <!--配置logers:级别、使用的输出地-->
    <Loggers>
        <Logger name="com.ljheee.app.dao" level="debug" additivity="true">
            <appender-ref ref="fileLogger" level="debug"/>
        </Logger>

        <Root level="info" additivity="false">
            <appender-ref ref="console"/>
        </Root>
    </Loggers>
</Configuration>

通常log4j 采用properties文件配置。log4j2 采用xml文件配置。

log4j2 的xml文件配置,根节点是<Configuration>,它有2个可选属性:

  • status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL
  • monitorInterval 监控间隔 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置。

1、配置输出源<Appenders>:

配置日志输出到哪里。如控制台、file等。

<Appenders>下通常有一个<Console> 表示日志都输出到控制台,方便开发期间进行查看。

另一个是<RollingRandomAccessFile>,按时间和文件大小滚动(rollover)的RollingRandomAccessFile Appender,名字真是够长,但不光只是名字长,相比RollingFileAppender有很大的性能提升,官网宣称是20-200%。

rollover的意思是当满足一定条件(如文件达到了指定的大小,达到了指定的时间)后,就重命名原日志文件进行归档,并生成新的日志文件用于log写入。如果还设置了一定时间内允许归档的日志文件的最大数量,将对过旧的日志文件进行删除操作。

这里说的“满足一定条件”,是需要触发的,需要配置基于时间的、或基于日志文件大小的触发策略,也就是如下配置:

            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>

关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval,日期格式精确到哪一位,interval也精确到哪一个单位。在本示例中,filePattern最小单位是天,interval=1也就是一天一个日志文件。

TimeBasedTriggeringPolicy基于时间的触发策略
属性 解释
interval (integer)该属性是相对 RollingFile.filePattern 中的 %d{yyyy-MM-dd}值,例:filePattern=”xxx%d{yyyy-MM-dd}xx” interval=”2” 表示将2天一个日志文件;filePattern=”xxx%d{yyyy-MM-dd-HH}xx” interval=”1”表示一个小时一个日志文件
modulate (boolean)以0点为边界进行偏移计算

2、具体的日志配置<Loggers>:

配置name,启用哪个Appender,以及日志级别等。

重点说明

<Logger name="com.ljheee.app.dao" level="debug" additivity="true">
            <appender-ref ref="fileLogger" level="debug"/>
</Logger>

MyBatis支持多种粒度的日志记录:

1、可以记录某个映射器接口的日志
将name设为name="com.ljheee.app.dao.UserMapper"
就会记录 com.ljheee.app.dao.UserMapper 的详细执行操作,且仅记录应用中其它类的错误信息(若有)。

2、还可以将日志的记录方式从接口级别切换到语句级别,从而实现更细粒度的控制。如下配置只对 select 语句记录日志:
将name设为name="com.ljheee.app.dao.UserMapper.select"

3、当然也可以按实例配置到包级别,在DAO层,将包下所有MyBatis的mapper接口均使用日志记录。

小结:

log4j2 是Apache开发的一款log4j的升级产品,在某些特定的场景上面,甚至可以比之前的速度快上10倍。在保证log的组件更加快速的同时,同时所需的内存更加少。

上面在说RollingRandomAccessFile时,也说到性能很高,因为log4j2 内部使用了Disruptor高性能并发框架,输出日志采用异步输出,极高地提升了日志输出性能,因此也建议将后续的应用日志方式,切换到log4j2。

log4j2 配置示例https://howtodoinjava.com/log4j2/log4j-2-xml-configuration-example/
log4j2文档https://logging.apache.org/log4j/2.x/manual/appenders.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容

  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 4,979评论 0 6
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,019评论 1 13
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,796评论 6 342
  • 一、Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layo...
    默默守护阅读 1,907评论 2 8
  • 昨天的你坐在堆积如山的高三里埋头苦干,一摞摞的试卷,一根根儿的笔芯,一本本的课堂笔记,还有一杯杯的咖啡. 你早上不...
    四毛姐姐阅读 480评论 0 0