• springmvc+log4j操作日志记录,详细配置


    没有接触过的,先了解一下:log4j教程

    部分内容来:log4j教程 感谢!

    需要导入包:

     log包:log4j-12.17.jar

    第一步:web.xml配置

    <!-- log4j配置,文件路径,因为是跟随项目启动 -->
    <context-param>     
          <param-name>log4jConfigLocation</param-name>     
          <param-value>/WEB-INF/log4j.xml</param-value>     
    </context-param>     
    <!-- 配置log4j.xml变量,如果需要动态的就使用下面方式,使用方法${name} --> 
    <context-param> 
      <param-name>controller</param-name> 
      <param-value>controller-log</param-value> 
    </context-param> 
    <context-param> <param-name>loggingLevel</param-name> <param-value>info</param-value> </context-param> <!-- 加载log4j配置文件 --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>

    第二步log4j.xml配置

    (配置文件可以有两种方式,一种是xml,一种是properties。个人比较喜欢xml,一目了然)

    先讲解一下核心对象:

    logger对象: Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。

    Appender对象:下位层提供Appender对象。Appender对象负责发布日志信息,以不同的首选目的地,如数据库,文件,控制台,UNIX系统日志等。

    layout对象: 该层提供其用于格式化不同风格的日志信息的对象。布局层提供支持Appender对象到发布日志信息之前。

    打个比方:logger是个情报站,负责收集他 所在地方(用name="xxx包"指定)下的所有信息。appender是发送出去的方式,如写信(FileAppender)、电报(SMTPAppender)等多种。layout就是发送内容以什么格式书写,如自定义格式(PatternLayout),html(HTMLLayout)格式。

    <?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/">
    <!-- 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 -->  
      <!-- [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender -->  
      <appender name="console" class="org.apache.log4j.ConsoleAppender">  <!-- name提供给logger或者root调用 -->
         <param name="encoding" value="GBK" />  <!-- 保存字符集 -->
         <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="warn" />  
                <param name="AcceptOnMatch" value="true" />  <!-- 答案:http://bbs.csdn.net/topics/350195913 -->
            </filter>  
      </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="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>  
      
       <!-- [debug日志APPENDER] -->  
       <appender name="DEBUG-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">  
         <param name="File" value="${webapp.root}/logs/controller/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/controller/info-log.log" />  
         <param name="Append" value="false" />  
         <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="LevelMax" value="info"/>     
           <param name="LevelMin" value="info"/>     
          </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>  
      
         <!-- debug log -->  
         <!-- name指定的是包名,表示这个logger只记录com.wzw.controller下的所有日志 -->
       <logger name="com.wzw.controller" additivity="true">  <!-- additivity 是否继承root -->
          <!-- <level value="${loggingLevel}" />   -->
          <level value="DEBUG"></level>  <!-- 现在级别 -->
          <appender-ref ref="DEBUG-APPENDER" />  
       </logger>  
       
         <!-- info log -->  
         <!-- name指定的是包名,这样只操作此包下的log -->
       <logger name="com.wzw.controller" additivity="true">  
          <level value="INFO"></level>  
          <appender-ref ref="INFO-APPENDER" />  
          <appender-ref ref="console"/>
       </logger>  
       
       <!-- Root Logger -->  
       <!-- 所有logger的父类,记录所有的日志。 -->
       <root> 
           <level value="ALL"></level>  <!-- 限定记录等级 -->
           <appender-ref ref="DEFAULT-APPENDER" />  <!-- 调用记录方式 -->
           <appender-ref ref="console"/>
       </root>  
       
    </log4j:configuration>  

     运行就能看到common-default.log里面有操作日志

    自己输出日志:

    我controller包下某各类中:

    package com.wzw.controller;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RequestMapping;
    @Controller
    @RequestMapping("/account")
    public class AccountController {
        private static Logger logger =LoggerFactory.getLogger(AccountController.class);
    @ResponseBody
        @RequestMapping("/login")
        public String login(HttpSession session){
            logger.info("请求登录");
            logger.debug("debug");
            logger.warn("warn");
    }
    }

    访问这个controller,就会记录日志,因为有log4j中有两个logger配置记录controller包下的日志,所以输出到两个logger下<appender-ref>(输出方式)。

    appender选项:

    • AppenderSkeleton

    • AsyncAppender

    • ConsoleAppender

    • DailyRollingFileAppender

    • ExternallyRolledFileAppender

    • FileAppender

    • JDBCAppender

    • JMSAppender

    • LF5Appender

    • NTEventLogAppender

    • NullAppender

    • RollingFileAppender

    • SMTPAppender

    • SocketAppender

    • SocketHubAppender

    • SyslogAppender

    • TelnetAppender

    • WriterAppender

     layout选项:

    • DateLayout
    • HTMLLayout
    • PatternLayout
    • SimpleLayout
    • XMLLayout

     

    模式转换字符:

    下表说明了以上模式使用的字符和所有其他字符,可以在自定义模式中使用:

    转换字符表示的意思
    c 用于输出的记录事件的类别。例如,对于类别名称"a.b.c" 模式  %c{2} 会输出 "b.c"
    C 用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 "org.apache.xyz.SomeClass", 模式 %C{1} 会输出 "SomeClass".
    d 用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}.
    F 用于输出被发出日志记录请求,其中的文件名
    l 用于将产生的日志事件调用者输出位置信息
    L 用于输出从被发出日志记录请求的行号
    m 用于输出使用日志事件相关联的应用程序提供的消息
    M 用于输出发出日志请求所在的方法名称
    n 输出平台相关的行分隔符或文字
    p 用于输出的记录事件的优先级
    r 用于输出毫秒从布局的结构经过直到创建日志记录事件的数目
    t 用于输出生成的日志记录事件的线程的名称
    x 用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文)
    X 在X转换字符后面是键为的MDC。例如  X{clientIP} 将打印存储在MDC对键clientIP的信息
    % 文字百分号 %%将打印%标志

    格式修饰符:

    默认情况下,相关资料原样输出。然而,随着格式修饰符的帮助下,可以改变最小字段宽度,最大字段宽度和对齐。

    下表涵盖了各种各样的修饰符的情况:

    Format modifierleft justifyminimum widthmaximum width注释
    %20c false 20 none 用空格左垫,如果类别名称少于20个字符长
    %-20c true 20 none 用空格右垫,如果类别名称少于20个字符长
    %.30c NA none 30 从开始截断,如果类别名称超过30个字符长
    %20.30c false 20 30 用空格左侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。
    %-20.30c true 20 30 用空格右侧垫,如果类别名称短于20个字符。但是,如果类别名称长度超过30个字符,那么从开始截断。

  • 相关阅读:
    循环语句
    JAVA-数据类型、变量、常量
    JAVA——程序流程控制——循环语句——for循环(打印三角形)
    循环语句
    JAVA基础学习1
    新手上路
    mysql内置函数之事务
    mysql内置功能
    mysql内置函数之视图
    pymysql模块
  • 原文地址:https://www.cnblogs.com/v-weiwang/p/4814050.html
Copyright © 2020-2023  润新知