3、Spring技术栈-整合Log4j2

2、Spring技术栈-博客系统整合Mybatis中我们整合了Mybatis,这篇文章我们主要介绍如何整合Log4j2以及相关配置。

1、先了解log4j

在应用程序中添加日志记录总的来说基于三个目的:

  1. 监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工作;
  2. 跟踪代码运行时轨迹,作为日后审计的依据;
  3. 担当集成开发环境中的调试器的作用,向文件或控制台打印代码的调试信息。

最普通的做法就是在代码中嵌入许多的打印语句,这些打印语句可以输出到控制台或文件中,比较好的做法就是构造一个日志操作类来封装此类操作,而不是让一系列的打印语句充斥了代码的主体。

在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包Log4j。

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

此外,通过Log4j其他语言接口,您可以在C、C+ +、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。

2、再来看log4j2

Log4j1.x 在很多应用程序中都得到了广泛的采纳和使用,然而,这些年对它的开发基本已经停止了。因为兼容老版本的java让它的维护变得非常的困难,所以在2015年8月份时已经停止了对log4j1.x的更新。而作为其代替品, slf4j/logback做出了许多必要改进,为什么还需要log4j2? 主要有以下几个原因:

  1. Log4j2被设计用来作为审计日志框架,log4j 1.x 和Logback在重载配置时都会丢失事件,但是Log4j2不会。在Logback中,Appenders中的异常信息对于应用程序来说是不可见的,Log4j2的Appenders中的异常可以通过配置渗透到应用程序中。
  2. Log4j2 包含基于 LMAX Disruptor library(一个多线程框架https://lmax-exchange.github.io/disruptor/)的下一代 Asynchronous Loggers,在多线程环境下, Asynchronous Loggers相比slf4j/ logback提高了10倍以上的吞吐量,并且有着更低的延时。
  3. Log4j2 对于单例应用程序来说时无垃圾的,并且在稳态记录期间对于web应用程序来说垃圾是很少的。这就减少了垃圾回收器的压力且能够给予更好的执行响应时间。
  4. Log4j2使用了一个插件系统,这个插件系统通过添加新的Appenders, Filters, Layouts, Lookups轻松的拓展框架,并且插件系统的设计模式约定拓展框架时不需要修改Log4j。
  5. 由于插件系统的配置很简单,所以在配置时都不需要指定具体的类名。
  6. 支持自定义日子级别。自定义日志级别可以在代码或者配置文件中定义。
  7. 支持Lambda表达式。在要求的日志级别启用的情况下,运行在java 8上的客户端程序可以使用Lambda表达式延迟构造日志消息。不需要显示的日志级别检查,使得代码更简洁。
  8. 支持消息对象,消息允许支持有趣和复杂的结构,传递到日志记录系统,并且可以高效的操作。用户可以自由创建消息类型和编写Layouts, Filters and Lookups来操作这些消息。
  9. Log4j1在Appenders 上支持Filters 。Logback增加了TurboFilters,允许事件在被Logger处理之前进行过滤。Log4j2支持可配置的过滤器,该过滤器可以在Logger之前处理事件,因为这些事件是被Logger或者在Appender之上处理。
  10. 许多Logback的Appenders不接受Layout,并且只能按照固定格式发送日志数据。大部分 log4j2的Appenders接收Layout配置,允许日志数据按照任何所需格式传输。
  11. Log4j1与logback的Layouts是返回一个String类型,这可能导致一些编码问题。Log4j2使用了简单的方式:返回一个 byte数组。这样一个优点就意味着它可以用在几乎任何appenders上,并不局限于写入OutputStream的情况。
  12. Syslogappender支持 TCP与UDP,以及BSDsyslog和 RFC5424格式。
  13. Log4j2得益于java5的并发支持,将锁的可能降到最低水平。Log4j1有已知的死锁问题,在Logback中很大一部分都已经被修复,但是很多Logback的类任然需要使用synchronization来保持在相当高的锁级别。
  14. Apache 开源

3、博客系统中的配置

由于日志我们在每一个模块都要使用,所以日志的依赖我们就配置在父级项目中,在父级项目blog的pom.xml文件中增加如下依赖:

<!-- LOGGING begin -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>${log4j2_version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>${log4j2_version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>${log4j2_version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<!-- common-logging 实际调用slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<!-- java.util.logging 实际调用slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- LOGGING end -->

4、配置web.xml

一个servlet3.0及以上的web应用程序是指任何web-app的version是3.0或者更高的。当然,应用程序必须可以兼容在web容器中运行。比如有些:Tomcat7.0及更高,Glassfish3.0及更高,JBoss7.0及更高或者WebLogic12c及更高,WebSphere8.0及更高。

Log4j 2‘只工作在’servlet3.0或者更高的web应用中。它能够在应用程序启动时自动启动在应用关闭时自动卸载。多亏有servlet3.0中增加的ServletContainerInitializer API,相关联的Filter和ServletContextListener类可以在web应用中启动的时候动态的进行注册。

Log4j2 Web JAR文件是一个配置在其它web片段前的web片段,它包含了一个容器自动发现并初始化的ServletContainerInitializer(Log4jServletContainerInitializer),它将Log4jServletContextListener和Log4jServletFilter添加到ServletContext中。这些类初始化或者取消初始化Log4j的配置。

对于某些用户来说,自动启动Log4j是有问题的或者不受欢迎的。你可以使用isLog4jAutoInitializationDisabled参数来关闭自动启动。在web.xml中进行如下设置,即可自动取消启动。

<context-param>
    <param-name>isLog4jAutoInitializationDisabled</param-name>
    <param-value>true</param-value>
</context-param>

5、log4j2.xml配置

我们的系统将错误日志记录到error_ron_blog,其他日志记录到ron_blog中,日志放在F:/MyProject/ron_blog/blog/logs目录下,读者可按照自己的具体情况自行定义。具体配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace" monitorInterval="30">
    <!-- Dev -->
    <Properties>
        <Property name="DETAIL_LOG_NAME">ron_blog</Property>
        <Property name="ERROR_LOG_NAME">error_ron_blog</Property>
        <Property name="LOG_HOME">F:/MyProject/ron_blog/blog/logs</Property>
    </Properties>

    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36}#%M [line:%L] - %msg%xEx%n" />
        </Console>

        <RollingFile name="detailLog" filename="${LOG_HOME}/${DETAIL_LOG_NAME}.log" filepattern="${LOG_HOME}/${DETAIL_LOG_NAME}-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36}#%M [line:%L] - %msg%xEx%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="100" />
        </RollingFile>

        <RollingFile name="errorLog" fileName="${LOG_HOME}/${ERROR_LOG_NAME}.log" filePattern="${LOG_HOME}/${ERROR_LOG_NAME}.%d{yyyy-MM-dd}.%i.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %class{36}#%M [line:%L] - %msg%xEx%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="60" />
        </RollingFile>
    </Appenders>

    <Loggers>
        <Root level="trace">
            <AppenderRef ref="console" level="trace"/><!--部署到服务器上时要注释掉 -->
            <AppenderRef ref="detailLog" level="debug"/>
            <AppenderRef ref="errorLog" level="error"/>
        </Root>

    </Loggers>
</Configuration>

这样我们系统对Log4j2的配置基本上已经配置完成,接下来我们需要将Mybatis日志实现配置成Log4j2.

6、让Mybatis支持Log4j2

上一篇文章,我们已经讲了如何整合Spring和Mybatis,接上一篇文章,我们在spring-mybatis.xml文件中sqlSessionFactory的bean中增加一个configLocation属性,将值指向Mybatis目录下的mybatis-config.xml文件

<!-- mybatis的配置文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:ron/blog/blog_dao/mapper/*/*.xml"/>
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
</bean>

然后我在resources/mybatis目录下新增mybatis-config.xml文件,并写入如下内容。

<?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>
        <!-- 使用Map封装数据是,如果字段是null值,也会封装 -->
        <setting name="callSettersOnNulls" value="true"/>
        <!-- 使用log4j2 -->
        <setting name="logImpl" value="LOG4J2"/>
        <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
        <setting name="aggressiveLazyLoading" value="true"/>
    </settings>
</configuration>  

这样,我们的Mybatis就支持Log4j2,启动我们的应用程序,您就会发现在您的日志目录下会生成对应的文件并写入了对应的日志内容。

整个项目源码:https://github.com/Ron-Zheng/blog-system

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RonTech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值