log4j取代System.out.pringln()

更新时间:2023-03-08 18:23:59 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、简介

在程序中输出信息的目的有三:一是监视程序运行情况;一是将程序的运行情况记录到日志文件中,以备将来查看;一是做为调试器。但信息输出的手段不仅限于System.out.println()或System.out.print(),还有日志记录工具可以选择。与System.out.pringln()和System.out.print()相比,日志记录工具可以控制输出级别,并且可以在配置文件中对输出级别进行设置,这样开发阶段的信息在程序发布后就可以通过设置输出级别来消除掉,而无须对代码进行修正了。现在流行的日志记录工具很多,Log4J就是其中的佼佼者。

Log4J是由著名开源组织Apache推出的一款日志记录工具,供Java编码人员做日志输出之用,可以从网站http://logging.apache.org/log4j上免费获得,最新版本1.2.11。获得logging-log4j-1.2.11.zip文件后,解压缩,需要的是其中的log4j- 1.2.11.jar文件,将该文件放到特定的文件夹中备用,我放到了我机器的G:\\YPJCCK\\Log4J\\lib文件夹中。

这里选择的 IDE是Eclipse和JBuilder。Eclipse用的是3.0.1加语言包,可以到www.eclipse.org网站上下载;JBuilder用的是 JBuilder 2005。 二、配置类库

下面打开Eclipse或JBuilder。

如果使用的是Eclipse,那么在Eclipse打开后,点击菜单\文件\新建\项目\,打开\新建项目\对话框:

请选中\项目\,点击\下一步\,进入\新建Java项目\对话框:

在这个对话框中需要设置项目的名称以及项目所在目录,我为自己的项目起名为Log4JTest,目录为 G:\\YPJCCK\\Log4J\\Eclipse\\Log4JTest。设置好后点击\下一步\,进入下一个窗口。在这个窗口中选择名为\库\的选项卡,然后点击\添加外部JAR\按钮,将保存于特定文件夹中的log4j-1.2.11.jar文件引用进来。

设置好后,点击\完成\,至此,已经具备了在Eclipse下使用Log4J的环境。

如果使用的是 JBuilder,那么在JBuilder打开后,点击菜单\ools\->\,打开\对话框:

点击\按钮,打开\对话框:

使用\按钮将保存于特定文件夹中的log4j-1.2.11.jar文件引用进来,并设置Name,即该类库的名字,我将Name设置为Log4J。设置好后点击\按钮,回到\Libraries\对话框,再点击\按钮,则JUnit类库已经被添加到JBuilder当中。

下面继续,在JBuilder中创建项目。点击菜单\Project\,打开\Wizard\对话框:

在这个窗口中设置项目名称及存放目录,我的项目名称仍为Log4JTest,路径为G:/YPJCCK/log4J /JBuilder/Log4JTest。点击\进入下一个窗口:

在这个窗口中选择\Libraries\选项卡,点击\按钮,将刚才设置的JUnit库引用进来。然后点击\按钮,进入下一个窗口:

在这个窗口中用鼠标点击Encoding下拉列表框,然后按一下\键,选中相应选项,此时该项目的字符集就被设置成 GBK了。如果做的是国内项目,这绝对是个好习惯。最后点击\,项目创建完成。 三、编写一个简单的示例

在了解 Log4J的使用方法之前,先编写一个简单的示例,以对Log4J有个感性认识。 如果使用的是Eclipse,请点击\文件\新建\类\,打开\新建Java类\对话框,设置包为piv.zheng.log4j.test,名称为Test,并确保\选项选中;如果使用的是JBuilder,请点击\Class\,打开\Wizard\对话框,设置Package为piv.zheng.log4j.test,Class name为Test,并确保\选项选中。设置完成后,点击\。代码如下: package piv.zheng.log4j.test;

import org.apache.log4j.Logger; import org.apache.log4j.Level;

import org.apache.log4j.SimpleLayout; import org.apache.log4j.ConsoleAppender;

public class Test {

public static void main(String[] args) {

SimpleLayout layout = new SimpleLayout();

ConsoleAppender appender = new ConsoleAppender(layout);

Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.setLevel(Level.FATAL);

log.debug(\ log.info(\ log.warn(\ log.error(\ log.fatal(\ } }

至此,示例编写完成。请点击运行按钮旁边的倒三角,选择\运行为\Java应用程序\(Eclipse),或者在Test类的选项卡上点击鼠标右键,在调出的快捷菜单中点击\defaults\(JBuilder),运行程序,观察从控制台输出的信息。 四、Log4J入门

看过程序的运行效果后可能会奇怪,为何控制台只输出了\这样一条信息,而程序代码中的log.debug()、log.info()等方法也都设置了类似的内容,却没有被输出?其实答案很简单,但在公布之前,先来了解一下Log4J的使用。

请先看前边的示例代码,会发现,示例中用到了Logger、Level、 ConsoleAppender、SimpleLayout等四个类。其中Logger类使用最多,甚至输出的信息也是在其对象log的fatal

方法中设置的,那么Logger究竟是做什么的呢?其实Logger就是传说中的日志记录器(在Log4J中称为Category),创建方法有三: 1.根Category,默认创建,获取方法:

Logger log = Logger.getRootLogger();

2.用户创建的Category,方法:

Logger log = Logger.getLogger(\

其中字符串test是为Category设定的名称。Category的名称允许使用任何字符,但区分大小写,例如:

Logger l1 = Logger.getLogger(\ Logger l2 = Logger.getLogger(\

l1和l2就是两个Category;而如果名称完全相同,例如:

Logger l1 = Logger.getLogger(\ Logger l2 = Logger.getLogger(\

l1和l2就是同一个Category。此外,符号\在Category的名称中有特殊作用,这一点将在后边介绍。

3.与方法2类似,只是参数由字符串换成了类对象,其目的是通过类对象获取类的全名。这个方法比较常用,示例中使用的就是这个方法。

那么Category是如何输出信息的呢?其实示例中用到的debug、info、warn、error、fatal等五个方法都是用来输出信息的。什么,怎么这么多?原因很简单,Log4J支持分级输出。Log4J的输出级别有五个,由低到高依次是DEBUG(调试)、INFO(信息)、WARN(警告)、ERROR(错误)和FATAL(致命),分别与以上方法对应。当输出级别设置为DEBUG时,以上方法都能够输出信息,当输出级别设置为INFO时,则只有debug方法将不能再输出信息,依此类推,当输出级别设置为FATAL时,就只有fatal方法可以输出信息了。现在再回头看前边的问题,为何只有设置给fatal方法的信息被输出就不难理解了,示例中有这样一行代码:

log.setLevel(Level.FATAL);

正是这行代码将log对象的输出级别设成了FATAL。在为log对象设置输出级别时用到了Level类,该类中定义了DEBUG、INFO、 WARN、ERROR、FATAL等五个静态对象,与五个输出级别相对应。此外,Level还有两个特殊的静态对象ALL和OFF,前者允许所有的方法输出信息,其级别其实比DEBUG还低;后者则会禁止所有的方法输出信息,其级别比FATAL要高。除前边示例中用到的五个方法,Logger还提供了这五个方法的重载,以在输出信息的同时抛出异常,以fatal方法为例:

log.fatal(\

执行后输出信息:

FATAL - Here is FATAL

java.lang.Exception: Exception

at piv.zheng.log4j.test.Test.main(Test.java:24)

其他方法类似。此外,Logger还提供了log方法,该方法不针对任何输出级别,需要在调用时设置,例如:

log.log(Level.FATAL, \

log.log(Level.FATAL, \

虽然一般情况下log方法不如其它方法方便,但由于允许设置级别,因此log方法在很多时候反而比其它方法更灵活,甚至可以在输出级别为OFF时输出信息。不过log方法主要是给用户自定义的输出级别用的,而且设立OFF输出级别的目的也为了不输出任何信息,因此请不要在log方法中使用OFF来输出信息。 此外,Category的输出级别并非必须,若未设置,子Category会默认使用其父Category的输出级别,若父 Category也没设置,就使用再上一级Category的设置,直到根Category为止。根Category默认输出级别为DEBUG,因此在示例中,若将\一行注释掉,则所有方法都会输出信息。 下面简单介绍一下Log4J中 Category的继承关系。其实在Log4J中Category之间是存在继承关系的,根Category默认创建,是级别最高的Category,用户创建的Category均继承自它。而用户创建的Category之间也存在继承关系,例如:

Logger lx = Logger.getLogger(\ Logger lxy = Logger.getLogger(\ Logger lx_y = Logger.getLogger(\ Logger lx_z = Logger.getLogger(\ Logger lx_y_z = Logger.getLogger(\

其中的lx_y、lx_z就是lx的子Category,而lx_y_z是lx_y的子Category。但lxy并不是lx的子 Category。也许有点乱,下面来一个一个看。首先看与lx_y、lx_z对应的Category的名称\和\,\前边的是什么,\,这说明与名称为\的Category对应lx就是它们的父Category;而与lx_y_z对应的Category的名称\,最后一个\前边的是什么,\,这说明lx_y是lx_y_z的父Category;至于lxy,由于与之对应的 Category名称\之间没有\,因此它是一个与lx同级的Category,其父Category就是根Category器。此外还有一种情况,例如有一个名称为\的Category,如果没有名称为\的Category,那么它的父Category也是根Category。前边说过,\在Category名称中有特殊作用,其实它的作用就是继承。至此,为何使用类对象来创建Category也就不难理解了。

可是,仅有Category是无法完成信息输出的,还需要为Category添加Appender,即Category的输出源。前边的例子使用的是 ConsoleAppender,即指定Category将信息输出到控制台。其实Log4J提供的Appender有很多,这里选择几常用的进行介绍。

1.org.apache.log4j.WriterAppender,可以根据用户选择将信息输出到Writer或OutputStream。 示例代码:

SimpleLayout layout = new SimpleLayout ();

//向文件中输出信息,OutputStream示例 WriterAppender appender1 = null; try {

appender1 = new WriterAppender(layout, new FileOutputStream(\ }

catch(Exception ex) {}

//向控制台输出信息,Writer示例 WriterAppender appender2 = null; try { appender2 = OutputStreamWriter(System.out)); }

catch(Exception ex) {}

new WriterAppender(layout, new

//Category支持同时向多个目标输出信息 Logger log = Logger.getLogger(Test.class); log.addAppender(appender1); log.addAppender(appender2);

log.debug(\

这个示例由第一个示例修改而来,没有设置输出级别,而且向Category中添加了两个输出源,运行后会在控制台中输出\,并在工程目录下生成test.txt文件,该文件中也记录着\。若要将test.txt文件放到其它路径下,例如f:,则将\改为\,又如e:下的temp 文件夹,就改为\。后边FileAppender、RollingFileAppender以及 DailyRollingFileAppender设置目标文件时也都可以这样来写。 2.org.apache.log4j.ConsoleAppender,向控制台输出信息,继承了WriterAppender,前边的示例使用的就是它。

3.org.apache.log4j.FileAppender,向文件输出信息,也继承了WriterAppender。 示例代码:

SimpleLayout layout = new SimpleLayout();

//若文件不存在则创建文件,若文件已存在则向文件中追加信息 FileAppender appender = null; try {

appender = new FileAppender(layout, \ } catch(Exception e) {}

Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\

这个示例也由第一个示例修改而来,运行后会在工程目录下生成test.txt文件,该文件中记

录着\。再次运行程序,查看文件,则\有两行。 另外,FileAppender 还有一个构造:

FileAppender(Layout layout, String filename, boolean append)

与示例的类似,只是多了一个boolean型的参数append。append参数是个开关,用来设置当程序重启,而目标文件已存在时,是向目标文件追加信息还是覆盖原来的信息,当值为true时就追加,这是FileAppender默认的,当值为false时则覆盖。此外,FileAppender还提供了setAppend方法来设置append开关。

4.org.apache.log4j.RollingFileAppender,继承了FileAppender,也是向文件输出信息,但文件大小可以限制。当文件大小超过限制时,该文件会被转为备份文件或删除,然后重新生成。文件的转换或删除与设置的备份文件最大数量有关,当数量大于0时就转为备份文件,否则(小于等于0)删除,默认的备份文件数量是1。转换备份文件非常简单,就是修改文件名,在原文件名之后加上\,例如文件test.txt,转为备份文件后文件名为\。但若同名的备份文件已存在,则会先将该备份文件删除或更名,这也与设置的备份文件最大数量有关,若达到最大数量就删除,否则更名。若备份文件更名时也遇到同样情况,则使用同样的处理方法,依此类推,直到达到设置的备份文件最大数量。备份文件更名也很简单,就是将扩展名加1,例如test.txt.1文件更名后变为test.txt.2,test.txt.2文件更名后变为test.txt.3。 示例代码:

SimpleLayout layout = new SimpleLayout();

//若文件不存在则创建文件,若文件已存在则向文件中追加内容 RollingFileAppender appender = null; try {

appender = new RollingFileAppender(layout, \ } catch(Exception e) {}

//限制备份文件的数量,本例为2个 appender.setMaxBackupIndex(2);

//限制目标文件的大小,单位字节,本例为10字节 appender.setMaximumFileSize(10);

Logger log = Logger.getLogger(Test.class); log.addAppender(appender);

log.debug(\ log.debug(\ log.debug(\

程序运行后,会在工程目录下生成test.txt、test.txt.1和test.txt.2三个文件,其中test.txt内容为空,而后两个文件则分别记录着\和\,这是怎么回事?原来由于目标文件大小被限制为10字节,而三次使用log.debug方法输出的信息都超过了10字节,这样就导致了三次备份文件转换,所以test.txt内容为空。而备份文件最大数量被设为2,因此第一次转换的备份文件就被删掉了,而后两次的则保存下来。此外,由于 test.txt转换备份文件时是先转为test.txt.1,再转为test.txt.2,因此最后test.txt.2的内

容是\,而test.txt.1是\,这点千万别弄混了。 另外,RollingFileAppender还提供了两个方法:

(1)setMaxFileSize,功能与 setMaximumFileSize一样,但参数是字符串,有两种情况:一是仅由数字组成,默认单位为字节,例如\,即表示限制文件大小为 100字节;一是由数字及存储单位组成,例如\、\、\,其中单位不区分大小写,分别表示限制文件大小为1K、1M、1G。

(2)rollOver,手动将目标文件转换为备份文件,使用起来较灵活,适用于复杂情况。 示例代码:

SimpleLayout layout = new SimpleLayout();

RollingFileAppender appender = null; try {

appender = new RollingFileAppender(layout, \ } catch(Exception e) {}

appender.setMaxBackupIndex(2);

Logger log = Logger.getLogger(Test.class); log.addAppender(appender);

log.debug(\ appender.rollOver(); log.debug(\ appender.rollOver(); log.debug(\ appender.rollOver();

这里没限制目标文件大小,但程序运行后,效果与上例相同。

5.org.apache.log4j.DailyRollingFileAppender,也继承了 FileAppender,并且也是向文件输出信息,但会根据设定的时间频率生成备份文件。 时间频率格式简介:

'.'yyyy- MM,按月生成,生成时间为每月最后一天午夜过后,例如test.txt在2005年7月31日午夜过后会被更名为test.txt.2005-07,然后重新生成。

'.'yyyy-ww,按周生成,生成时间为每周六午夜过后,例如test.txt在2005年8月13日午夜过后会被更名为 test.txt.2005-33,33表示当年第33周。

'.'yyyy-MM-dd,按天生成,生成时间为每天午夜过后,例如2005年 8月16日午夜过后,test.txt会被更名为test.txt.2005-08-16。

'.'yyyy-MM-dd-a,也是按天生成,但每天会生成两次,中午12:00过后一次,午夜过后一次,例如test.txt在2005年8月16日12:00过后会被更名为 test.txt.2005-8-16-上午,午夜过后会被更名为test.txt.2005-8-16-下午。 '.'yyyy-MM- dd-HH,按小时生成,例如test.txt在2005年8月16日12:00过后会被更名为test.txt.2005-8-16-11。

'.'yyyy-MM-dd-HH-mm,按分钟生成,例如test.txt在2005年8月16日12:00过后会被更名为 test.txt.2005-8-16-11-59。 示例代码:

SimpleLayout layout = new SimpleLayout();

DailyRollingFileAppender appender = null; try {

appender = new DailyRollingFileAppender(layout, \\

} catch(Exception e) {}

Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\

编码完成后运行程序,等一分钟后再次运行,由于我是在2005年8月17日15:42分第一次运行程序的,因此工程目录下最终有两个文件test.txt和 test.txt.2005-08-17-15-42。 6.org.apache.log4j.AsyncAppender,用于管理不同类型的Appender,也能实现同时向多个源输出信息,但其执行是异步的。 示例代码:

SimpleLayout layout = new SimpleLayout();

//向控制台输出

ConsoleAppender appender1 = null; try {

appender1 = new ConsoleAppender(layout); } catch(Exception e) {}

//向文件输出

FileAppender appender2 = null; try {

appender2 = new FileAppender(layout, \ } catch(Exception e) {}

//使用AsyncAppender实现同时向多个目标输出信息 AsyncAppender appender = new AsyncAppender(); appender.addAppender(appender1); appender.addAppender(appender2);

Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\ 此外,AsyncAppender和Logger都提供了更多的方法来管理Appender,例如getAppender、 getAllAppenders、removeAppender和removeAllAppenders,分别用来获取指定的Appender、获取全部 Appender、移除指定的Appender以及移除全部Appender。 7.org.apache.log4j.jdbc.JDBCAppender,将信息输出到数据库。 示例代码:

JDBCAppender appender = new JDBCAppender(); appender.setDriver(\

appender.setURL(\ appender.setUser(\

appender.setPassword(\

appender.setSql(\

Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\

这里使用的数据库是MySQL 5.0.4beta,用户名root,密码11111111,我在其中建了一个库zheng,包含表log4j,该表只有一个字段msg,类型为 varchar(300)。此外,本例用到的JDBC驱动可以从http://dev.mysql.com/downloads/connector/j/3.1.html下载,版本3.1.8a,下载mysql-connector-java-3.1.8a.zip文件后解压缩,需要其中的mysql-connector- java-3.1.8-bin.jar文件。下面再来看代码。由于JDBCAppender内部默认使用PatternLayout格式化输出信息,因此这里没用到SimpleLayout,而appender.setSql所设置的SQL语句就是PatternLayout所需的格式化字符串,故此其中才有\这样的字符,有关PatternLayout的具体内容后边介绍。执行后,表log4j增加一条记录,内容为\。 8.org.apache.log4j.nt.NTEventLogAppender,向Windows NT系统日志输出信息。 示例代码:

SimpleLayout layout = new SimpleLayout();

NTEventLogAppender appender = new NTEventLogAppender(\

Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\

注意,要完成此示例,还需向 C:\\WINNT\\system32文件夹(我的操作系统装在了C:\\)中复制一个名为NTEventLogAppender.dll的文件。如果跟我一样用的是Log4J 1.2.11,实在对不住,Log4J 1.2.11并未提供该文件。虽然logging-log4j-1.2.11.zip文件解压缩后,其下的src\\java\\org\\apache \\log4j\\nt文件夹中有一个make.bat文件执行后可以编译出该文件,但还需要配置,很麻烦。还好,条条大道通罗马,1.2.11不行,就换 1.2.9,可以从http://apache.justdn.org/logging/log4j/1.2.9下载,下载后解压缩logging-log4j-1.2.9.zip文件,在其下的src\\java\\org\\apache\\log4j\\nt文件夹中找到 NTEventLogAppender.dll,复制过去就可以了。程序执行后,打开\事件查看器\,选择\应用程序日志\,其中有一条来源为Java的记录,这条记录就是刚才输出的信息了。

9.org.apache.log4j.lf5.LF5Appender,执行时会弹出一个窗口,信息在该窗口中以表格的形式显示。 示例代码:

LF5Appender appender = new LF5Appender(); Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\

由于LF5Appender不需要Layout格式化输出信息,因此这里没有设置。此外LF5Appender还提供了一个setMaxNumberOfRecords方法,用来限制信息在表格中显示的行数。 10.org.apache.log4j.net.SocketAppender,以套接字方式向服务器发送日志,然后由

服务器将信息输出。 示例代码:

//指定要连接的服务器地址及端口,这里使用的是本机9090端口

SocketAppender appender = new SocketAppender(\ Logger log = Logger.getLogger(Test.class); log.addAppender(appender); log.debug(\

SocketAppender不需要设置Layout,因为SocketAppender不负责输出信息。那么如何看到信息输出的效果呢?这就需要SocketServer和 SimpleSocketServer了。 示例代码1:

package piv.zheng.log4j.test;

import org.apache.log4j.net.SocketServer;

public class TestServer {

public static void main(String[] args) {

SocketServer.main(new String[]{\\\ } }

这是 SocketServer的示例。SocketServer只有一个静态方法main,该方法意味着SocketServer不仅可以在代码中被调用,也可以用java命令执行。main方法只有一个参数,是个字符串数组,但要求必须有三个元素:元素一用来指定端口,本例为9090;元素二用来指定输出信息时需要的配置文件,该文件放在工程目录下,本例使用的test.properties内容如下:

log4j.rootLogger=, console

log4j.appender.console =org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.SimpleLayout

该配置指定 SocketServer使用ConsoleAppender以SimpleLayout格式输出信息;元素三用来指定一个路径,以存放.lcf文件,我指定的是本机的G:/YPJCCK/Log4J文件夹。.lcf文件也是输出信息时使用的配置文件,格式与元素二所指定的配置文件一样,但 test.properties是默认配置文件,即当.lcf文件找不到时才使用。那么.lcf文件如何命名呢?其实.lcf文件的名称并不是随意起的,当SocketAppender与SocketServer建立连接时,SocketServer就会获得SocketAppender所在计算机的IP 地址与网络ID,并将其格式化成\网络ID/IP地址\这样的字符串,然后获取其中的网络ID作为.lcf文件的主名,例如\,其中的\就是主文件名,而后再根据这个文件名来调用相应的.lcf文件。这意味着对不同的计算机可以提供不同的配置文件,使信息输出时有不同的效果。此外,SocketServer还默认了一个名为generic.lcf的文件,用于处理网络ID获取不到或其他情况,本例是用的就是这个文件,内容如下: log4j.rootLogger=, console

log4j.appender.console =org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%m%n

该配置指定 SocketServer使用ConsoleAppender以PatternLayout格式输出信息。运行程

NDC.pop(); //从堆栈中移除信息,但移除的只是最后的信息 log.debug(\

NDC.pop(); //再次从堆栈中移除信息 log.debug(\ log.debug(\

这里格式化输出信息使用的是 TTCCLayout,还记得其setContextPrinting方法吗?程序运行后,从输出的信息就可以看到效果了。此外,NDC还提供了其他方法:

(1)get,获取堆栈中的全部信息。以上例为例,当输出Test2时,使用该方法会获得\。 (2)peek,获取堆栈中最后的信息。仍以上例为例,当输出Test1时会获得\,Test2时为\,而当输出Test3时由于\已被移除,\又成了最后的信息,因此获得的仍是\。 (3)clear,清空堆栈中的全部信息。

(4)setMaxDepth,设置堆栈的最大深度,即当前的信息可以保留多少,对之后追加的信息没有影响。当需要一次清掉多条信息时,使用setMaxDepth会比多次调用pop方便。 2.org.apache.log4j.MDC。 MDC是Mapped Diagnostic Context的简写,意为映射诊断环境,提供了一个Map对象来保存信息。Map对象使用Key、Value的形式保存值。 示例代码:

PatternLayout layout = new PatternLayout(\ ConsoleAppender appender = new ConsoleAppender(layout); Logger log = Logger.getLogger(Test.class); log.addAppender(appender);

log.debug(\ //添加信息到Map中

MDC.put(\ MDC.put(\ log.debug(\

//添加信息到Map中,若Key重复,则覆盖之前的值 MDC.put(\ MDC.put(\ log.debug(\

//将信息从Map中移除,此时信息不再输出 MDC.remove(\ MDC.remove(\ log.debug(\

这个示例演示了MDC的基本用法,格式化信息用的也是PatternLayout,模式字符为\,其格式必须为\。其中Key就是向 Map对象添加信息时put方法所用的Key,这里为name和ip。由于可以使用\输出信息,因此MDC使用起来会比NDC更灵活。此外,MDC还提供了get方法来获取指定Key的信息。 六、小结

用了近半个月,终于大概掌握了Log4J。由于本文是边学边写的,目的是将Log4J的

用法记录下来,而非提供一份中文参考,因此内容并不细致,但尽量提供了示例。不过到最后才发现,示例存在问题,其实Logger做为类的static成员比较恰当,而我为了图方便,竟直接写到了main方法中,这一点还请注意。

此外,这里再推荐一下《The Complete log4j Manual》,是对Log4J较详细的介绍,在网上可以找到,只不过是英文的。

本文来源:https://www.bwwdw.com/article/ytq6.html

Top