关闭

log4j基础及使用 - [程序人生]

557人阅读 评论(0) 收藏 举报

Log4J采用类似C语言中的printf函数的打印格式格式化日志信息
Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数见表1如下:

%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为" ",Unix平台为" "
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
基本应用

Log4J的配置
1)web应用的classpath下的log4j.properties是log4j的默认配置,log4j的jar包自动读取,例如/web-inf/classes/log4j.properties。
现 在来看log4j.properties配置文件的意义。第一行指定了根Logger的级别是DEBUG,并将此指定输出到A1。A1就是第二行定义的 org.apache.log4j.ConsoleAppender,此行表示将A1输出到控制台。第三行规定了输出到A1的格式为 org.apache.log4j.PatternLayout。第四行规定了输出到A1格式的转换模式为 org.javaresearch.log4j.TestLog4J。
很多成熟的服务器类的软件日志信息会输出到控制台,同时输出到日志文件备查。使用Log4J可以在不改变任何代码的情况下,仅通过修改配置文件就可以轻松地完成这项功能。相关配置文件如下:
#### Use two appenders, one to log to console, another to log to a file
log4j.rootCategory=debug, stdout, R
# Print only messages of priority WARN or higher for your category
log4j.category.your.category.name=WARN
#### First appender writes to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller"s file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
#### Second appender writes to a file
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
# Control the maximum log file size
log4j.appender.R.MaxFileSize=100KB
# Archive log files (one backup file here)
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
这 个配置文件指定了两个输出源stdout和R。前者把日志信息输出到控制台,后者是一个轮转日志文件。最大的文件是100KB,当一个日志文件达到最大尺 寸时,Log4J会自动把example.log重命名为example.log.1,然后重建一个新的example.log文件,依次轮转。
Log4j中有五级logger
#FATAL 0
#ERROR 3
#WARN 4
#INFO 6
#DEBUG 7
Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
2)log4j.xml配置文件
在Web应用中使用
在Web 应用中,应该在哪儿对Log4J进行配置呢?首先要明确,Log4J必须在应用的其它代码执行前完成初始化。因为Servlet是在Web服务器启动时立 即装入的,所以,在Web应用中一般使用一个专门的Servlet来完成Log4J的配置,并保证在web.xml的配置中,这个Servlet位于其它 Servlet之前。下面是一个例子,代码如下:
package com.cvicse.finance.ecrs.tools;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.log4j.xml.DOMConfigurator;
/**
 * Description:Log4JServlet
 * Copyright: Copyright (c) 2005
 * Company: CVIC SE
 * @author Jessica Tang
 * Created at 2005-9-14
 */
public class Log4JServlet extends HttpServlet {
 public void init() throws ServletException {
  String path = getServletContext().getRealPath("/");
  System.out.println("Jessica:" + path);
  String profile = path + getInitParameter("profile");//对应web.xml
  DOMConfigurator.configure(profile);
 }
}
附:web.xml部分

  Log4jServlet
  com.cvicse.finance.ecrs.tools.Log4JServlet
  
   
profile
     
/WEB-INF/log4j.xml
  
  1
 

 

Log4j 是使用的最广泛的logging框架之一。
我碰到的最多人问的问题就是:为什么用了Log4j之后,我的程序占用那么多的CPU?是不是Log4j的设计有问题啊?

这里我把Log4j常见的一些问题列出来,供大家参考:


1)Log4j告诉我说没有正确初始化,怎么办?
现象:
运行程序时出现
log4j: No appenders could be found for category (some.category.name).
log4j: Please initialize the log4j system properly.

原因:
Log4j的日志输出需要一个appender,appender的类型有stdout,file,database table,syslog等。
如果指定的Logger没有并且它所有的祖先也没有appender的话,那么就会出上面这个错误。
记住: log4j是没有缺省的target appender的。

解决方法:
最简单的就是所有Logger的祖先设置appender。
在程序运行目录下面创建一个文件:log4j.properties
内容为:
log4j.rootCategory=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.Patte

2)log4j优化

有多少人用Log4j的时候会在每一个Debug/Info之前加一个判断?
可能很多人都说了,这有什么关系,我在运行的时候是把Log Level设置成Error的。
那么请看下面这个代码:
String result;
...
...
...
logger.debug("result is" + result );
再看看这个代码:
String result;
...
...
...
if(logger.isDebugEnabled())
{
       logger.debug("result is" + result );
}
把Log Level设置成ERROR,运行结果又区别吗?没有!!
程序的性能有区别吗?区别大了!!!
因为什么呢?
虽然第一段代码也不产生Log输出,但是debug()里面的字符串变量是实例化了,明白了吗?
这个就是为什么很多人抱怨Log4j占用很大CPU时间的原因了,尤其是在大循环的时候。
赶快在你的程序中加上这样的判断条件吧。

Log4j使用

相对路径:

InforWeb中配置例子:../deploy/jtzw/logs/JtzwApp.log

Tomcat中配置例子:../webapps/jtzw/logs/JtzwApp.log"

绝对路径很简单,指对路径即可。

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:375305次
    • 积分:4454
    • 等级:
    • 排名:第6699名
    • 原创:65篇
    • 转载:146篇
    • 译文:0篇
    • 评论:51条
    最新评论