spring整合logback日志系统框架

来源:互联网 发布:梅雨知时节的小说 编辑:程序博客网 时间:2024/06/05 09:52

记录,生成应用的异常信息是维护应用的重要手段,项目中常用的spring框架整合日志,最流行的就是logback,我们公司目前用的也是这个。和spring整合比较简单。

log4j与logback简要比较
本文意在阐述用logback替代log4j作为Spring MVC项目的日志处理组件。这两者虽然作者相同,但log4j早已被托管给Apache基金会维护,并且自从2012年5月之后就没有更新了。而logback从出生开始就是其作者奔着取代log4j的目的开发的,因此一方面logback继承了log4j大量的用法,使得学习和迁移的成本不高,另一方面logback在性能上要明显优于log4j,尤其是在大量并发的环境下,并且新增了一些log4j所没有的功能(如将日志文件压缩成zip包等)。

先介绍下环境和框架:win7+tom7+jdk1.7+ssm+maven3.3.9

下面正式为spring框架加入日志。

1.引入logback整合spring的依赖和各个依赖的作用讲解

        <!-- 日志文件管理包 -->        <!-- logback引入依赖 -->        <!-- <dependency> -->        <!-- <groupId>log4j</groupId> -->        <!-- <artifactId>log4j</artifactId> -->        <!-- <version>${log4j.version}</version> -->        <!-- </dependency> -->        <!-- slf4j-api作为日志接入的接口 -->        <!-- <dependency> -->        <!-- <groupId>org.slf4j</groupId> -->        <!-- <artifactId>slf4j-api</artifactId> -->        <!-- <version>${slf4j.version}</version> -->        <!-- </dependency> -->        <!-- slf4j-log4j12:链接slf4j-api和log4j中间的适配器。 -->        <!-- <dependency> -->        <!-- <groupId>org.slf4j</groupId> -->        <!-- <artifactId>slf4j-log4j12</artifactId> -->        <!-- <version>${slf4j.version}</version> -->        <!-- </dependency> -->        <dependency>            <groupId>ch.qos.logback</groupId>            <artifactId>logback-classic</artifactId>            <version>1.1.3</version>        </dependency>        <dependency>            <groupId>org.logback-extensions</groupId>            <artifactId>logback-ext-spring</artifactId>            <version>0.1.2</version>        </dependency>        <dependency>            <groupId>org.slf4j</groupId>            <artifactId>jcl-over-slf4j</artifactId>            <version>1.7.12</version>        </dependency>        <!-- 日志文件管理包 -->

pom.xml中注释掉的部分是为了说明logback的依赖所需的jar包由下面那三个引入的依赖就很全面了。不需要上面log4j和slf4j这些引入。

如上所示是集成所需要的依赖,其中:
第一个logback-classic包含了logback本身所需的slf4j-api.jar、logback-core.jar及logback-classsic.jar。
第二个logback-ext-spring是由官方提供的对Spring的支持,它的作用就相当于log4j中的Log4jConfigListener;这个listener,网上大多都是用的自己实现的,原因在于这个插件似乎并没有出现在官方文档的显要位置导致大多数人并不知道它的存在。
第三个jcl-over-slf4j是用来把Spring源代码中大量使用到的commons-logging替换成slf4j,只有在添加了这个依赖之后才能看到Spring框架本身打印的日志–即info文件中打印出的spring启动日志信息,否则只能看到开发者自己打印的日志。

引入依赖后,对应在项目maven库中导入的logback相关jar如下图:
这里写图片描述

2.引入logback.xml日志配置文件。

这里特别注意引入位置(maven工程)在src/main/resource这个根目录下。

这里写图片描述

logback.xml配置信息

<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="60 seconds" debug="true">      <!-- 模块名称, 影响日志配置名,日志文件名 -->     <property name="appName" value="PersonalJiJin"/>    <property name="logMaxSize" valule="100MB"/>    <!--rootPath 日志路径,这里是相对路径,web项目eclipse下会输出到eclipse的安装目录下,如果部署到linux上的tomcat下,会输出到tomcat/bin目录 下 -->      <property name="rootPath" value="/home/wasadmin/logs"/>    <contextName>${appName}</contextName>   <!--控制台输出 -->     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>        </encoder>    </appender>    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">    <!-- 设置日志不超过${logMaxSize}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->        <file>${rootPath}/${appName}/debug/${appName}-dlog.log</file>        <!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <fileNamePattern>${rootPath}/${appName}/debug/${appName}-dlog-%d{yyyy-MM-dd}-%d.log</fileNamePattern>            <maxHistory>30</maxHistory>             <!-- 当天的日志大小 超过${logMaxSize}时,压缩日志并保存 -->             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                <maxFileSize>10MB</maxFileSize>            </timeBasedFileNamingAndTriggeringPolicy>        </rollingPolicy>         <!-- 日志输出的文件的格式  -->          <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>            <charset>UTF-8</charset>        </encoder>        <filter class="ch.qos.logback.classic.filter.LevelFilter">            <level>DEBUG</level>            <onMatch>ACCEPT</onMatch>            <onMismatch>DENY</onMismatch>        </filter>        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">            <level>DEBUG</level>        </filter>    </appender>    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>${rootPath}/${appName}/info/${appName}-ilog.log</file>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">        <fileNamePattern>${rootPath}/${appName}/all/${appName}-ilog-%d{yyyy-MM-dd}-%i.log</fileNamePattern>            <maxHistory>30</maxHistory>            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                <maxFileSize>10MB</maxFileSize>            </timeBasedFileNamingAndTriggeringPolicy>        </rollingPolicy>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>            <charset>UTF-8</charset>        </encoder>        <filter class="ch.qos.logback.classic.filter.LevelFilter">            <level>INFO</level>            <onMatch>ACCEPT</onMatch>            <onMismatch>DENY</onMismatch>        </filter>    </appender>    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">        <file>${rootPath}/${appName}/error/${appName}-elog.log</file>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <fileNamePattern>${rootPath}/${appName}/all/${appName}-elog-%d{yyyy-MM-dd}-%e.log</fileNamePattern>            <maxHistory>30</maxHistory>            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                <maxFileSize>10MB</maxFileSize>            </timeBasedFileNamingAndTriggeringPolicy>        </rollingPolicy>        <encoder>            <pattern>%d{yyyy-MM-dd HH:mm:ss}|%t|%p| %m |%logger:%L%n</pattern>            <charset>UTF-8</charset>        </encoder>        <filter class="ch.qos.logback.classic.filter.LevelFilter">            <level>ERROR</level>            <onMatch>ACCEPT</onMatch>            <onMismatch>DENY</onMismatch>        </filter>    </appender>    <!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName,下面还有另一种写法,就是涉及到name="关键包的日志输出级别" -->  <!--     <logger name="com.lin" additivity="false">   --><!--         <level value="debug" />   --><!--         <appender-ref ref="stdout" />   --><!--         <appender-ref ref="file" />   --><!--     </logger>   -->    <logger name="jdbc" level="INFO"/>    <logger name="org" level="INFO"/>    <logger name="net" level="INFO"/>    <logger name="sql" level="INFO"/>    <logger name="java.sql" level="INFO"/>    <logger name="javax" level="INFO"/>    <!--日志的输出级别由低到高(越来问题越严重)trace->debug->info->warn->error -->    <!-- root将级别为DEBUG及大于DEBUG的日志信息交给已经配置好的name='STDOUT'的appender处理,将信息打印到控制台-Console -->      <root level="DEBUG">    <!-- appender-ref标识这个appender将会添加到本应用的日志系统中 -->        <appender-ref ref="STDOUT"/>        <appender-ref ref="INFO"/>        <appender-ref ref="DEBUG"/>        <appender-ref ref="ERROR"/>    </root>    </configuration>

logback.xml日志配置文件的配置逻辑:
1.先对日志的基本配置声明:包括日志的输出路径— (日志路径,这里是相对路径,web项目eclipse下会输出到eclipse的安装目录下,如果部署到linux上的tomcat下,会输出到tomcat/bin目录 下 ) ,日志级别—(日志的输出级别由低到高(越来问题越严重)trace->debug->info->warn->error ),日志生成的文件名,日志文件大小等。
2.声明不同appender来具体定义系统不同级别的信息匹配记录,和生成文件的设置,只是定义,并没有引入本应用就不会用到。
3.为某些特定的包加上上面定义好的appender。用来区别对待系统一般的日志输出模式。
4.将定义好的appender添加到本应用的日志系统中。类是定时任务中先声明任务,在把任务加入到调度里才算这个任务开始被使用了。

3.在代码中对容易出现问题的地方引入日志记录。

主要分为两步:
1.在类下面声明全局的log
这里写图片描述
注意:如果在工具类中引入log,由于工具类的方法为static的,所以log也要声明为static才行。

private static Logger logger=LoggerFactory.getLogger(FileUtils.class);

2.在容易出问题的地方try...catch(){logger.error()}
这里写图片描述

配置完成,启动项目就可以看到控制台输出的日志信息。自己在笔记本上可以再eclips安装盘的根目录找到日志输出的文件目录和文件。
这里写图片描述
这就表示配置完成,日志效果有了。

参考资料:
1. Spring MVC集成slf4j-logback。如果想看更具体不放在src/main/resource根目录的logback.xml配置,可以点击这里。
2.logback与Spring、SpringMVC结合使用教程

原创粉丝点击