一、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>

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

最新文章

  1. 使用wireshark抓包分析浏览器无法建立WebSocket连接的问题(server为Alchemy WebSockets组件)
  2. android 切换fragment的两种方式
  3. IT公司100题-19-求Fibonacci数列
  4. inno setup 在卸载时如果想保留文件 使用uninsneveruninstall
  5. java操作office和pdf文件页面列表导出cvs,excel、pdf报表.
  6. QQ上传大文件为什么这么快
  7. 如何在PowerDesigner将PDM导出生成WORD文档或者html文件
  8. java 8 Lambda
  9. 将JPA出参Iterable转为List
  10. LeetCode(283. 移动零)
  11. Navicat 的安装及破解
  12. Android 音视频深入 四 录视频MP4(附源码下载)
  13. HTTP协议综合
  14. Halcon编程-基于形状特征的模板匹配
  15. Unity3d之Perfab
  16. C# 托管非托管资源释放
  17. java学习笔记-01.对象入门
  18. Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) C. Connect Three 【模拟】
  19. 【多线程】 Task
  20. [android]不解锁刷机

热门文章

  1. TagHighlight
  2. 方法Equals和操作符==的区别
  3. 客户视角:Oracle ETL工具ODI
  4. oracle portlist.ini
  5. asp.net中Session过期设置方法
  6. tomcat web.xml配置
  7. POJ 2112 - Optimal Milking
  8. eclipse启动出现“An Error has Occurred. See the log file”解决方法
  9. hdu 4674 Trip Advisor(缩点+倍增lca)
  10. HTMLayout界面CSSS样式解析笔记