在SSH框架整合中使用Log4J2

一、关于Log4J

2015年,Apache宣布Log4J 1.x停止更新。最新版本为2.11
官网地址:http://logging.apache.org/log4j/2.x/

二、Log4J可以做什么

  1. 将信息送到控制台,文件,GUI组件等。
  2. 控制每条信息的输出格式。
  3. 将信息分类,定义信息级别,细致地控制日志的输出。

三、Log4J的安装

以maven为例子

        <!--日志 begin-->
        <dependency> <!-- 桥接:告诉Slf4j使用Log4j2 -->
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency> <!-- 桥接:告诉commons logging使用Log4j2 -->
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</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-core</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <!--日志 end-->

四、配置文件介绍

  1. 日志级别
    trace:追踪,就是程序推进一下,可以写个trace输出

    debug:调试,一般作为最低级别,trace基本不用。

    info:输出重要的信息,使用较多

    warn:警告,有些信息不是错误信息,但也要给程序员一些提示。

    error:错误信息。用的也很多。

    fatal:致命错误。级别较高,这种级别不用调试了,重写吧……

    机制:如果一条日志信息的级别大于等于配置文件的级别,就记录。

  2. 输出源
    CONSOLE(输出到控制台)、FILE(输出到文件)等。
  3. 布局方式

    SimpleLayout:以简单的形式显示

    HTMLLayout:以HTML表格显示

    PatternLayout:自定义形式显示

    在Log4J2中基本采用PatternLayout自定义日志布局。

    自定义格式:

    %t:线程名称

    %p:日志级别

    %c:日志消息所在类名

    %m:消息内容

    %M:输出执行方法

    %d:发生时间,%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2011-10-18 22:10:28,921

    %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。

    %L:代码中的行数

    %n:换行

    c{precision}

    logger{precision}

    class{precision}àOutputs the name of the logger thatpublished the logging event.

Conversion Pattern Logger Name Result
%c{1} org.apache.commons.Foo Foo
%c{2} org.apache.commons.Foo commons.Foo
%c{10} org.apache.commons.Foo rg.apache.commons.Foo
%c{-1} org.apache.commons.Foo apache.commons.Foo
%c{-2} org.apache.commons.Foo commons.Foo
%c{-10} org.apache.commons.Foo org.apache.commons.Foo
%c{1.} org.apache.commons.Foo org.apache.commons.Foo
c{1.1.~.~} org.apache.commons.test.Foo org.apache.commons.test.Foo
%c{.} org.apache.commons.test.Foo org.apache.commons.test.Foo

五、配置使用

  1. 配置文件命名与存储位置(Log4J没有默认的配置文件)

    系统选择configuration文件的优先级如下(放在src文件夹):

    classpath下名为 log4j-test.json 或者log4j-test.jsn文件

    classpath下名为 log4j2-test.xml

    classpath下名为 log4j.json 或者log4j.jsn文件

    classpath下名为 log4j2.xml

  2. 配置文件详细内容

    • web.xml

      <!--log4j2-begin   注意! 由于使用3.1版本web.xml log4j2 会自动注册 如果使用2.5版本xml 需要手动注册 以下代码-->
      <listener>
      <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
      </listener>
      <filter>
      <filter-name>log4jServletFilter</filter-name>
      <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
      </filter>
      <filter-mapping>
      <filter-name>log4jServletFilter</filter-name>
      <url-pattern>/*</url-pattern>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>FORWARD</dispatcher>
      <dispatcher>INCLUDE</dispatcher>
      <dispatcher>ERROR</dispatcher>
      </filter-mapping>
       <!--log4j2-end -->
    • log4j2.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <Configuration status="off" monitorInterval="1800">
      
      
      <properties>
          <property name="LOG_HOME">${web:rootDir}/log</property>
          <property name="FILE_NAME">Mylog</property>
      </properties>
      
      
      <Appenders>
          <Console name="Console" target="SYSTEM_OUT">
              <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
          </Console>
      
      
          <RollingRandomAccessFile name="running-log"
                                   fileName="${LOG_HOME}/${FILE_NAME}.log"
                                   filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
              <PatternLayout
                      pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
              <Policies>
                  <TimeBasedTriggeringPolicy/>
                  <SizeBasedTriggeringPolicy size="10 MB"/>
              </Policies>
              <DefaultRolloverStrategy max="20"/>
          </RollingRandomAccessFile>
      </Appenders>
      
      
      <Loggers>
          <!--<Logger name="com.test.app" level="trace" additivity="true">-->
          <!--<AppenderRef ref="running-log"/>-->
          <!--</Logger>-->
          <Logger name="com.test.app.dao" level="DEBUG" additivity="true">
              <AppenderRef ref="Console"/>
          </Logger>
          <Root level="INFO">
              <AppenderRef ref="running-log"/>
              <AppenderRef ref="Console"/>
          </Root>
      </Loggers>
      </Configuration>

猜你喜欢

转载自blog.csdn.net/yuanhang1996/article/details/80691233