资料参考自:http://www.codeceo.com/article/log4j-usage.html

关于日志的基本概念以及从入门到实战,请参见:http://www.cnblogs.com/LinkinPark/p/5232854.html

 (关于简单日志门面slf4j,请参见另外一篇随笔)

   经典log4j:

  1. # Global logging configuration
  2. log4j.rootLogger=DEBUG, stdout
  3. # Console output...
  4. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  5. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  6. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

一、log4j概念

    Log4j由三个重要的组件构成:

        日志信息的优先级,

            日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;

            级别高的会自动屏蔽级别低的日志,也就是说,设置了WARN的日志,则INFO、DEBUG的日志级别的日志不会显示

        日志信息的输出目的地,

            日志信息的输出目的地指定了日志将打印到控制台还是文件中

        日志信息的输出格式。

            而输出格式则控制了日志信息的显示内容。

二、log4j入门程序

  我们这里采用maven进行构建项目,引入的依赖如下:

  1. <dependency>
  2. <groupId>log4j</groupId>
  3. <artifactId>log4j</artifactId>
  4. <version>${log4j.version}</version>
  5. </dependency>

  在classpath下新建log4j.properties配置文件,内容如下(细节将会在下节进行讲解):

  1. # 可设置级别:TRACE→DEBUG→INFO→WARNING→ERROR→FATAL→OFF
  2. # 高级别level会屏蔽低级别level。
  3. # debug:显示debug、info、error
  4. # info:显示info、error
  5.  
  6. #log4j.rootLogger=DEBUG,console,file
  7. log4j.rootLogger=INFO,console
  8.  
  9. #输出到控制台
  10. log4j.appender.console=org.apache.log4j.ConsoleAppender
  11. #设置输出样式
  12. log4j.appender.console.layout=org.apache.log4j.PatternLayout
  13. #日志输出信息格式为
  14. log4j.appender.console.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n
  15.  
  16. #输出到文件(这里默认为追加方式)
  17. #log4j.appender.file=org.apache.log4j.FileAppender
  18. #log4j.appender.file.File=F:/LinkinPark/logs/Log4J.log
  19. #样式为TTCCLayout
  20. #log4j.appender.file.layout=org.apache.log4j.TTCCLayout
  21.  
  22. #自定义样式
  23. #%c 输出所属的类目,通常就是所在类的全名
  24. #%C 输出Logger所在类的名称,通常就是所在类的全名
  25. #%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}
  26. #%F 输出所在类的类名称,只有类名。
  27. #%l 输出语句所在的行数,包括类名+方法名+文件名+行数
  28. #%L 输出语句所在的行数,只输出数字
  29. #%m 输出代码中指定的讯息,如log(message)中的message
  30. #%M 输出方法名
  31. #%p 输出日志级别,即DEBUG,INFO,WARN,ERROR,FATAL
  32. #%r 输出自应用启动到输出该log信息耗费的毫秒数
  33. #%t 输出产生该日志事件的线程名
  34. #%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
  35. #%% 用来输出百分号“%”
  36. #log4j.appender.Linkin.layout.ConversionPattern=%n[%l%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m
  37. #log4j.appender.Linkin.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}[%C]-[%p] %m%n
  38. #log4j.appender.Linkin.layout.ConversionPattern = %d{ABSOLUTE} %5p %t %c{2}:%L - %m%n

  测试代码如下(测试类叫LogTest):

  1. // 获取日志对象
  2. public static Logger log = Logger.getLogger(LogTest.class);
  3. public static void log() {
  4. log.debug("debug....");
  5. log.info("info...");
  6. log.warn("warn...");
  7. log.error("error...");
  8. try {
  9. int i = 10 / 0;
  10. } catch (Exception e) {
  11. log.error(e.getMessage());
  12. }
  13. }
  14.  
  15. public static void main(String[] args) {
  16. log();
  17. }

  执行结果:

  

  看了入门程序后我们来详解一下log4j的配置文件:

三、log4j的配置文件

  Log4j默认的配置文件为log4j.properties。启动时,会加载classpath(比如maven项目放在src/main/resources)下的log4j.properties初始化Log4j。如果文件不存在,Log4j会在控制台打印如下信息,提示说没有找到Log4j配置

  1. log4j:WARN No appenders could be found for logger (org.linkinpark.commons.logtest.Log4jTest).
  2. log4j:WARN Please initialize the log4j system properly.
  3. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

  一般而言都不推荐自定义配置文件(约定大于配置),所以这里就暂不展开自定义配置文件名称与路径的做法了。

  log4j的三大组件

    Loggers(记录器),Appenders(输出源)和Layouts(布局)

    其中,Logger负责记录日志,Appender负责输出到什么地方,Layout负责以什么格式输出

  日志记录器——Logger

    Logger也就是我们代码中出现的Logger:

  1. public static Logger log = Logger.getLogger(LogTest.class);

  其中,以类名.class作为参数的Logger,则logger的名字为类的全限定名

  logger是单例的,相同名字的logger只会返回一个实例

  logger具有继承性,配置文件中可以通过名称来配置logger的属性

  log4j中的根记录器rootLogger,它是所有logger的父类

  配置文件中的log4j.logger后配置的是logger,一般而言全局只需配置根记录器rootLogger,其它logger继承它的配置即可,而log4j.appender后配置的便是一个Appender

  1..配置根Logger,其语法为:

  1. log4j.rootLogger = [ level ] , appenderName, appenderName,

  level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。

      Log4j建议只使用四个级别,优 先级从高到低分别是ERROR、WARN、INFO、DEBUG

  appenderName 就是指日志信息输出到哪个地方。您可以同时指定多个输出目的地。

  如果想要某个logger拥有特定配置,可以采用如下方式:(但是只建议修改输出级别,因为即使覆盖了输出地,仍旧会继承父类的appender,相当于两份日志输出,一份按照重写的格式,一份按照父类的格式)

  1. log4j.logger.org.linkinpark.commons.logtest.Log4jTest1=ERROR
  2. log4j.rootLogger=INFO,console

  2.配置日志信息输出目的地Appender,其语法为:

  1. log4j.appender.appenderName = fully.qualified.name.of.appender.class
  2. log4j.appender.appenderName.option1 = value1

  3. log4j.appender.appenderName.option = valueN

  其中,Log4j提供的appender有以下几种:

  1. org.apache.log4j.ConsoleAppender(控制台),
  2. org.apache.log4j.FileAppender(文件),
  3. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
  4. org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
  5. org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

  其中,输出到文件的实例如下:

  1. #输出到文件(这里默认为追加方式)
  2. log4j.appender.file=org.apache.log4j.FileAppender
  3. #输出文件位置
  4. log4j.appender.file.File=/Users/LinkinPark/WorkSpace/linkin-log-test/log/log4j.log
  5. log4j.appender.file.Append=true
  6. #样式为TTCCLayout
  7. #log4j.appender.file.layout=org.apache.log4j.TTCCLayout
  8. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  9. log4j.appender.file.layout.ConversionPattern=[%-d{yyyy-MM-dd HH:mm:ss}]-[%t-%5p]-[%C-%M(%L)]: %m%n

  

  1. (1)如果是要指定日志文件的位置为D盘下的log.txt文件。
  2. log4j.appender.thisProject.file.out.File=d:\\log.txt
  3. (2)如果指定日志文件的位置为当前的tomcat的工作目录下的某个文件
  4. log4j.appender.thisProject.file.out.File=${catalina.home}/logs/logs_tomcat.log

  更加详细的Appender的介绍,请参见:http://www.cnblogs.com/LinkinPark/p/5232850.html

  3.配置日志信息的格式(布局),其语法为:

  1. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
  2. log4j.appender.appenderName.layout.option1 = value1

  3. log4j.appender.appenderName.layout.option = valueN

  其中,Log4j提供的layout有以下几种:

  1. org.apache.log4j.HTMLLayout(以HTML表格形式布局),
  2. org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
  3. org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
  4. org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

  Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息

  1. #自定义样式
    #%c 输出所属的类目,通常就是所在类的全名
    #%C 输出Logger所在类的名称,通常就是所在类的全名
    #%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}
    #%F 输出所在类的类名称,只有类名。
    #%l 输出语句所在的行数,包括类名+方法名+文件名+行数
    #%L 输出语句所在的行数,只输出数字
    #%m 输出代码中指定的讯息,如log(message)中的message
    #%M 输出方法名
    #%p 输出日志级别,即DEBUG,INFO,WARN,ERROR,FATAL
    #%r 输出自应用启动到输出该log信息耗费的毫秒数
    #%t 输出产生该日志事件的线程名
    #%n 输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n”
    #%% 用来输出百分号“%”

   我们可以设置日志输出的长度来使得日志变得整齐可读:

    在%与参数符号间添加数字,例如%20p,%-20p等。正数表示右对齐,负数表示左对齐,数字表示最小宽度,不足时用空格补齐。

  完整格式介绍,请参见:http://www.yiibai.com/log4j/log4j_patternlayout.html

  更多详细的layout的配置,参见http://www.cnblogs.com/LinkinPark/p/5232849.html

三、commons-logging

  严格的说,commons-logging不是一个日志控件,没有日志功能,它只是统一了JDK Logging与Log4j的API,并把日志功能交给JDK Loggings或者是log4j。对于不能确定日志方式的系统,commons-logging是一个不错的选择,Spring,Hibernate,Struts等使用的都是commons-logging。

四、Spring中使用Log4j

  // TODO

  将log4j.properties放在src下,而spring配置文件无需修改。

  就放在classpath下,如果配置文件的名字叫"log4j.properties",就不用再自己指定文件名了,Log4j初始化时会自动找到它。

  关键部分是web.xml中配置log4j的启动:

  1. <!-- Spring 容器加载 -->
  2. <listener>
  3. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  4. </listener>
  5. <context-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>classpath:applicationContext.xml</param-value>
  8. </context-param>
  9.  
  10. <!-- 设置根目录--如果不设,默认为web.root,但最好设置,以免项目间冲突 -->
      <!--在log4j.properties配置文件,就可以按下面的方式使用${webapp.root}:
         log4j.appender.file.File=${webapp.root}/WEB-INF/logs/sample.log 
          就可以在运行时动态的找出项目的路径-->
  11. <context-param>
  12. <param-name>webAppRootKey</param-name>
  13. <param-value>webapp.root</param-value>
  14. </context-param>
  15. <context-param>
  16. <param-name>log4jConfigLocation</param-name>
  17. <param-value>/WEB-INF/classes/log4j.properties</param-value>
  18. </context-param>
  19. <!-- 3000表示 开一条watchdog线程每60秒扫描一下配置文件的变化;这样便于日志存放位置的改变 -->
  20. <context-param>
  21. <param-name>log4jRefreshInterval</param-name>
  22. <param-value>3000</param-value>
  23. </context-param>
  24. <listener> //使用了spring的监听器,会在项目启动的时候,启动Log4j
  25. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  26. </listener>
  27.  
  28. </web-app>

  对比:

  1. Spring log4j配置
  2. <context-param>
  3. <param-name>log4jConfigLocation</param-name>
  4. <param-value>WEB-INF/log4j.properties</param-value>
  5. </context-param>
  6.  
  7. <context-param>
  8. <param-name>log4jRefreshInterval</param-name>
  9. <param-value>60000</param-value>
  10. </context-param>
  11.  
  12. <listener>
  13. <listener-class>
  14. org.springframework.web.util.Log4jConfigListener
  15. </listener-class>
  16. </listener>

日志工具——log4j的更多相关文章

  1. Java 标准日志工具 Log4j 的使用(附源代码)

    源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还 ...

  2. Java日志工具之Log4J

    Log4J与java.util.logging.Logger的使用方式出奇的相似,因此如果先看这篇文章<Java日志工具之java.util.logging.Logger>在来用Log4J ...

  3. 日志工具全面理解及配置应用---以Log4j例子

    一.日志系统基本常识 1.日志系统作用:将日志信息输出到控制台和文本文件,以追踪代码运行信息. 2.日志系统操作的是什么?日志系统打印信息,也是调用日志系统的log.Info(),log.Warn() ...

  4. Apache通用日志工具commons-logging和Log4j使用总结

    转自:https://blog.csdn.net/lzl13391522110/article/details/53758536 Apache通用日志工具commons-logging和Log4j使用 ...

  5. 细说Java主流日志工具库

    概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...

  6. Java主流日志工具库

    在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息.在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子.我们先来逐一了解一下主流日志工具. 1.java.util.lo ...

  7. .NET日志工具介绍

    最近项目需要一个日志工具来跟踪程序便于调试和测试,为此研究了一下.NET日志工具,本文介绍了一些主流的日志框架并进行了对比.发表出来与大家分享. 综述 所谓日志(这里指程序日志)就是用于记录程序执行过 ...

  8. C#日志工具汇总

    log4net          log4net是一个可以帮助程序员把日志信息输出到各种不同目标的.net类库.它可以容易的加载到开发项目中,实现程序调试和运行的时候的日志信息输出,提供了比.net自 ...

  9. MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具

    mybatis – MyBatis 3 | 日志 http://www.mybatis.org/mybatis-3/zh/logging.html MyBatis 内置日志工厂基于运行时自省机制选择合 ...

随机推荐

  1. python中的字符串编码问题——2.理解ASCII码、ANSI码、Unicode编码、UTF-8编码

    ASCII码:全名是American Standard Code for Information Interchange,ASCII码中,一个英文字母(不分大小写)占一个字节的空间,范围0x00~0x ...

  2. OpenLDAP 2.4 禁止匿名用户访问

    ldapmodify -Q -Y EXTERNAL -H ldapi:/// <<EOF dn: cn=config changetype: modify add: olcDisallow ...

  3. null的专栏:https://blog.csdn.net/google19890102

    null的专栏:https://blog.csdn.net/google19890102 csdn博客专栏:https://blog.csdn.net/column.html

  4. linux/OSX中“DD”命令制作ISO镜像操作系统安装U盘

    linux或者OS X系统中,使用“dd”命令可以直接在终端命令行模式下,制作ISO镜像的系统安装盘. 一.linux系统以centOS7为例. sudo dd if=镜像路径 of=USB设备路径 ...

  5. C# 数据上传(自用笔记)

    #region 数据上传 [HttpPost] public ActionResult UploadFile() { HttpFileCollectionBase files = Request.Fi ...

  6. 详细讲解WaterRefreshLoadMoreView的使用

    详细讲解WaterRefreshLoadMoreView的使用 效果图: 加载控件的源码在如下网址中:上拉加载下拉刷新控件WaterRefreshLoadMoreView 使用的源码: // // V ...

  7. Linux 正则表达式详解

    正则表达式(REGULAR):为处理大量的字符串而定义的一套规则和方法,为了处理大量字符串而生 常见命令参数 基础正则表达式 . :有且只有任意一个字符(包括空格) * :重复前面任意0或者多个字符 ...

  8. C++ Boost在Windows和Linux下的编译安装

    再debian下直接apt-get install gcc g++就可以了.按照类似的逻辑,再Fedora下yum install gcc g++ 报告无法找到g++包. 差了一下,原来这个包的名字叫 ...

  9. DevExpress01、独立使用的控件

    XtraEditors 库提供了只能独立使用的控件,也就是说不能在容器控件的内置编辑中使用它们. 这些控件包括: 几种类型的列表框.数据导航控件.滚动条和一个按钮控件. 这些控件都是 BaseStyl ...

  10. 操作系统之Linux的内存分页管理

    内存是计算机的主存储器.内存为进程开辟出进程空间,让进程在其中保存数据.我将从内存的物理特性出发,深入到内存管理的细节,特别是了解虚拟内存和内存分页的概念. 内存 简单地说,内存就是一个数据货架.内存 ...