原文作者:天才 Kylin目组
log4j?/font>
单的?span lang="EN-US">log4j是帮助开发h员进行日志输出管理的APIcd。它最重要的特点就
可以配置文g灉|的设|?/span>日志信息的优先、日志信息的输出目的C及日志信息的输出格式?/span>
Log4j除了可以记录E序q行日志信息外还有一重要的功能就是用?/span>昄调试信息。程序员l常会遇到脱?span lang="EN-US">java ide环境调试E序的情况,q时大多Ch会选择使用System.out.println语句输出某个变量值的Ҏq行调试。这样会带来一个非帔R烦的? 题:一旦哪天程序员军_不要昄q些System.out.println的东西了只能一行行的把q些垃圾语句注释掉。若哪天又需调试变量|则只能再 一行行Lq些注释恢复System.out.println语句。用log4j可以很好的处理类似情c?/span>
log4j使用Ҏ
下面介绍的是log4j一些理论方面的知识Q读者觉得枯燥的话可以蟩q本节直接阅ȝ三节实例部分?/span>
1、定义配|文?/span>
? 先用配|文件将使我们的应用E序更加灉|配置log日志输出方式包括输出优先U、输出目的地、输出格式。Log4j支持两种配置文g格式Q一U是XML 格式的文Ӟ一U是JavaҎ文件log4j.propertiesQ键=|。下面将介绍使用log4j.properties文g作ؓ配置文g的方 法:
?/span>配置根LoggerQ其语法为:0
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中Q?span lang="EN-US">level 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的别。Log4j只用四个别,? 先从高C分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里? 义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来? appenderName是指定日志信息输出到哪个地斏V可同时指定多个输出目的地?
?/span>配置日志信息输出目的地AppenderQ其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中Q?/font>Log4j提供的appender有以下几U:
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br />
org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
?/span>配置日志信息的格式(布局Q,其语法ؓQ?/span>
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中Q?/font>Log4j提供的layout有以下几U:
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下: %m 输出代码中指定的消息
%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?
%t 输出产生该日志事件的U程?
%n 输出一个回车换行符QWindowsq_?#8220;\r\n”QUnixq_?#8220;\n”
%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?/font> 22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:10)
2、在代码中用Log4j
?/span>得到记录?/span>
使用Log4jQ第一步就是获取日志记录器Q这个记录器负责控制日志信息。其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器Q如果必要的话,则ؓq个名字创徏一个新的记录器?span lang="EN-US">Name一般取本类的名字,比如Q?
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
?/span>d配置文g
当获得了日志记录器之后,W二步将配置Log4j环境Q其语法为:
BasicConfigurator.configure ()Q?自动快速地使用~省Log4j环境?br /> PropertyConfigurator.configure ( String configFilename) Q读取用Java的特性文件编写的配置文g?/font>
例:PropertyConfigurator.configure(".\\src\\log4j.properties")
DOMConfigurator.configure ( String filename ) Q读取XML形式的配|文件?/font>
?/span>插入记录信息Q格式化日志信息Q?/span>
当上两个必要步骤执行完毕Q就可轻村֜使用不同优先U别的日志记录语句插入到您想记录日志的Q何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
log4j范例E序
下面用一个最单的范例E序来进一步说?span lang="EN-US">log4j的用方法。程序代码如下:
import org.apache.log4j.*;
public class LogTest {
static Logger logger = Logger.getLogger(LogTest.class.getName());
public static void main(String[] args) {
PropertyConfigurator.configure ( “.\\src\log4j.properties”)Q?/span>
logger.debug("Debug ...");
logger.info("Info ...");
logger.warn("Warn ...");
logger.error("Error ...");
}
}
E序说明Q?/font>
?/span> static Logger logger = Logger.getLogger(LogTest.class.getName());是创徏一个属?/span>LogTestcȝLogger对象Q创建时要告?/span>Logger你当前的Class是什么?/span>
?/span> PropertyConfigurator.configure ( “log4j.properties”)是说用当前工E目录下?/span>src文g夹中?/span>log4j.properties文g作ؓ配置文g。若?/span>log4j.properties攑֜工程根目录下也可不写此句Q程序会自动扑ֈ配置文g?/span>
?/span> logger.debug是输出debug的信息,logger.info是输出提示信息Q?/span>logger.warn是昄警告信息Q?/span>logger.error是昄错误信息?/span>
下面是配|文?/span>log4j.properties的内容:
log4j.rootCategory=DEBUG, stdoutQ?/span>R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log.txt
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy MMM dd HH:mm:ss} %-5p %c - %m%n
E序说明Q?/font>
?/span> log4j.rootCategory=DEBUG, stdoutQ?/span>R
是说我要显C所有优先权{於和高?/span>Debug的信息?br /> "stdout"Q?/span>”R”表示我定义了两个输出?/span>(随便什么名字都?/span>)?/span>
?/span>下面的三行说stdout输出端其实是标准输出ConsoleQ也是屏幕。输出的格式?/span>PatternLayout。{换方式是%5p (%F:%L) - %m%nQ即前五格用来显CZ先权Q再昄当前的文件名Q加当前的行数。最后是logger.debug()?/span>logger.info()?/span>logger.warn()?/span>logger.error()里的信息?/span>%n表示回RI?/span>
?/span>再加上下面六行则log信息不光昄在屏q上Q而且被保存在一个叫"log.txt"的文仉Q文件最大ؓ100KB。如果文件大超q?/span>100KBQ文件会被备份成"log.txt.1"Q新?/span>"log.txt"l箋记录log信息?/span>
接下来我们可以改?/span>log4j.propertiesQ而不需重新~译可以控?/span>log信息是否昄?/span>log信息的输出端cd、输出方式、输出格式,{等。D例如下:
?/span>?/span>log4j.properties文g里把"log4j.rootCategory=DEBUG,stdout,R"改写?/span>"log4j.rootCategory=OFF, stdout,R"Q这h有的log信息都不会显CZQ解决了本文开始提出的问题?br /> ?/span>?/span>log4j.properties文g里把"log4j.rootCategory=DEBUG,stdout,R"改写?/span>"log4j.rootCategory=INFO, stdout,R"Q这样只昄INFO, WARN, ERROR?/span>log信息Q?/span>DEBUG信息不会被显C;
?span lang="EN-US">webE序中用log4j注意问题
1?span style="font: 7pt 'Times New Roman';"> ׃jsp或servlet在执行状态时没有当前路径概念Q所有?/span>PropertyConfigurator.configureQ?/span>StringQ语句找log4j.properties文g时要l出相对于当?/span>jsp?/span>servlet的\径{化成Z个绝对的文gpȝ路径。方法是使用servletcontext.getrealpath(string)语句。例Q?/span>
//得到当前jsp路径
String prefix = getServletContext().getRealPath("/");
//dlog4j.properties
PropertyConfigurator.configure(prefix+"\\WEB-INF\\log4j.properties");
2、相应的log4j.properties讄某个属性时也要在程序中讄l对路径。例Q?/span>
log4j.appender.R.File属性设|日志文件存放位|。我们可以用d.properties配置文g的方法进行灵z设|?/span>
log4e使用说明
在了解了log4j的功能后Q我们肯定会我们的程序中~写一?/span>Log4j日志记录。对于?/span>Eclipse的程序员Log4e是我们最得力?/span>log4j日志~写助手Q现在开?/span>Log4e之旅?/span>
Log4e是一个免费的Eclipse PluginQ它可帮助你在你?/span>Java工程中快速加?/span>LogQ?/span> 我们可以?/span>http://log4e.jayefem.de/index.php/Download|站上下?/span>Log4e最新版本。下载后相应文件夹拯?/span>Eclipse的插件目录下Q重?/span>EclipseQ在首选项中会多出一?/span>Log4e选项?/span>
Log4e可以有多个插?/span>LogZ个方法、类Q当然也可以在当前位|插?/span>LogQ同时其也可以把Sysout.out.println()的{换ؓlogQ所有的q一切只需要你点点鼠标或者按一ơ快捷键Q下面我们只以ؓ一个方法插?/span>LogZ来讲?/span>
?/span>Java~辑上下文中点击右键Q选择Log4EQ你看到如下界面:
点击Insert Log Statement For This MethodQ你看到验证页面:
Finish后这时你看到插?/span>Log后的函数如下Q?br />
Log4e更多的实例参?/span>http://log4e.jayefem.de