zoukankan      html  css  js  c++  java
  • log4j2使用总结

    一、Log4j有三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为日志级别,日志要输出的地方和日志格式

    1、 Logger

    Logger的日志级别有6级,分别是TRACE<DEBUG < INFO < WARN < ERROR < FATAL 分别按照一定的等级来表示此条日志的重要程度

    2、 appender常用的输出有控制台、文件、数据库等

    二、Log4j2配置

    1、web.xml配置文件

     XML Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <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>

    2、log4j2的配置文件:log4j2.xml ,建在类路径下

     XML Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?xml version="1.0" encoding="utf-8"?>
    <Configuration status="off" monitorInterval="1800">
      <properties>
        <property name="filename">d:/logs/log4j.log</property>
      </properties>
      <Appenders>
        <!--输出到控制台配置-->
        <Console name="Console">
          <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss } %p %l %m%n" />
        </Console>
        <!--输出到文件配置-->
        <RollingFile name="file" fileName="${filename}" filePattern="d:/logs/log4j--%d{yyyy-MM-dd}.log.gz">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} %p %C:%L %m%n" />
          <TimeBasedTriggeringPolicy interval="1" modulate="“true”" />
        </RollingFile>
      </Appenders>
      <Loggers>
        <!--com.render包下的日志输出策略,输出warn级别及以上级别的日志到控制台和文件-->
        <Logger name="com.render" level="warn" additivity="false">
          <AppenderRef ref=" Console" />
          <AppenderRef ref="file" />
        </Logger>
        <!--其它日志输出策略-->
        <Root level="error">
          <AppenderRef ref="file" />
          <AppenderRef ref="Console" />
        </Root>
      </Loggers>
    </Configuration>

    上述配置可以将日志打印到控制台的同时,保存到文件 除此之外,log4j2的JDBC Appender还支持将日志输出到数据库保存 首先,需要配置一个JNDI数据源,具体配置方式可参见: 

    [Tomcat下配置Jndi数据源](http://blog.csdn.net/kris234seth/article/details/46694971) 

    之后在上述log4j2的配置文件中新增Jdbc Appender之后的配置: 

     XML Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?xml version="1.0" encoding="utf-8"?>
    <Configuration status="off" monitorInterval="1800">
      <properties>
        <property name="filename">d:/logs/log4j.log</property>
      </properties>
      <Appenders>
        <!--输出到控制台配置-->
        <Console name="Console">
          <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss } %p %l %m%n" />
        </Console>
        <!--输出到文件配置-->
        <RollingFile name="file" fileName="${filename}" filePattern="d:/logs/log4j--%d{yyyy-MM-dd}.log.gz">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} %p %C:%L %m%n" />
          <TimeBasedTriggeringPolicy interval="1" modulate="“true”" />
        </RollingFile>
        <!--JdbcAppender配置-->
        <JDBC name="JdbcAppender" tableName="logger">
          <DataSource jndiName="java:/comp/env/jndi" />
          <!--日期时间配置-->
          <Column name="eventDate" isEventTimestamp="true" />
          <!--日志输出级别-->
          <Column name="level" pattern="%level" />
          <!--日志对应的类-->
          <Column name="Class" pattern="%C:%L" />
          <!--日志对应的方法-->
          <Column name="Method" pattern="%M" />
          <!--日志内容-->
          <Column name="message" pattern="%message" />
          <!--本次操作请求的ip地址-->
          <Column name="ip" pattern="%X{ip}" />
          <!--本次操作请求的用户id-->
          <Column name="userid" pattern="%X{userid}" />
        </JDBC>
      </Appenders>
      <Loggers>
        <!--com.render包下的日志输出策略,输出warn级别及以上级别的日志到控制台和文件-->
        <Logger name="com.render" level="warn" additivity="false">
          <AppenderRef ref=" Console" />
          <AppenderRef ref="file" />
        </Logger>
        <!--其它日志输出策略-->
        <Root level="error">
          <AppenderRef ref="file" />
          <AppenderRef ref="Console" />
        </Root>
      </Loggers>
    </Configuration>

    说明:logger为保存日志的表名,jndiName为容器中配置的JNDI数据源的名称,column元素中的name属性为表的字段名

    注意:上述配置中的最后2项,即用户idip地址(可以使其它任何信息)是需要单独来进行处理,才能在数据库保存成功,这时需要借助org.apache.log4j.MDC这个类来对idip进行设置。MDC是一个保存特定context数据的map,类似于session对象。具体使用方式如下:

     Java Code 
    1
    2
    3
    4
    5
    6
    String userid = 25;
    String ip = ” 127.0.0.0”;
    MDC.put(“userid”, userid);
    MDC.put(“ip”, ip);
    logger.info(“来自ip地址为:” +ip + “, id为” +userid + “的用户请求”);

    注意:一定要在在日志打印语句之前进行idip信息(同样可以是其它任何需要的信息)的设置!

    这样设置之后,在配置文件中就可以使用%X{ip}、%X{userid}来取到对应的值。
    除此之外,对于要保存的一些公共的信息,每次在打印日志的时候都需要使用MDC来进行设置,这对于代码的书写时很繁琐的,解决这个问题,我们可以把这些信息的设置放置到一个过滤器中,在请求开始的时候就进行相关信息的设置,这样就不需要每次都单独设置了。

     Java Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class AuthenticationFilter implements Filter
    {

        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain) throws IOException, ServletException
        {
            HttpServletRequest re = (HttpServletRequest) request
            //这里可以从request中获取到session中的用户相关信息、ip地址、请求的uri等等信息
            try
            {

                MDC.put("userid"16);

                chain.doFilter(request, response);

            }
            finally
            {
                MDC.remove("userid ");
            }

        }

    }
    增加了过滤器之后还需要在web.xml文件中增加过滤器的相关配置,如下

    <filter>
    < filter-name > AuthFilter < /filter-name >
    < filter-class > com.log4jmdc.AuthenticationFilter </filter-class >
    </filter >
    < filter-mapping >
    < filter-name > AuthFilter </filter-name>
    < url-pattern >/*</url-pattern>
    </filter-mapping>

    以上所有的配置都完成了,启动项目可以进行测试,看看日志有没有存到数据库吧!




  • 相关阅读:
    Python实现归并排序
    zip解决杨辉三角问题
    Python中协程、多线程、多进程、GIL锁
    Python copy(), deepcopy()
    Python collections的使用
    javascript中的类
    python3中的zip函数
    三数之和(Python and C++解法)
    两数之和(Python and C++解法)
    Python中list、dict、set、tuple的用法细节区别
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293783.html
Copyright © 2011-2022 走看看