ssm框架使用logback管理日志,满足每天输出想保存的日志文件,且文件大于10M时会创建新的.

    由于项目需要满足每天输出想保存的日志文件,且文件大于10M时会创建新的这个条件,且我用的是idea的maven项目,ssm框架,

所以我采用了logback的日志框架.为什么会选择logback框架?是因为logback比log4j效率更高,更利于管理.

    为什么我会记录这个经历,是因为这个日志管理确实蛮重要,而且还是我在学习logback的时候报了n多的错.我当时在百度找资料的时候,基本每个网页都阅读了一遍,苦不堪言.最后还是靠自己在百度上学习2天总结的经验,自己弄了一个.

好了,我们开始弄,

一 首先我们引入maven依赖

<!-- Log4j start -->
<!--<dependency>-->
  <!--<groupId>log4j</groupId>-->
  <!--<artifactId>log4j</artifactId>-->
  <!--<version>1.2.17</version>-->
<!--</dependency>-->
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.7</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-core</artifactId>
  <version>0.9.28</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-access</artifactId>
  <version>0.9.28</version>
</dependency>
<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>0.9.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.logback-extensions/logback-ext-spring -->
<dependency>
  <groupId>org.logback-extensions</groupId>
  <artifactId>logback-ext-spring</artifactId>
  <version>0.1.1</version>
</dependency>

因为要让spring监测,所以有最后面的那个依赖, 最初我引入的依赖,版本不是现在这个版本,我在百度上看到的依赖会报俩个监测的错,其实是SLF4J的版本跟logback版本的不兼容,SLF4J的版本高了,或者logback版本低了.这个错是启动报错.解决完开始下一步

二 我们可以先在web.xml里添加logback的监测

<context-param>
  <param-name>logbackConfigLocation</param-name>
  <param-value>classpath:logback.xml</param-value>
</context-param>
<listener>
  <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>

这步没报什么错,开始下一步

三 在mybatis-config.xml添加一些配置,我不知道为什么mybatis里会有日志配置,但没关系,我只需要知道可以配置选择哪种日志框架,

<setting name="logImpl" value="STDOUT_LOGGING"/>

    这个设置是说,它会自动去找日志框架,这个必须要,以前我配的是

<setting name="logImpl" value="LOG4J"/>

    到这一步的时候,我还出过一些问题,当时我找的是logback的资料,而这个logImpl设置里没logback的值,可选的值只有:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、STDOUT_LOGGING、NO_LOGGING这些.后来看的资料多了,就知道logback要配合SLF4J使用,所以我设置了

<setting name="logImpl" value="SLF4J"/>

到了这一步,环境是没什么问题,现在我们来配置logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
       说明:
       1、日志级别及文件
           日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中
           例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志,
           日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名
           例如log-level-2013-12-21.0.log
           其它级别的日志也是如此。
       3、Appender
           FILEERROR对应error级别,文件名以log-error-xxx.log形式命名
           FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名
           FILEINFO对应info级别,文件名以log-info-xxx.log形式命名
           stdout将日志信息输出到控制上,为方便开发测试使用
    -->
    <contextName>自己的项目名字</contextName>
    <property name="LOG_PATH" value="G:\\JavaWebLogs"/>
    <!--设置系统日志目录-->
    <property name="APPDIR" value="aaa"/>

    <!-- 日志记录器,日期滚动记录 错误-->
    <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,
            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>11===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--111111111111111111111111111111111111111111111111111111111111111111111111111-->
    <!-- 日志记录器,日期滚动记录  警告-->
    <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>22===%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222-->
    <!-- 日志记录器,日期滚动记录 信息-->
    <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${LOG_PATH}/${APPDIR}/log_info.log</file>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
            而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,
            命名日志文件,例如log-error-2013-12-21.0.log -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 追加方式记录日志 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>33==%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!--33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--encoder 默认配置为PatternLayoutEncoder-->
        <encoder>
            <pattern>44==%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
    </appender>
    <!--44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444-->
     <!--就是这个监控了mybatis日志输出,配合上面的“dao”-->
    <logger name="dao" level="debug" additivity="false">
        <appender-ref ref="FILEINFO"/>
    </logger>
    <logger name="dao" level="debug" additivity="false">
        <appender-ref ref="FILEWARN"/>
    </logger>
    <logger name="dao" level="debug" additivity="false">
        <appender-ref ref="FILEERROR"/>
    </logger>

    <!--这个是管理mybatis映射类的加载的跟事物管理的-->
    <logger name="org.mybatis" level="debug" additivity="false">
        <appender-ref ref="FILEINFO"/>
        <appender-ref ref="STDOUT"/>
        <!--<appender-ref ref="FILEERROR"/>-->
        <!--<appender-ref ref="FILEWARN"/>-->
    </logger>
    
    <root level="info">
        <appender-ref ref="FILEERROR"/>
        <appender-ref ref="FILEWARN"/>
        <appender-ref ref="FILEINFO"/>
        <!-- 生产环境将请stdout去掉 -->
        <appender-ref ref="STDOUT"/>
    </root>

</configuration>

    里面有些东西是调试的时候弄的,估计你们可能也需要,这个设置李的level真的是烦,那个appender有,logger有, root有很难懂它们之间的规律,起什么作用,互相有什么影响,我是用死办法,一个一个测试,来让它输出我想要的日志文件,都是泪,你知道你刚以为了解它们的规律,结果测试的时候立马就是另外一个结果,无语,反正能获得自己想要的日志文件就好.那个

<!--就是这个监控了mybatis日志输出,配合上面的“dao”-->
    <logger name="dao" level="debug" additivity="false">
        <appender-ref ref="FILEINFO"/>
    </logger>
    <logger name="dao" level="debug" additivity="false">
        <appender-ref ref="FILEWARN"/>
    </logger>
    <logger name="dao" level="debug" additivity="false">
        <appender-ref ref="FILEERROR"/>
    </logger>

这个是输出sql的,只要调用了dao里的sql,就会输出,下面这个是配合上面使用的,在mybatis-config.xml的配置SLF4J的下面添加

<setting name="logImpl" value="SLF4J"/>
<setting name="logPrefix" value="dao."/>

还有就是运行时error是logback.xml是捕获不到的,需要写一个帮助类GlobalExceptionHandler

import com.alibaba.fastjson.JSONObject;
import org.codehaus.plexus.util.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {

    private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Object handleException(Exception e) {
        logger.error(ExceptionUtils.getFullStackTrace(e));  // 记录错误信息
        String msg = e.getMessage();
        if (msg == null || msg.equals("")) {
            msg = "服务器出错";
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("message", msg);
        return jsonObject;
    }
}

    这是捕获运行时error的,还可配置将control的输入参数,输出结果,保存到info里,就是可以记录一次完整的请求, 就是将数据保存到logger.info(数据) 就行,这样调用的logger.info(数据)

    所以我保存的日志是sql (主要是看sql参数跟sql语句),error (错误),warn(警告) ,control的输入参数跟输出结果  这4个

所以效果是这样的




    因为没有超过10M的文件,所以就没有那个同名的_0  _1   _2  _3这种格式的文件

所以这个logback日志管理的效果是完成了,以后遇到新东西,我都会记录下来.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章