zoukankan      html  css  js  c++  java
  • Spring+Log4j的集成总结

    • 导入依赖的jar包

      

    <log4j.version>1.2.16</log4j.version>

    <!--
    自动引入slf4j-api.jar,log4j.jar,以及slf4j-log4j12.jar--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency>
    • web.xml中配置Log4j

      

    <!-- 配置log4j.xml监听器 --> 
    <listener> 
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener>
    <!-- 配置加载log4j.xml文件路径 -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j.xml</param-value>
    </context-param>
    <!-- 配置log4j.xml变量,如果需要动态的就使用下面方式,使用方法${name} -->
    <context-param>
        <param-name>errorLevel</param-name>
        <param-value>ERROR</param-value>
    </context-param>
    <context-param>
        <param-name>infoLevel</param-name>
        <param-value>INFO</param-value>
    </context-param>
    <context-param>
        <param-name>debugLevel</param-name>
        <param-value>DEBUG</param-value>
    </context-param>
    <context-param>
        <param-name>rootLevel</param-name>
        <param-value>ALL</param-value>
    </context-param> 
    • 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>  
            <setting name="logImpl" value="LOG4J" /><!-- 这里不加也可以实现sql打印,估计内部有这方面的检测规则 -->
        </settings>
        <!-- 实体类,简称 -设置别名 -->  
        <typeAliases>  
            <typeAlias alias="User" type="com.only.mate.entity.User" />  
        </typeAliases>  
        <!-- 实体接口映射资源 -->  
        <!--  说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,
            因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml -->  
        <mappers>  
            <mapper resource="com/only/mate/mapper/UserMapper.xml" />  
        </mappers>  
    </configuration>
    • 引入Log4j.xml配置文件
    <?xml version="1.0" encoding="UTF-8"?>    
    <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <!-- 
            off:************最高等级的,用于关闭所有日志记录
            fatal(Object message):输出FATAL级别的消息。
            error(Object message):输出ERROR级别的消息。
            warn (Object message):输出WARN级别的消息。
            info (Object message):输出INFO级别的消息。
            debug(Object message):输出DEBUG级别的消息。
            trace(Object message):输出TRACE级别的消息。
            all:************最低等级的,用于打开所有日志记录
            注:只有当输出日志的级别大于或等于为日志配置器配置的日志级别时,这个方法才会执行
         -->
        
        
        <!-- 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 -->
        <!-- [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender -->
        <appender name="console" class="org.apache.log4j.ConsoleAppender">  <!-- name提供给logger或者root调用 -->
            <param name="encoding" value="UTF-8" />  <!-- 保存字符集 -->
            <param name="target" value="System.out" />  <!-- 输出到控制台 -->
            <layout class="org.apache.log4j.PatternLayout"> <!-- loyout表示输出方式,可以多种,class值区分,PatternLayout表示自定义格式 -->
                <param name="ConversionPattern"
                    value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />  <!-- 输出格式,后面解释 -->
            </layout>
            <!--filter过滤器设置输出的级别:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF 所有下面输出的是debug到warn不会有error和fatal -->
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <param name="levelMin" value="DEBUG" />
                <param name="levelMax" value="FATAL" />
                <param name="AcceptOnMatch" value="TRUE" />  
            </filter>
            <!-- 设置Filter:
                    包括选择过滤器和设置过滤条件,可选择的过滤器包括:LogLevelMatchFilter、LogLevelRangeFilter、和StringMatchFilter:
                    对LogLevelMatchFilter来说,过滤条件包括LogLevelToMatch和AcceptOnMatch(true|false), 只有当log信息的LogLevel值与LogLevelToMatch相同,且AcceptOnMatch为true时才会匹配。
                    LogLevelRangeFilter来说,过滤条件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有当log信息的LogLevel在LogLevelMin、LogLevelMax之间同时AcceptOnMatch为true时才会匹配。
                    对StringMatchFilter来说,过滤条件包括StringToMatch和AcceptOnMatch,只有当log信息的LogLevel值与StringToMatch对应的LogLevel值与相同, 且AcceptOnMatch为true时会匹配。
                    过滤条件处理机制类似于IPTABLE的Responsibility chain,(即先deny、再allow)不过执行顺序刚好相反,后写的条件会被先执行,比如:
                    log4cplus.appender.append_1.filters.1=log4cplus::spi::LogLevelMatchFilter
                    log4cplus.appender.append_1.filters.1.LogLevelToMatch=TRACE
                    log4cplus.appender.append_1.filters.1.AcceptOnMatch=true
                    log4cplus.appender.append_1.filters.2=log4cplus::spi::DenyAllFilter
                    会首先执行filters.2的过滤条件,关闭所有过滤器,然后执行filters.1,仅匹配TRACE信息
             -->
        </appender>
    
        <!-- [公共Appender] 这个class表示输入到文件,并且按日期生成新文件 -->
        <appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${webapp.root}/logs/common-default.log" />  <!-- ${webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 -->
            <param name="MaxFileSize" value="10MB"/><!-- 文件大小不超过10MB -->
            <param name="MaxBackupIndex" value="10"/><!-- 保留10个备份文件 -->
            <param name="Append" value="TRUE" />  <!-- 是否项目重启继续保存之前日志 -->
            <param name="encoding" value="GBK" />
            <param name="threshold" value="ALL" /> <!-- 记录所有类型日志,记录它和比它等级高的日志ALL<DEBUG -->
            <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />  <!-- 日期格式 例子:common-default.log.2015-09-17.log -->
            <layout class="org.apache.log4j.PatternLayout">  <!-- 输出方式 -->
                <param name="ConversionPattern"
                    value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
            </layout>
        </appender>
    
        <!-- [错误日志APPENDER] -->
        <appender name="ERROR-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${webapp.root}/logs/error-log.log" />
            <param name="Append" value="TRUE" />
            <param name="encoding" value="GBK" />
            <param name="threshold" value="ERROR" /> <!-- 记录所有类型日志,记录它和比它等级高的日志ALL<DEBUG -->
            <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" 
                    value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
            </layout>
        </appender> 
        
        <!-- [debug日志APPENDER] -->
        <appender name="DEBUG-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${webapp.root}/logs/debug-log.log" />
            <param name="Append" value="true" />
            <param name="encoding" value="GBK" />
            <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern"
                    value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
            </layout>
        </appender>
    
        <!-- [info日志APPENDER] -->
        <appender name="INFO-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${webapp.root}/logs/info-log.log" />
            <param name="Append" value="TRUE" />
            <param name="encoding" value="GBK" />
            <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern"
                    value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
            </layout>
            <!-- 我只想记录INFO以上级别日志,就做如下设置 -->
            <filter class="org.apache.log4j.varia.LevelRangeFilter">
                <param name="levelMin" value="INFO" />
                <param name="levelMax" value="FATAL" />
            </filter>
        </appender>
    
        <!-- [组件日志APPENDER] -->
        <appender name="COMPONENT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="File" value="${webapp.root}/logs/logistics-component.log" />
            <param name="Append" value="TRUE" />
            <param name="encoding" value="GBK" />
            <param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern"
                    value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
            </layout>
        </appender>
    
        <!-- 日志写出器 error log -->
        <logger name="ErrorLogger">
            <level value="ERROR" />
            <!-- <level value="${errorLevel }" /> --> <!-- 这种方式level读取不了web.xml中的值,都是debug -->
            <appender-ref ref="COMPONENT-APPENDER" />
            <appender-ref ref="ERROR-APPENDER" />
        </logger>
    
        <!-- 日志写出器 debug log -->
        <logger name="debugLogger" additivity="true">  <!-- additivity是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下 子Logger 会继承 父Logger 的appender,也就是说 子Logger 会在 父Logger 的appender里输出。若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出 -->
            <level value="DEBUG" /> <!-- 现在级别 -->
            <!-- <level value="${debugLevel}" /> --> <!-- 这种方式level读取不了web.xml中的值,都是debug -->
            <appender-ref ref="DEBUG-APPENDER" />
        </logger>
    
        <!-- 日志写出器 info log -->
        <!-- name指定的是包名,表示这个logger只记录com.only.mate下的所有日志 -->
        <logger name="com.only.mate" additivity="true">
            <level value="INFO" />
            <!-- <level value="${infoLevel}" /> --> <!-- 这种方式level读取不了web.xml中的值,都是debug -->
            <appender-ref ref="INFO-APPENDER" />
        </logger>
            
        <!-- 日志写出器Root Logger -->
        <!-- 所有logger的父类,记录所有的日志。 -->
        <root>
            <level value="ALL" />  <!-- 限定记录等级 -->
            <appender-ref ref="DEFAULT-APPENDER" />  <!-- 调用记录方式 -->
            <appender-ref ref="console" />
        </root>
    
    </log4j:configuration>

    注意:动态配置<level value="${infoLevel}" />这样的方式level读取不到web.xml中的值,都是debug,具体原因不清楚

    • 调用
    public class UserController {
        private static Logger logger = LoggerFactory.getLogger(UserController.class);
        private static Logger debugLogger = LoggerFactory.getLogger("DebugLogger");
        private static Logger errorLogger = LoggerFactory.getLogger("ErrorLogger");
        
      @ResponseBody
        @RequestMapping(value="/login")
        public Map<String, Object> login(HttpServletRequest req, HttpServletResponse res){
            Map<String, Object> response = new HashMap<String, Object>();
            response.put("state", "0");
            
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            logger.debug("登录,用户名{},密码{}", username, password);
            debugLogger.debug("登录,用户名{},密码{}", username, password);
            errorLogger.debug("登录,用户名{},密码{}", username, password);
            if(StringUtils.isNotBlank(username)){
                User user = userService.findOne(username);
                if(user != null){
                    if(user.getPassword().equals(password)){
                        response.put("state", "1");
                        response.put("data", user);
                    }else {
                        response.put("message", "账户或密码错误!");
                        logger.error("账户或密码错误!");
                        debugLogger.error("账户或密码错误!");
                        errorLogger.error("账户或密码错误!");
                    }
                }else {
                    response.put("message", "此账户不存在!");
                    logger.error("此账户不存在!");
                    errorLogger.error("此账户不存在!");
                }
            }else {
                response.put("message", "输入有误!");
                logger.error("登录出错!");
                errorLogger.error("登录出错!");
            }
            return response;
        }
    }

    完成。


     

  • 相关阅读:
    Ruby on Rails中的Rake教程(Rake如何把我灌醉!)
    十一、Spring Boot 集成Shiro和CAS
    Spring Boot 快速入门
    一位创业者的血泪史----献给85前创业者的反思
    罗振宇送给新员工的四句话
    Axure 入门
    XMind常用快捷方式汇总
    CAS 单点登陆
    mysql互换表中两列数据
    mysql默认安装目录说明
  • 原文地址:https://www.cnblogs.com/onlymate/p/7729806.html
Copyright © 2011-2022 走看看