请给我讲讲log4j的作用?

dasa5678 2009-05-28 12:31:38
到网上查
都很官方 初学 实在没理解
用大白话也好给讲讲好吗
目前只知道需要用xml方式配置它
还没开始配置呢??
...全文
613 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
oplmamik 2010-08-09
  • 打赏
  • 举报
回复
哈哈 2009年的帖子 现在都2010啦。 谢谢 2楼的大哥。 把困扰我N天的问题说的这么明白。 我一般是不回贴的。。 为此专门申请个账号,说句谢谢。 哈哈
arraiy 2009-12-24
  • 打赏
  • 举报
回复
4楼的朋友说得很简单,通俗易懂,最讨烦一搞就说什么框架什么框架的,听到都恼火!就是一个简单的功能嘛,老是框架框架的,搞些专业名词,烦得很
niefaqiang123 2009-05-29
  • 打赏
  • 举报
回复
log4j 就是记录日志的,可以记录程序的、运行信息
zhengqinglangzi 2009-05-28
  • 打赏
  • 举报
回复
楼上的哥们,能不能举个例子来说明下,这块我也不是很懂
  • 打赏
  • 举报
回复
log4j 是个日志框架,用于产生日志用的,因为你还没接触过,对于日志框架的介绍不宜掺杂代码,只能作一些概念上的介绍。

如果不采用日志的话,在调试的时候,为了查看运行中的结果,代码中含有很多的 System.out.println() 语句,
这也没问题,但是问题就出现在如果把问题给解决了,那些 System.out.println() 的去留问题,那我们是一个
一个地跑到代码里去把这些输出语句揪出来删掉,还是不管他们任凭他们躺在代码里影响运行效率呢?

当然了,我们在调试完成后,或者说是正式上线使用了得把这些输出语句去掉的。但是问题又来了,如果以后又出现问题
了该怎么办呢?难道再加,再找,再删?

采用日志框架就可以很好的解决上述问题,日志框架的级别一般有 DEBUG、INFO、WARN、ERROR、FATAL 几种常见的,如果
是用于调试的代码,可以采用 DEBUG 级别的日志,如果是普通信息可以采用 INFO 级别的,如果不影响使用的错误可以使
用 WARN 级别,如果影响使用的(比如说产生异常了)可以使用 ERROR 级别,如果严重影响使用的可以使用 FATAL 级别的。

将日志分级的目的就是在于可灵活配置,拿 log4j 举例子,如果日志级别限定于 DEBUG,那么包含 DEBUG 在内的,INFO、
WARN、ERROR、FATAL 都产进行日志记录,如果级别定为 INFO,那么 INFO 以下的级别,像 DEBUG 的日志就不会记录。

如果我们调试时把 System.out.println 换成 log.debug() 记录的话,我们把问题解决后,只要把日志级别在配置文件中改
成 INFO,那么那些 DEBUG 的日志就不用再输出了,如果以后再要调试,只要把日志级别调回到 DEBUG 就行了,很方便吧。

日志框架不仅可以把日志输出在控制台上,也可以把日志输出到文件、数据库中,不仅可以配置全局的日志级别,也可以为
某个包下面的代码配置日志级别,还能配置日志的输出格式。

很多的日志框架有个缺点,比如有以下的代码:

log.debug("customer address: " + address+ ", coustomer count: " + count);


虽然我们可以把日志级别调成 INFO,不记录 DEBUG 的日志,但是上面这段代码就有个缺点,就是参数。大家都知道要执行
方法前,得先将参数中的表达式计算后再进行方法调用。同时我们还知道 Java 中的字符串是不可变对象,字符串与变量进
连接运算(+)时,其内部会使用 StringBuilder 或者 StringBuffer 来进行连接。

我们想想看看,如果 DEBUG 的日志不需要记录,那么这种效率很低的拼接还有意义么?如果不管他们,并且在代码中含有大
量此类的语句,那么会严重影响程序运行效率的。

一般日志框架都有这一个功能,就是可以判断当前的日志记录器的级别:

if(log.isDebugEnabled()) {
log.debug("customer address: " + address+ ", coustomer count: " + count);
}


像这样做的话就可以解决效率低下的问题,因为在调用之前会进行日志记录级别的判断,达到的话才会执行。

但是问题又来了,这样做会导致日志代码可能会很繁锁,甚至有可能日志代码比业务代码还多。

目前的 log4j 还没有解决这个问题,据 Apache Logging 的介绍 log4j 2.0 会采用 JDK 5 的语法进行设计,
可能会解决这个问题。

像其他的日志记录器,比如 JBoss Seam 中的日志,就采用了 JDK 5 中新增的变参语法解决这个问题,如果
采用变参的话,那段代码只要写成:

log.debug("customer address: {0}, customer count: {1}", address, count);


这样的代码不涉及表达式计算,在 log.debug 中也会首先判断日志级别,以决定是否记录。

不知道上面啰里啰嗦了一堆,不知道你是不是明白了日志的作用了呢?
OohailinoO 2009-05-28
  • 打赏
  • 举报
回复
log4j简单说就是一个日志输出组件,便于对打印输出进行控制:
控制方面主要有3个:
输出目的地:(控制台,文件,邮件,数据库)
控制输出级别:DEBUG,INFO,WARN,ERROR,FATAL
控制输出样式:如下所示的配置即是自定义的一个输出格式
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-[TEST] %p [%t] %C.%

Log4J 采用类似C 语言中的printf 函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log 信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows 平台为"\r\n",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)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧