`
lovejavajuan
  • 浏览: 16336 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

使用log4j为Tomcat输出日志

阅读更多
转自http://hi.baidu.com/injava/blog/item/e353c1cacc469a46f31fe74b.html

简介
为了能够满足我的一个项目中日志输出的特殊要求,我花了好几个小时配置log4j 为Tomcat5.0.28 输出日志。本文说明了一些机制,并且描述了配置Tomcat 每日生成一个日志文件的步骤,涵盖Tomcat5.0.x 和5.5.x 版本。

注 :   最新的 log4j 1.3 alpha 测试版已经支持每日生成一个日志文件。参考本文 相关链接 了解如何进行安装和配置。

Tomcat 5.0 .x 的日志
Tomcat 5.0.x 主要由两个途径记录日志信息。分别为标准日志输出文件catalina.out 和一般情况下在文件名中包含有日期的 Servlet 日志文件(如:catalina.2004-08-27.log ) 。

catalina.out 中的数据主要有三个来源:输出至标准输入和标准错误输出的数据, 通过Commons Logging 接口输出的日志信息,还有一种是包括了Tomcat 各种事件状态和其它系统(如Jakarta Struts )的输出。使用Commons Logging 接口可以根据配置输出多种多样的日志数据形式。

The data in the Servlet 的日志数据是调用ServletContext  类的log() 方法产生的,例如: 

httpServletRequest.getSession().getServletContext().log("Some message");


要保存输出信息到日志文件,你需要在 Tomcat 的配置文件( Tomcat 的 conf 目录下) server.xml 中对 FileLogger 配置,一般如下: 
       <!-- Global logger unless overridden at lower levels -->
       <Logger className="org.apache.catalina.logger.FileLogger"
               prefix="servlet." suffix=".log" timestamp="true" />

Servlet 日志可以打开(配置了 FileLogger )和关闭(没有配置 FileLogger ),但是没有办法指定日志输出级别(只能输出 INFO 以及更高级别的日志信息)。尽管 Tomcat 的文档中提到它所有的 Logger 都支持 verbosity   配置项,但是好像没有什么效果。

如果希望配置Tomcat 捕获所有的日志数据,输出到每日生成一个的日志文件(如:在文件名中表明产生日期)。Tomcat 中FileLogger 提供一种标准方法用于捕获Servlet 日志流并每天生成一个新的文件。你可以对日志文件进行备份、删除、分析或者你希望的其它操作。

如果Tomcat 再有一个使用Commons Logging 接口的Catalina Logger 就好了,可以让你更好的控制输出的格式,虽然这个模块很相当容易实现的,但是谁有时间来做啊。后面会告诉大家如何控制 catalina.out 。

Tomcat 5.5 .x 的日志
Tomcat 5.5.x 有两条途径记录日志数据,写入标准输出和标准错误输出的所有内容还是记录在文件catalina.out ,其余的所有日志都通过 Commons Logging   接口输出。如果你没有配置用来其它的Logger (如log4j ),所有的日志信息(包括通过commons-logging 输出的所有内容)都会输出到catalina.out ,致使其不断增长。

Tomcat 5.5.x 比Tomcat 5.0.x 的一项改进是Servlet 日志不在存在了,Servlet 日志是用来接收任何传递给ServletContext  类的log() 方法的内容,例如:

httpServletRequest.getSession().getServletContext().log("Some message");


Tomcat 5.5.x 现在将这些信息通过commons-logging 接口输出为INFO 级别的日志。如果配置了像log4j 这样的logger ,你可以把所有的日志信息输入到每日生成的日志文件(如:在文件名中表明产生日期)中,你可以对日志文件进行备份、删除、分析或者你希望的其它操作。

Tomcat 通用日志
如上所述,在catalina.out 文件中的大部分数据都是通过调用Commons Logging 接口产生的,Commons Logging 可以让你在运行期对日志输出细节进行控制,并允许使用多种后台日志系统,Tomcat 标准发行版使用SimpleLog 作为日志系统,SimpleLog 将所有的内容都输出到标准错误输出,对于Tomcat 来说,默认被重定向到catalina.out 文件,这样就造成 catalina.out 文件不停的增长,不生成循环的日志文件。

Log4j
Log4j 是支持Commons Logging 的强大日志系统,可以添加到你的Tomcat 中替换SimpleLog 以支持循环的日志文件和多样化的配置。事实上,你不但可以将日志输出到文件,也可以输出到操作系统日志,或者远程机器等其它的目标,你还可以输出至不止一个地方。要在你的Tomcat 中使用log4j 系统可以按照如下步骤进行安装配置(注:这是针对log4j 1.2.x 版本,1.3.x alpha 测试版本的安装和配置可以参考附录中的相关链接 ):

如果 Tomcat 当前正在运行,关闭 Tomcat 。  
从 Apache 的网站 下载 Commons Logging 发行包。  
将压缩包中的 commons-logging.jar 解压缩到你Tomcat 安装路径的common/lib 目录中。  
从 Apache 的网站 下载 Log4j 发行包。  
将压缩包中的 log4j-1.2.12.jar 解压缩到你Tomcat 安装路径的common/lib 目录中。  
在 Tomcat 安装路径的 common/classes   创建 log4j 的配置文件 log4j.properties (配置文件在随后一节)。  
重起 Tomcat  
这里描述的配置会导致在 Tomcat 5.5.x 中创建两个日志文件,在 Tomat 5.0.x 中创建三个文件:一个是 Servlet 日志文件(仅对 Tomcat 5.0.x ),在每天晚上循环产生新的日志文件;第二个是通过 log4j 输出的 Commons Logging  日志文件(也会在每天晚上循环产生新的日志文件),还有一个是仅仅包含了打印到标准输出和标准错误输出的 catalina.out 文件,这个文件仍然会不断的增长,但是如果你的 Tomcat 应用程序设计的比较好,不是使用标准输出和标准错误输出,这就不成问题了(其实,这个文件应该大小为 0 )。  

注意,commons-logging.jar 和log4j.jar  files 是安装在Tomcat 的common/lib   目录中,而log4j.properties 文件是安装在common/classes 目录中。这样的配置可以让Tomcat 和你的Web 应用程序都能够使用log4j 。如果你的Web 应用程序使用Commons Logging 接口,那么其日志数据将会输出到Tomcat 服务的日志中。你也可以修改log4j 的配置文件log4j.properties ,将你的应用程序日志输出到其它文件中(配置方法请参考log4j 的其它文档)。

Log4j 配置文件
log4j.properties 文件可以如下配置:  

#


# Configures Log4j as the Tomcat system logger


#

to output info level messages into a rolling log file.


#


log4j.rootLogger=INFO, R


#


# To continue using the "catalina.out" file (which grows forever),


# comment out the above line and uncomment the next.


#


#log4j.rootLogger=ERROR, A1




#


# Configuration for standard output ("catalina.out").


#


log4j.appender.A1=org.apache.log4j.ConsoleAppender


log4j.appender.A1.layout=org.apache.log4j.PatternLayout





#


# Print the date in ISO 8601 format


#


log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n



#


# Configuration for a rolling log file ("tomcat.log").


#


log4j.appender.R=org.apache.log4j.DailyRollingFileAppender


log4j.appender.R.DatePattern='.'yyyy-MM-dd


#


# Edit the next line to point to your logs directory.


# The last part of the name is the log file name.


#


log4j.appender.R.File=/usr/local/tomcat/logs/tomcat.log


log4j.appender.R.layout=org.apache.log4j.PatternLayout


#


# Print the date in ISO 8601 format


#


log4j.appender.R.layout.ConversionPattern=%d [%t] %-5p %c - %m%n




#


# Application logging options


#


#log4j.logger.org.apache=DEBUG


#log4j.logger.org.apache=INFO


#log4j.logger.org.apache.struts=DEBUG


#log4j.logger.org.apache.struts=INFO




你只需要修改这一行:

log4j.appender.R.File=/usr/local/tomcat/logs/tomcat.log

将路径修改为你的Tomcat 的logs 目录,如果你的系统环境配置了CATALINA_HOME 环境变量,那么可以使用${catalina.home}/logs/tomcat.log 进行配置即可。

上面的log4j 配置仅记录比较重要的日志(警告warning 、错误error 、致命错误fatal )到Tomcat 的logs 目录下的tomcat.log 文件中,每天晚上过0 点的第一条信息会触发重命名tomcat.log ,将当前日期附加在tomcat.log 文件名中,并产生新的tomcat.log 文件。

使用log4j DailyRollingFileAppender   不爽的一点是为了产生循环的日志文件,必须输出一条日志信息来触发,如果你每天晚上使用cron 来处理你的日志文件就会存在问题。Tomcat 自带的FileLogger 总是在当天的日志文件名中加上日期来解决这个问题。我(Geoff )已经写了一个自定义的Log4j appender  来模仿Tomcat 的FileLogger ,大家可以免费使用(包括源代码)。在separate technical tip 有DatedFileAppender 的安装和配置信息。  

注意: 新的 log4j 1.3.x alpha 测试版已经支持按日滚动的日志文件。参考 Log4j Version 1.3 and Apache Tomcat 了解如何进行安装和配置。

你可以仿照配置文件最后几行的做法来覆盖默认的日志级别,来为你的应用程序做特殊配置。在正式运行环境中,你可能希望尽量减少日志输出,你可以修改这一行:

log4j.rootLogger=INFO, R

为:

log4j.rootLogger=ERROR, R

警告
在将日志输出级别修改为DEBUG 时一定要小心(特别像log4j.logger.org.apache ),会造成大量的日志,相当大程度上拖慢你的系统速度。

Tomcat   启动
请注意,你必须安装commons-logging.jar 到Tomcat 的common/lib 目录中,你可能已经注意到,在Tomcat 的已经有一个commons-logging-api.jar 文件了 。这个jar 文件是commons-logging.jar 的简版,只实现了SimpleLog 及类似的其它部分,只能基本满足 系统启动时的日志输出,因为没有日志系统的API ,Tomcat 是不能启动的。如果在启动classpath 中没有加入日志系统(如log4j ),是不可以用commons-loging.jar 来进行 替换这个文件的。

在启动过程中的一些类载入时,如果你在common/lib 目录中加入了完整版的commons-logging.jar ,它会替换commons-logging-api.jar 的类,会重新初始化日志系统,并尝试定位log4j 或其它你使用的日志系统 。

应用程序日志
你可以在你的Servlet 程序中使用Servlet 日志(如servletContext.log("Some message") )来记录消息,或者利用Commons Logging 接口。本节介绍在上述集成后,使用更好的日志方法来演示日志的加强。

例程:

package com.acme.webapp;



import org.apache.commons.logging.Log;


import org.apache.commons.logging.LogFactory;



public class MyApplication {



   
private Log myLog;




   
public MyApplication() {



       
myLog = LogFactory.getLog(MyApplication.class);



   
}




   
public void process() {



       
// Do some processing




       
myLog.debug("A debug message");


       



       
// Do something else




       
myLog.info("An information message");




       
// etc.



   
}



}



Log 对象可以声明为静态的类成员变量,在多个类对象间共享,换句话说,你的整个程序可以共享唯一的一个 Log 对象,或者多个 Log 对象,在运行期控制多种日志生成方法。你将类的全限定名称传递给 LogFactory.getLog() 方法,来唯一标识 log 对象,在上面的例子中, Log 的名字应该是 com.acme.webapp.MyApplication 。给每个 Log 对象一个名字,可以在 log4.properties 中用相同的表示控制日志输出。这样,你可以增加下面一行,为你的应用定义输出 DEBUG 信息:

log4j.logger.com.acme.webapp.MyApplication=DEBUG


可以使用任何字符串来命名Log 对象,但是,按照惯例,是用类的class 来命名Log 对象,参考log4j 的FAQ 了解命名方法。
分享到:
评论

相关推荐

    Tomcat使用Log4j输出catalina.out日志

    今天小编就为大家分享一篇关于Tomcat使用Log4j输出catalina.out日志,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    配置好log4j的eclipse简单工程,每天输出到一个日志文件中,该文件名为:“XXX_年月日时分.log”的形式

    一直在使用log4j 每天输出到一个日志文件中,该文件名为:“XXX_年月日时分.log”的形式。 这是一个eclipse工程,最简单的配置实现上述功能。

    tomcat下struts2的log4j日志配置.doc

    tomcat下struts2的log4j日志配置.doc

    打印日志等异常处理,使用Log4j的配置

    #如果一条日志信息的级别大于等于配置文件的级别,就记录配置输出源所对应的辅助类:log4j.appender.输出源名称=类名,如果输出到文件就写FileAppender #指定文件名 Tomcat的根目录: #指定布局方式(消息放入文件...

    log4j:ERROR Failed to rename错误解决办法

    在Tomcat6下使用Log4j记录日志,天创建新日志文件时(日志文件设置为:org.apache.log4j.DailyRollingFileAppender)报: log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以...

    Tomcat 不显示详细日志的问题

    Tomcat的详细错误日志不见了,只报一个万恶的Context [] startup failed due to previous errors,却找不到previous errors具体是啥东西

    java代码实例-日志规范史上最全java日志攻略(附教程)

    Log4J "Log4J的入门使用 Log4j的配置 输出日志文件 将日志信息存入数据库" Apache JCL "common log介绍 log中的接口" SLF4J "日志门面的使用 日志的绑定 日志的桥接 日志门面的原理" log-back "log-back的日志框架 ...

    tomcat控制台详细错误日志设置

    tomcat控制台详细错误日志设置,有时tomcat控制台报的错误比较模糊,不知道该怎样去找原因,现在好了,按照简单说明配置一下

    tomcat-juli.jar,tomcat-juli-adapters.jar,log4j-1.2.17.jar tomcat 8日志输出

    Tomcat8下使用Log4j接管生成日志文件,按天存放,日志转换成json格式 亲测可用,日志格式如下: {"time":"2017-09-06 10:24:48,356","logtype":"INFO","loginfo":"org.apache.catalina.startup.HostConfig:Deploying...

    log4j替代catalina.out

    ubuntu下tomcat中输出日志,log4j替代catalina.out所需配置

    Tomcat\Tomcat优化和监控

    log4j.propertis文件中是否设置成ERROR级别 2、把tomcat安装为windows服务的时候,要把jvm内存设置成1G,同时一定要把这些参数加进去。 -XX:PermSize=64M -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=48m -...

    应用分析监控平台 闪电狗.zip

    先配置将tomcat日志输出到log4j,下载tomcat-juli.jar到tomcat/bin,覆盖原来的jar,下载tomcat-util.jar到tomcat/lib,复制log4mongo-java ,flash-dog-api-log4j 和 mongo-java-driver ,log4j.properties到lib 2....

    Tomcat优化和监控.docx

    log4j.propertis文件中是否设置成ERROR级别 2、把tomcat安装为windows服务的时候,要把jvm内存设置成1G,同时一定要把这些参数加进去。 -XX:PermSize=64M -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=48m -...

    JFinal所需的Jar

    JFinal 自身对第三方无依赖,但当需要第三方功能支持时则需要添加相应的 jar 文件 1:只有 jfinal-bin-xx.... 而log4j.properties 不存在时无日志输出。jdk logger 需要的logging.properties文件 也在此目录下提供了

    微信小程序版某乎日报

    运用到的技术:Spring,SpringMVC,Mybatis,Log4J2用来监听日志, 爬取数据模块的日志 PageHelper实现了微信小程序端的上拉继续加载功能 jsoup爬虫技术. 定时任务 : 定时6小时爬取一次数据写入数据库中

    Spring Boot实战与原理分析视频课程包含14-18

    --演示了如何在Spring Boot里面使用日志配置,以及logback,log4j2等日志的使用 23 Spring Boot 监控和度量47:09 --Spring Boot内置的监控点、自定义的监控状况检查、自定义度量统计,输出等等 24 Spring Boot ...

    java 获得的系统时间与操作系统的时间不一致

     3.log4j日志的时间与与系统相差 相差8个小时  上述问题其实是同一个问题。  原因:java获得的时区跟系统的时区不一样  解决方法如下:  1.在代码前加上下面这句话行了:TimeZone tz =TimeZone....

    《程序天下:J2EE整合详解与典型案例》光盘源码

    6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant介绍 7.1.1 Ant简介 7.1.2 为什么要使用Ant 7.2 建立Ant的开发环境 7.2.1 下载Ant 7.2.2 配置Ant 7.3 Ant的使用方法 7.3.1 Ant能完成的...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant介绍 7.1.1 Ant简介 7.1.2 为什么要使用Ant 7.2 建立Ant的开发环境 7.2.1 下载Ant 7.2.2 配置Ant 7.3 Ant的使用方法 7.3.1 Ant能完成的...

Global site tag (gtag.js) - Google Analytics