1.x系列的Log4j日志库的基本使用方法

本文详细介绍了Log4j的基本概念、组件和版本差异,以及如何在Java项目中设置和使用Log4j。通过示例展示了如何配置log4j.properties文件,包括日志级别、输出目的地和格式。同时,文中还提到了两种初始化Log4j配置的方式,一种是手动配置,另一种是通过classpath自动加载。最后,解释了配置文件中各个选项的含义及其对日志输出的影响。
摘要由CSDN通过智能技术生成

一、log4j简介

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以把日志信息输送控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等目的地;此外,我们还可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。

Log4j主要由三个部分构成:日志信息的优先级,日志信息的输出目的地,和日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。

Log4j有两种系列的版本,一种是1.x系列的版本,可名为Log4j1,目前的最新版本是1.2.17,已停止更新(2012年5月)。另一种是2.x系列的版本,可名为Log4j2,目前的最新版本是2.14.1(2021年3月),还在不断的更新,Log4j2应该会逐渐取代Log4j1。其次,1.x版本的配置文件的后缀名可为".xml"和".properties",而2.x版本不再支持1.x中的以.properties为后缀的文件配置方式,其配置文件后缀名只能为".xml",".json"或者".jsn"。

二、入门级示例

在程序中使用Log4j之前,需要下载Log4j,1.x系列的Log4j的下载地址为:http://logging.apache.org/log4j/1.2/index.html
,下载完毕后,解压之,应该会发现很多文件,我们只取其中的log4j-1.2.17.jar包,并将其导入到项目的classpath中,然后再将log4j.properties配置文件放于src根目录中(配置文件的位置是可以随意的,只要在初始化Log4j配置时,其路径设置正确即可)。如此,就可以在程序中使用Log4j了。

1.新建一个Java项目,其名Log4jTest,导入1.x系列的Log4j库jar包:log4j-1.2.17.jar,整个项目的最终目录如下:
在这里插入图片描述

2.在src的根目录中创建并设置log4j配置文件

### 设置根记录器 ###
log4j.rootLogger = debug,A,B,C
 
### 输出日志信息到控制台 ###
log4j.appender.A = org.apache.log4j.ConsoleAppender
log4j.appender.A.Target = System.out
log4j.appender.A.layout = org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
 
### 输出DEBUG级别以上的日志到=D:\\logs\\log.log,分隔符为\\或//都可 ###
log4j.appender.B = org.apache.log4j.DailyRollingFileAppender
log4j.appender.B.File = D://logs//log.log
log4j.appender.B.Append = true  
log4j.appender.B.Threshold = DEBUG 
log4j.appender.B.layout = org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR级别以上的日志到=D:\\logs\\error.log,分隔符为\\或//都可 ###
log4j.appender.C = org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File = D://logs//error.log
log4j.appender.C.Append = true
log4j.appender.C.Threshold = ERROR 
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

3.在主程序中设置日志信息

package log4jtest;

import java.io.File;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 * @author ym
 */
public class Log4jTest {

    /**
     * @param args
     */
    public static void main(String[] args){
        // 加载配置文件进行初始化
        String path=System.getProperty("user.dir")+File.separator+"src"
                +File.separator+"log4j.properties";
        PropertyConfigurator.configure(path);
        // 获得记录器
        Logger logger = Logger.getLogger(Log4jTest.class);
        // 输出各种级别的日志信息
        // 记录debug级别的信息  
        logger.debug("This is debug message.");
        // 记录info级别的信息  
        logger.info("This is info message.");
        // 记录error级别的信息  
        logger.error("This is error message.");
    }
}

4.输出结果
(1)首先是输出到控制的日志信息
在这里插入图片描述
(2)再就是输出到文件中的日志信息
在这里插入图片描述

在这里插入图片描述
5.注意事项
在主程序中,我们是通过如下的代码手动初始化配置的:

// 加载配置文件进行初始化
String path=System.getProperty("user.dir")+File.separator+"src"
        +File.separator+"log4j.properties";
PropertyConfigurator.configure(path);

这是一种初始化配置的方式,但如果每次使用记录器输出日志信息,都需要手动设置properties文件的路径,那未免有些麻烦。那有没有自动初始化配置的方法呢?答案是:有的。但不管是上述的方法,还是接下来要介绍的方法,都需要告诉程序你的properties配置文件在哪里?只是上述的方法除了要告诉路径外,还要手动初始化配置而已。

如果要告诉程序你的properties配置文件在哪里?可把配置文件所在的文件夹路径添加到classpath中,如例子中的配置文件是在src文件夹中,那么只要把src的路径添加到classpath中即可,如下,往classpath添加了src路径:
在这里插入图片描述
如此,就可以使用如下的程序输出日志信息了,显然,相比于手动初始化配置,这种方式无疑要简洁一些。

package log4jtest;

import org.apache.log4j.Logger;

/**
 * @author ym
 */
public class Log4jTest {

    /**
     * @param args
     */
    public static void main(String[] args){
        // 获得记录器
        Logger logger = Logger.getLogger(Log4jTest.class);
        // 输出各种级别的日志信息
        // 记录debug级别的信息  
        logger.debug("This is debug message.");
        // 记录info级别的信息  
        logger.info("This is info message.");
        // 记录error级别的信息  
        logger.error("This is error message.");
    }
}

三、配置文件

1.x系列的Log4j支持两种配置文件格式,一种是XML格式的文件(.xml),另一种是properties格式的文件(.properties)。下面我们介绍的是properties格式的配置文件:
配置文件示例:

### 设置根记录器 ###
log4j.rootLogger = debug,A,B,C
 
### 输出日志信息到控制台 ###
log4j.appender.A = org.apache.log4j.ConsoleAppender
log4j.appender.A.Target = System.out
log4j.appender.A.layout = org.apache.log4j.PatternLayout
log4j.appender.A.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
 
### 输出DEBUG级别以上的日志到=D:\\logs\\log.log,分隔符为\\或//都可 ###
log4j.appender.B = org.apache.log4j.DailyRollingFileAppender
log4j.appender.B.File = D://logs//log.log
log4j.appender.B.Append = true  
log4j.appender.B.Threshold = DEBUG 
log4j.appender.B.layout = org.apache.log4j.PatternLayout
log4j.appender.B.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR级别以上的日志到=D:\\logs\\error.log,分隔符为\\或//都可 ###
log4j.appender.C = org.apache.log4j.DailyRollingFileAppender
log4j.appender.C.File = D://logs//error.log
log4j.appender.C.Append = true
log4j.appender.C.Threshold = ERROR 
log4j.appender.C.layout = org.apache.log4j.PatternLayout
log4j.appender.C.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

(1)配置根记录器Logger,其语法为:

log4j.rootLogger = [ level ] , appenderName1, appenderName2, …

其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过定义此处的级别,可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了DEBUG级别,则应用程序中所有级别的日志信息都将被打印出来,而如果在这里定义了INFO级别,则应用程序中的DEBUG级别的日志信息将不被打印出来,因为DEBUG的优先级低于INFO的优先级。为了可以打印所有级别的日志信息,此处一般把级别设置为DEBUG。appenderName是追加器的名称,用于指定日志信息所输出的地方。追加器可以有多个,即可以同时指定多个输出目的地。

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

log4j.appender.appenderName = 全限定类名
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN

其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(3)各种追加器的选项设置

  • ConsoleAppender选项
    Threshold=WARN:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    Target=System.err:默认情况下是:System.out,指定输出控制台
  • FileAppender 选项
    Threshold=WARN:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息追加到指定文件中,false指将消息覆盖指定的文件内容。
  • DailyRollingFileAppender 选项
    Threshold=WARN:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息追加到指定文件中,false指将消息覆盖指定的文件内容。
    DatePattern=’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
’.'yyyy-MM: 每月
’.'yyyy-ww: 每周
’.'yyyy-MM-dd: 每天
’.'yyyy-MM-dd-a: 每天两次
’.'yyyy-MM-dd-HH: 每小时
’.'yyyy-MM-dd-HH-mm: 每分钟
  • RollingFileAppender 选项
    Threshold=WARN:指定日志消息的输出最低层次。
    ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
    File=mylog.txt:指定消息输出到mylog.txt文件。
    Append=false:默认值是true,即将消息追加到指定文件中,false指将消息覆盖指定的文件内容。
    MaxFileSize=100KB:后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
    MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
    (4)配置日志信息的布局,其语法为:
log4j.appender.appenderName.layout = 全限定类名
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN

其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式,推荐使用这种),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

(4)日志输出格式的设置
在配置文件中可以通过log4j.appender.appenderName.layout.ConversionPattern设置日志的输出格式。
各种通配符如下:

%p: priority,输出日志信息的优先级,即ALL,DEBUG,INFO,WARN,ERROR,FATAL, OFF
%d: date,输出日志记录的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: class,输出日志信息所属的类目(类信息从创建logger时传入的Class对象className.class中获得),通常就是所在类的全限定类名,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间。
%C: 列出调用logger的类的全限定名称(包含包路径),假设当前类是"org.apache.xyz.SomeClass",%C表示org.apache.xyz.SomeClass,%C{1}表示SomeClass。
%t: thread,输出产生该日志事件的线程名,主程序中的线程名默认是main
%l: location,输出日志事件的发生位置,相当于%c.%t(%f:%L)的组合,包括类目、发生的线程,以及在代码中的行数。举例:log4jtest.Log4jTest.main(Log4jTest.java:24)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中
%%: 输出一个”%”字符
%F: file name,输出日志消息产生时所在的源文件名称
%L: line number,输出调用logger的代码行的行号
%m: message,输出代码中的指定消息,即日志的具体信息
%M: 输出调用logger的方法名
%n: 输出一个回车换行符,Windows平台为”/r/n”,Unix平台为”/n”输出日志信息换行

可以在%与通配字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:

%20c   :指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
%-20c  :指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
%.30c  :指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。 

在这里插入图片描述

log4j.logger 用法如下

    # 1)log4j.logger.包名 = 日志级别 , appenderName1,appenderName2,....
    # 定义该包名下的所有类的日志输出
    # 2)log4j.logger.类全名含包名 = 日志级别 ,appenderName1,appenderName2,....
    # 定义指定类的日志输出
    # 3) log4j.logger.日志对象Logger命名名称 = 日志级别 , appenderName1,appenderName2,....
    # 定义了某命名名称的日志的 输出,如: 
    # log4j.logger.Log1 就是指定义通过 Logger.getLogger("Log1") 获取的日志对象的日志输出
     
    #以log4j.logger.包名为例子
    log4j.logger.edu.service.impl = error,service_stdout,service_logfile
    log4j.appender.service_stdout=org.apache.log4j.ConsoleAppender 
    log4j.appender.service_stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.service_stdout.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n
    log4j.appender.service_logfile = org.apache.log4j.DailyRollingFileAppender
    log4j.appender.service_logfile.file=d:\\log\\service.log
    log4j.appender.service_logfile.DatePattern= '.'yyyy-MM-dd
    log4j.appender.service_logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.service_logfile.layout.ConversionPattern=[%p][%d{yyyy-MM-dd HH:mm:ss}][%C{1}:%L] - %m%n
    log4j.appender.service_logfile.Encoding=UTF-8
    ```
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值