一、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项,即用户id和ip地址(可以使其它任何信息)是需要单独来进行处理,才能在数据库保存成功,这时需要借助org.apache.log4j.MDC这个类来对id和ip进行设置。MDC是一个保存特定context数据的map,类似于session对象。具体使用方式如下:

 Java Code 
1

2

3

4

5

6
;

...0”;

MDC.put(“userid”, userid);

MDC.put(“ip”, ip);

logger.info(“来自ip地址为:” +ip + “, id为” +userid + “的用户请求”);

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

这样设置之后,在配置文件中就可以使用%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();



            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>

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

log4j2使用总结的更多相关文章

  1. dubbox升级spring到4.x及添加log4j2支持

    今天花了点时间,把dubbox依赖的spring从3.x升级成最新版的4.x了,其它一些依赖的组件也顺带升级了,同时dubbo支持的第三方日志组件居然没有log4j2,加了点代码也一并支持了,蛋疼的是 ...

  2. 聊一聊log4j2配置文件log4j2.xml

    一.背景 最近由于项目的需要,我们把log4j 1.x的版本全部迁移成log4j 2.x 的版本,那随之而来的slf4j整合log4j的配置(使用Slf4j集成Log4j2构建项目日志系统的完美解决方 ...

  3. 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

    一.背景 最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见 ...

  4. log4j2.xml实用例子

    一个多月前,我写了篇关于log4j.xml配置的文章,点击此处查看:http://www.cnblogs.com/guogangj/p/3931397.html 最近,我把自己的log4j升级到2.0 ...

  5. log4j2 不使用配置文件,动态生成logger对象

    大家平时使用Log4j一般都是在classpath下放置一个log4j的配置文件,比如log4j.xml,里面配置好Appenders和Loggers,但是前一阵想做某需求的时候,想要的效果是每一个任 ...

  6. Log4j2 - 配置

    官方文档:http://logging.apache.org/log4j/2.x/index.html 1 概述 Log4j2的配置包含四种方式,其中3种都是在程序中直接调用Log4j2的方法进行配置 ...

  7. MyBatis - MyBatis使用log4j2显示sql和结果集

    mybatis-config.xml <settings> <setting name="logImpl" value="LOG4J2" /& ...

  8. web项目 log4j2的路径问题

    项目中用到log4j2记录日志,结果运行的时候总也不见log文件的产生. 查看官方文档得知,在web项目中使用log4j2需要加入log4j-web包 log4j2.xml <?xml vers ...

  9. 在java下使用log4j2记录日志

    1.定义: log4j2 指log4j 2.X及以上版本 2.安装 log4j-core-xx.jarlog4j-api-xx.jarlog4j-web-xx.jar(web项目的需要引用) 3.配置 ...

  10. log4j2配置详解

    1.    log4j2需要两个jar   log4j-api-2.x.x.jar    log4j-core-2.x.x.jar  .log4j和log4j2有很大的区别,jar包不要应错. 2. ...

随机推荐

  1. android下activity中多个listview只允许主界面滚动

    之前发现了自己的APP在处理两个listview时产生的一个bug.当两个listview中的item数量多出手机屏幕时,listview不能显示完全.一开始觉得只要加一个scrollview就可以了 ...

  2. [POJ3352]Road Construction(缩点,割边,桥,环)

    题目链接:http://poj.org/problem?id=3352 给一个图,问加多少条边可以干掉所有的桥. 先找环,然后缩点.标记对应环的度,接着找桥.写几个例子就能知道要添加的边数是桥的个数/ ...

  3. git push default

    今天使用git push的时候出现了如下提示: warning: push.default is unset; its implicit value is changing in Git 2.0 fr ...

  4. HDU 1698 Just a Hook (线段树 成段更新 lazy-tag思想)

    题目链接 题意: n个挂钩,q次询问,每个挂钩可能的值为1 2 3,  初始值为1,每次询问 把从x到Y区间内的值改变为z.求最后的总的值. 分析:用val记录这一个区间的值,val == -1表示这 ...

  5. char型变量中能存贮一个中文汉字

    char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么 ...

  6. bzoj2788

    明显是一个差分约束系统 对于第一种限制,其实就是x[a]+1<=x[b] x[b]-1<=x[a] 根据三角不等式很容易建图 但这题他比较奇怪,问的是X最多不同取值的个数 根据这张图的特殊 ...

  7. POJ 3687 Labeling Balls【拓扑排序 优先队列】

    题意:给出n个人,m个轻重关系,求满足给出的轻重关系的并且满足编号小的尽量在前面的序列 因为输入的是a比b重,但是我们要找的是更轻的,所以需要逆向建图 逆向建图参看的这一篇http://blog.cs ...

  8. [反汇编练习] 160个CrackMe之017

    [反汇编练习] 160个CrackMe之017. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. 基于Live555,ffmpeg的RTSP播放器直播与点播

    基于Live555,ffmpeg的RTSP播放器直播与点播 多路RTSP高清视频播放器下载地址:http://download.csdn.net/detail/u011352914/6604437多路 ...

  10. 【转】pdf 中如何把几页缩小成一页打印

    我用的是Foxit PDF Reader,可以这样设置:文件-打印-打印处理下的页面排列选择“在每张纸上放置多页”-选择每页版数即可. 如果你用的是Adobe Reader,也可以自己找一下,看是否有 ...