转自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日志,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
一直在使用log4j 每天输出到一个日志文件中,该文件名为:“XXX_年月日时分.log”的形式。 这是一个eclipse工程,最简单的配置实现上述功能。
tomcat下struts2的log4j日志配置.doc
#如果一条日志信息的级别大于等于配置文件的级别,就记录配置输出源所对应的辅助类:log4j.appender.输出源名称=类名,如果输出到文件就写FileAppender #指定文件名 Tomcat的根目录: #指定布局方式(消息放入文件...
在Tomcat6下使用Log4j记录日志,天创建新日志文件时(日志文件设置为:org.apache.log4j.DailyRollingFileAppender)报: log4j:ERROR Failed to rename错误; 网上查找了下原因,大概意思是日志文件始终被占有,所以...
Tomcat的详细错误日志不见了,只报一个万恶的Context [] startup failed due to previous errors,却找不到previous errors具体是啥东西
Log4J "Log4J的入门使用 Log4j的配置 输出日志文件 将日志信息存入数据库" Apache JCL "common log介绍 log中的接口" SLF4J "日志门面的使用 日志的绑定 日志的桥接 日志门面的原理" log-back "log-back的日志框架 ...
tomcat控制台详细错误日志设置,有时tomcat控制台报的错误比较模糊,不知道该怎样去找原因,现在好了,按照简单说明配置一下
Tomcat8下使用Log4j接管生成日志文件,按天存放,日志转换成json格式 亲测可用,日志格式如下: {"time":"2017-09-06 10:24:48,356","logtype":"INFO","loginfo":"org.apache.catalina.startup.HostConfig:Deploying...
ubuntu下tomcat中输出日志,log4j替代catalina.out所需配置
log4j.propertis文件中是否设置成ERROR级别 2、把tomcat安装为windows服务的时候,要把jvm内存设置成1G,同时一定要把这些参数加进去。 -XX:PermSize=64M -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=48m -...
先配置将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....
log4j.propertis文件中是否设置成ERROR级别 2、把tomcat安装为windows服务的时候,要把jvm内存设置成1G,同时一定要把这些参数加进去。 -XX:PermSize=64M -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=48m -...
JFinal 自身对第三方无依赖,但当需要第三方功能支持时则需要添加相应的 jar 文件 1:只有 jfinal-bin-xx.... 而log4j.properties 不存在时无日志输出。jdk logger 需要的logging.properties文件 也在此目录下提供了
运用到的技术:Spring,SpringMVC,Mybatis,Log4J2用来监听日志, 爬取数据模块的日志 PageHelper实现了微信小程序端的上拉继续加载功能 jsoup爬虫技术. 定时任务 : 定时6小时爬取一次数据写入数据库中
--演示了如何在Spring Boot里面使用日志配置,以及logback,log4j2等日志的使用 23 Spring Boot 监控和度量47:09 --Spring Boot内置的监控点、自定义的监控状况检查、自定义度量统计,输出等等 24 Spring Boot ...
3.log4j日志的时间与与系统相差 相差8个小时 上述问题其实是同一个问题。 原因:java获得的时区跟系统的时区不一样 解决方法如下: 1.在代码前加上下面这句话行了:TimeZone tz =TimeZone....
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能完成的...
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能完成的...