您的位置:首页 > 其它

log4j是什么,log4j解决了什么问题,log4j怎么用

2015-09-17 19:58 639 查看
Log4j是由Apache提供的日志操作包,用于帮助用户处理日志信息。

1. 为什么要用日志管理类,好像没有这些日志管理类,代码也可以正常跑起来。
答:日志管理类确实不影响代码正常执行,但是当代码复杂程度越来越高,我们需要日志管理类来帮我们记录代码运行状态,用以帮助我们理解代码的执行情况。此时使用封装好了的成熟的日志管理类,就能在实现我们需求的同时简化我们的操作。

2. log4j帮我们做了什么?
答:首先,log4j提供了方法使我们能将日志信息分级存储。
其次,log4j提供了日志不同的存储方式,我们可以将日志发送到控制台,或者文件,或者数据库中等等。
最后,log4j提供了配置文件的方式配置日志信息处理的行为,在处理行为需要改变的情况下,不需要修改源码而是修改配置文件就能够达到目的。
举个例子:需求是这样的,在代码执行到某一位置时,将一行打印信息输出到控制台。你说,这个简单,printf、System.out.println这些分分钟打印信息到控制台。OK,再提一个需求,同时有100处需要输出信息。你说,可以的,一条条全加上。OK,再提一个需求,需要信息在写入控制台的同时,也写入指定的文件里。这需求不过分吧,不保存在文件里,日志分分钟就找不着了。你说可以的,写一个方法向文件中写入数据,在需要的地方调用这个方法就好了,100处嘛,一条条加。OK,那再提一个需求,日志分个级,error、warn、info、debug这些级别分出来。这需求不过分吧,日志一多起来,看上去白花花一片,我只想看error级别的信息,别的我不关心。你擦擦汗说,可以的,再封装一个方法,多传入一个级别参数,原来那一百个地方,咬咬牙再改一遍。OK,需求多得是,日志文件到一定大小就盖个时间戳保存起来,随后的日志信息存放在新的日志文件里。再把mybatis执行的sql语句给我打出来。。。
这些功能也许花点时间都可以做出来,牛逼点的自己就做个log4j出来也不是不行,但是。。。还是花点时间学习log4j比较快一点。使用log4j只需要写几行配置信息就可以分分钟实现上述需求。所以log4j帮我们做的就是满足这些我们已经想到的和还没想到的,关于日志方面的需求。

3. log4j中有什么?
答:log4j中有三大组件
Logger:日志写出器,用于输入日志信息。Log4j 允许开发人员定义多个Logger,每个Logger拥有自己的名字,Logger之间通过名字来表明隶属关系。有一个Logger称为Root,它永远存在,且不能通过名字检索或引用,可以通过Logger.getRootLogger()方法获得,其它Logger通过 Logger.getLogger(String name)方法或Logger.getLogger(Class
class)方法获得。
appender:配属日志写出目的地,输出日志信息到指定位置。Log4j中支持多种appender,如 console、files、GUI components、NT Event Loggers等,一个Logger可以拥有多个Appender,也就是你既可以将Log信息输出到屏幕,同时存储到一个文件中。
Layout:控制Log信息的输出方式,也就是格式化输出的信息。

4. log4j支持将数据输出到哪里?
答:目前支持将数据输出到以下五处:
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个 新的文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
如果需要输出日志信息到多个目的地,配置多个appender
例如:log4j.rootLogger = info, appenderName1, appenderName2

5. log4j支持数据输出格式有哪些?

答:目前支持四种输出格式

org.apache.log4j.HTMLLayout (以 HTML 表格形式布局)

org.apache.log4j.PatternLayout (可以灵活地指定布局模式)

org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串)

org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)

6. PatternLayout输出格式如何使用

答:用户自定义日志输出格式类似于printf的输出类型,其中:

%m 输出代码中指定的消息

   %p 输出优先级,即 DEBUG , INFO , WARN , ERROR , FATAL

   %r 输出自应用启动到输出该 log 信息耗费的毫秒数

   %c 输出所属的类目,通常就是所在类的全名

   %t 输出产生该日志事件的线程名

   %n 输出一个回车换行符, Windows 平台为 “rn” , Unix 平台为 “n”

   %d 输出日志时间点的日期或时间,默认格式为 ISO8601 ,也可以在其后指定格式,比如: %d{yyy MMM dd HH:mm:ss,SSS} ,输出类似: 2002 年 10 月 18 日 22 : 10 : 28 , 921

   %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例: Testlog4.main(TestLog4.java:10)

例如:log4j.appender.appenderName.layout.ConversionPattern = [%-5p]%d{ISO8601}, [Class]%-c{1}, %m%n

输出:[WARN ]2015-09-16 17:04:30,908, [Class]PageNotFound, No mapping found for HTTP request with URI [/favicon.ico] in DispatcherServlet with name 'sentry'

7. 以包为单位的日志输出方式

答:在log4j的概念中,每一个包可以有一个logger,这个logger可以有自己的日志级别,自己的appender。

默认情况下,包的logger是继承rootLogger的,即继承所有的appender和appender的layout,但不继承rootLogger的日志输入级别。

使用additivity.包名=false来取消继承

8. 最干的货留在最后,log4j结构框图,也即logger,appender,layout之间的关系

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: