log4j2的使用,log4j教程菜鸟

log4j2的使用,log4j教程菜鸟,log4j使用教程详解(怎么使用log4j2)

我就不告诉你Log4j 2的好处了。如果你搜索的是2,说明你已经对它有所了解,并且想使用它,那么你可以从这里入手。

1.去官方下载log4j 2,导入jar包。基本上只需要导入以下两个jar包(xx是一堆版本号):

log4j-core-xx.jar

log4j-api-xx.jar

2.导入到你的项目中:这个我就不说了。

3.开始使用:

我们知道,要使用log4j记录类中的日志,只需要声明以下成员变量(其实不一定是成员变量,只是为了调用方便)

复制代码如下:private static logger logger=log manager . get logger(myapp . class . getname());

getLogger中有一个参数指定了这个记录器的名称。该名称在配置文件中是必需的。我们以后再谈这个。

一旦Logger对象被声明,我们就可以在代码中使用它。

4.日志级别:

现在我们要调用logger的方法,但是这个Logger对象中有很多方法,所以我们首先要知道log4j的日志级别,它指定了几个默认级别:TraceDebugInfoWarnerError等。这里解释一下:

1)级别之间存在包含关系,这意味着如果将日志级别设置为trace,则将输出所有大于或等于该级别的日志。

2)基本上默认水平没多大区别,只是一个默认设置。你可以通过它的API定义自己的级别。也可以随意调用这些方法,但是要在配置文件中处理好,不然就不能当日志用了,也不好读。相当于一个规范,完全可以定义一个集合。没必要用。

3)这些不同层次的含义,大家都很容易理解。下面简单介绍一下:

Trace:是tracing,就是程序在下面推进的话,可以写一个trace输出,所以应该会有很多trace,不过没关系。我们可以设置最小日志级别来阻止他输出。

调试:调试?我一般只把这个作为最低级。trace根本不用。如果不能,就用eclipse或者idea的调试功能。

信息:输出你感兴趣或重要的信息。这个用的最多。

警告:有些信息不是错误信息,但有些提示也要给程序员。类似于eclipse中代码的验证,没有错误和警告(不是错误,但也请注意,比如下面的depressed方法)。

错误:错误消息。也用的很多。

致命:水平比较高。大错特错,你可以直接在这个级别停止程序。这是不应该发生的错误!别这么紧张,其实是个度的问题。

5.记录通话:

这里写个类就行了,调用就这么简单。log4j的核心在配置文件中。

复制代码如下:importorg阿帕奇;伐木;log4j水平;导入org . Apache . logging . log4j . log manager;导入org . Apache . logging . log4j . logger;

公共类Hello {

static Logger Logger=log manager . get Logger(hello . class . getname());

公共布尔hello(){ logger . entry();//跟踪级别信息,单独列出来是希望你在某个方法或者程序逻辑的开头调用,基本上和logger . trace(' entry ')logger . error(' do it again!)的意思是一样的);//错误等级信息,参数是你输出的information logger.info('我是info information ');//info级别信息logger.debug('我是调试信息');Logger.warn(“我是警告信息”);Logger.fatal('我是致命信息');Logger.log(级别。DEBUG,‘我是调试消息’);//这是打等级式的电话:没事干的人不一定打这个电话!logger . exit();entry()和logger.trace('exit ')对应的结束方法;一个返回假的意思;}}

如果没有自定义配置文件,上面的类正在编写一个main方法,控制台将输入以下内容:

复制代码如下:19:09:40.256[main]error cn . lsw . base . log4j 2 . hello-又做了!19:09:40.260[Main]Fatal cn . lsw . base . log4j 2 . hello-我是致命信息

看到了吧,只来了=ERROR的日志输出(这是因为Log4j有默认配置,它的日志级别是ERROR,输出只有控制台)。如果我已经定义了日志,并将日志级别更改为TRACE,则输出将如下所示:

复制代码如下:19:11:36.941 trace cn . lsw . base . log4j 2 . hello 12 hello-entry 19:11:36.951 error cn . lsw . base . log4j 2 . hello 13 hello-又做了!19:11:36.951 infocn . lsw . base . log4j 2 . hello 14你好-我是infoinfo 19:11:36.951 debugcn . lsw . base . log4j 2 . hello 15你好-我是debug info 19:11:36.951 warn cn . lsw . base . log4j 2 . hello 16你好-我是warn信息19:11:36.952 Fatal cn . lsw . base . log4j 2

所有的日志都打印出来了,大家可以看看上面的代码。

6.配置文件:

现在让我们言归正传。

我以为Log4J 2应该有默认的配置文件,但是好像没有找到。以下配置文件等同于默认配置:

复制代码如下:xml版本='1.0 '编码='UTF-8 '?配置状态='OFF' appenders控制台名称=' Console ' target=' SYSTEM _ OUT ' pattern布局模式='%d{HH:mm:ss。SSS }[% t]%-5 level % logger { 36 }-% msg % n '//Console/appenders loggers root level=' error ' appender-ref=' Console '//root/loggers/configuration

而我们只需要把configurationloggersroot的level属性改成trace,就可以输出刚才写的所有信息了。相信用过Log4j的人对这个配置文件并不陌生。Log4J的传统配置一直是。属性文件和键值对。那个配置方法很难看,但是基本上,我们也能从这个配置文件里看到Log4J 1的影子,无非就是appender,layout之类的,意思基本一致。

这里没必要仔细讲配置文件。你只需要知道一些基本的配置。我在这里写几个配置文件,并给出一些注释和说明,基本可以用。

第一个例子:

复制代码如下:xml版本='1.0 '编码='UTF-8 '?配置状态='OFF' appenders控制台名称=' Console ' target=' SYSTEM _ OUT ' pattern布局模式='%d{yyyy-MM-dd HH:mm:ss。SSS }[% t]%-5 level % logger { 36 }-% msg % n '//Console/appenders loggers!-我们只让这个记录器输出跟踪信息,其他都是错误级别-!-如果附加性被打开,该记录器将被打印两次,因为它也满足root。但是root logger的级别是error,为什么栏中的跟踪信息会打印两次-logger name=' cn . lsw . base . log4j 2 . hello ' level=' trace ' additional=' false ' appender-ref=' Console '//logger root level=' error ' appender-ref=' Console '//root/loggers/configuration

下面简单介绍一下配置文件。

1)根节点配置,然后有两个子节点:appender和loggers(两者都是复数,这意味着可以定义许多appender和loggers)(如果您想详细了解这个xml的结构,可以在jar包下找到xsd文件和dtd文件)

2)appenders:这在下面被定义为每个appender,即输出。分类很多,这里就不多说了(很容易造成理解和解释上的压力,刚开始可能理解不了,等于白说)。首先看这个例子。控制台只有一个,这些节点也不是随便命名的。控制台是指输出控制台。然后为这个输出设置一些属性。输出格式在这里用PatternLayout设置,基本就是之前的时间,线程,级别,日志者名字,日志信息等。差不多。你可以自己检查他们的语法规则。

3)记录器许多记录器将在下面定义。这些记录器通过它们的名称来区分,以便通过参考上面定义的记录器来为不同的记录器配置不同的输出。注意,appender-ref引用的值是上面每个appender的名称,而不是节点名称。

这个例子说明了什么?先说一下这个日志器的名字(前面提到的)。

7.机构名称:

这里,我们看到配置文件中的名称非常重要。是的,这个名字不能随便起(其实可以随便起)。机制非常简单。和java包类似,比如我们的一个包:cn.lsw.base.log4j2而且可以发现,我们前面生成Logger对象的时候,命名是通过hello . class . getname();这样的方法,为什么会这样?很简单,因为有一个所谓的Logger继承问题。例如,如果您为cn.lsw.base定义了一个记录器,那么它也适用于记录器cn.lsw.base.lgo4j2 2。名字的继承用一个点(.).那么你可以猜测上面的loggers中有一个子节点不是logger而是root,而且这个root没有name属性。这个根相当于根节点。你所有的记录器都适用于这个记录器,所以即使你通过类名得到了很多类的很多记录器。class.getName(),而且你不在配置文件中的loggers下配置它们,它们都可以输出,因为它们都继承了root的日志配置。

我们上面的配置文件也定义了一个logger,名字是cn.lsw.base.log4j2.Hello,实际上是通过前面的hello . class . getname();是的,为了单独配置他,我们将在这里为这个类生成一个日志记录器。上面的配置基本上是说只有日志器cn.lsw.base.log4j2.Hello输出跟踪信息,即他的日志级别是trace,而其他日志器继承了root的日志配置,日志级别是error,所以只能打印ERROR及以上的日志。如果这里把logger的name属性改为cn.lsw.base,那么这个包下的所有logger都会继承这个日志配置(这里的包是指log4j的logger名称的“包”,不是java的包。如果你必须为hello生成一个名为“myhello”的logger,他就不能继承cn.lsw.base的配置。

那么有人会问,他不是也继承了root的配置吗,那么他会输出两次吗?我们在配置文件中解释过了。如果设置additivity=' false ',就不会输出两次。否则,请查看以下输出:

下面添加一个类进行比较:

复制代码如下:importorg阿帕奇;伐木;log4j日志管理器;导入org . Apache . logging . log4j . logger;

公共类测试{

私有静态记录器Logger=log manager . get Logger(test . class . getname());

公共静态void main(String[] args) {

Logger.trace('启动程序。);Hello Hello=new Hello();//for(int I=0;我10000;我){如果(!hello . hello()){ logger . error(' hello ');}//} logger.trace('退出程序。);}}

这里,首先更改配置文件,以便于比较。一个是刚才第一个logger的名字或者cn . lsw . base . log4j 2 . hello additive去掉或者改成true(可以去掉,因为默认为true)。第二种方法是将root的级别改为info,以便于观察。

然后运行Test并查看控制台的日志输出:

复制代码如下:2013-12-20 19:59:42.538[main]infocn . lsw . base . log4j 2 . test-test 2013-12-20 19:59:42.541[main]TRACE cn . lsw . base . log4j 2 . hello-entry 2013-12-20 19:59:42.541[main]TRACE cn . lsw . base . log4j 2 . hello-12013-12-20 19:59:42.542 [main]错误cn.lsw.base.log4j2.Hello -又来了!2013-12-20 19:59:42.542[main]infocn . lsw . base . log4j 2 . Hello-我是info info 2013-12-20 19:59:42.542[main]info . lsw . base . log4j 2 . Hello-我是info info info 2013-12-20 19:59:42.542[main]debugcn . lsw . base . log4j 2 . Hello debugcn . lsw . base . log4j 2 . hello-我是调试信息2013-12-20 19:59:42.542 debug . lsw . base . log4j 2 . hello-我是调试信息2013-12-20 19:59:42.543[main]TRACE cn . lsw . base . log4j 2 . hello-exit 2013-12-20 19:59:42.543[main]TRACE cn

可以看到Test的trace日志没有输出,因为他继承了root的日志配置,只输出info或以上的日志。输出Hello trace及以上的日志,但是每个都输出两次。您可以尝试,第一个日志记录器的级别应该是error,然后高于error的级别也输出两次。这时候把可加性加为假就可以避免这个问题。

当然,你可以在配置文件下对每个日志器进行不同的配置,也可以通过继承机制对不同包下的日志进行不同的配置。因为伐木工下面可以写很多歌,伐木工。

这里有一个稍微复杂的例子:

复制代码如下:xml版本='1.0 '编码='UTF-8 '?

配置状态='错误'!-定义所有appender-appender!-此输出控制台的配置-console name=' console ' target=' system _ out '!-控制台只输出级别及以上的信息(onMatch),其他直接拒绝(on match)-阈值过滤level=' trace ' on match=' accept ' on match=' deny '/!-这是已知的输出日志模式布局模式的格式=' % d { hh:mm:ss . SSS } %-5 level % class { 36 } % l % m-% msg % xex % n '/console!-该文件将打印出所有信息,并且该日志将在程序每次运行时自动清空,这由append属性决定。这个也挺有用的,适合临时测试——文件名=' log '文件名=' log/test.log' append=' false '模式布局模式=' % d { hh:mm:ss . SSS } %-5 level % class { 36 } % l % m-% msg % xex % n '//

!-这将打印出所有信息。每次大小超过大小,这个大小的日志都会自动存储到按年月建立的文件夹中并压缩。作为存档-滚动文件名=' rolling file '文件名=' logs/app.log '文件模式=' log/$ $ { date:yyyy-MM }/app-% d { MM-DD-yyyy }-% I . log . gz '模式布局模式=' % d { yyyy-MM-DD ' at ' HH:MM:ss z } %-5 level % class { 36 } % L % M-% msg % xEx % n '/SizeBasedTriggeringPolicy size=' 50MB '/rolling file-然后定义logger,只有定义并引入logger,appender才会生效- loggers!-为root-root level=' trace ' appender-ref=' rolling file '/appender-ref=' console '/root建立默认记录器

/记录器/配置

很复杂,但并不复杂。这个例子主要是说一下appenders。

这里定义了三个appender,Console,File,RollingFile,意思基本清楚。第二个是写文件,第三个是“循环”日志文件,这意味着当日志文件大于阈值时,将会写入新的日志文件。

我们的配置文件中的注释非常详细。于是大家自己看了看。其中一个有趣的是Thresholdfilter,一个过滤器。事实上,每个appender可以定义许多过滤器。这个功能非常有用。如果要选择控制台只能输出错误或以上的类别,可以使用ThresholdFilter并将级别设置为ERROR。on Match=' accept ' on mismatch=' deny '表示接受匹配,否则可以直接拒绝。当然也有其他选择,比如交给其他滤镜。请你自己搞清楚细节。

为什么要添加这样的配置文件?其实这个配置文件我感觉挺好的,实用性如下:

8.一个实用的配置文件:

一方面,我们用日志记录程序的运行信息,在出现问题时进行故障排除。有时候我们在调试的时候喜欢用日志。所以,如果日志记录很乱,看起来就不方便了。所以我可能有以下需求:

1)我在调试一个类,所以,我不希望输出其他类或者包的日志,否则会有很多内容。因此,您可以将上面的根级别修改为最高级别(或者使用ERROR作为警告),然后,为该类添加一个日志记录器配置,比如第一个配置文件中的设置,并将其级别设置为trace或debug或类似的级别。然后我们给一个appender-ref一个定义好文件,这个appender(记住,总共有三个appender)。这个appender的优点是它有一个false append属性。这样每次运行的时候都会清除最后一个日志,这样这个文件的内容就不会因为一直在调试而增加。也方便检查,这个和输出到控制台有异曲同工之妙。

2)程序我已经基本部署好了,接下来还要长时间运行。我需要记录以下日志。首先,控制台输出错误级别以上的所有信息。第二,我想有一个文件,输出所有信息以上的调试或信息,像做程序记录或什么的。第三,我想将上述错误信息单独输出到一个单独的文件中。如果出现问题,只需检查这个配置文件。我不会处理太多日志。看起来我的头很大。怎么做?很简单。

首先,在appenders下添加一个控制台类型的appender,并通过添加ThresholdFilter将级别设置为error。(在配置文件的控制台的附加器中直接修改)

其次,添加一个文件类型的appender(也可以是RollingFile或者其他文件输出类型),然后将ThresholdFilter的级别设置为error,这样就好了。你的错误日志不要那么多,也没必要有多个错误级别的日志文件,否则你的程序基本上可以重写。

您可以在此添加一个包含以下内容的附录:

复制代码如下:file name=' error ' filename=' logs/error . log ' threshold filter level=' error ' on match=' accept ' on match=' deny '/pattern layout pattern=' % d { yyyy。mm . DD ' at ' HH:mm:ss z } %-5 level % class { 36 } % L % M-% msg % xEx % n '//File

并在loggers中的一个logger(比如root)中引用它(根节点将这一行添加为子节点)。

复制代码如下:appender-ref ref='ERROR'/

然后添加一个RollingFile的appender,设置和上面的配置文件基本相同。

最后,在logger中配置它。但是,如果您的记录器也有日志级别的配置,如果级别高于错误,错误信息将不会在您的appender中输出。

还记得上面的测试类中有一个带注释的for循环吗?这是为了在配置文件中配置RollingFile的appender。取消对它的注释,运行该业务一次或几次,看看输出配置文件在哪里。下面是我测试的截图:(在这里你可以把SizeBasedTriggering Policy size=' 50MB '/这里是大小改为2MB。生成50 MB日志还是很慢。为了方便观察!然后将控制台的ThresholdFilter的级别设置为更高的级别如error,否则控制台会输出太多东西)

第一部分(图中标为1)是我加入的jar包;

第二部分是由appender生成的日志文件,File。你会发现你运行它很多次,这个文件中的日志就被覆盖了。

第三部分是由RollingFile生成的配置文件,即appender。可以发现app.log的日志是默认建立的。每次超过2MB就会生成年月对应的文件夹和命名格式的日志文件,压缩成gz格式文件。打开资源管理器,发现这个文件只有11KB,解压后是2MB。

最后,希望这个教程能帮到大家!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: