【转自】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
了解命名方法。
分享到:
相关推荐
在使用 Apache Tomcat 作为服务器时,合理配置日志框架(如 Log4j)能够极大地提高开发效率和系统的可维护性。本文将详细介绍两种常见的 Log4j 配置方式:Tomcat 级别的统一日志管理和每个 web 应用分别配置 Log4j,...
本篇将探讨如何使用Log4j来替代Tomcat的默认日志输出,达到更灵活和可定制的日志管理。 首先,我们来分析一下Tomcat默认日志管理的一些不足之处。在Tomcat中,默认的日志是通过catalina.out文件记录的,它使用java....
例如,若要将日志输出到名为"tomcat.log"的文件,并设置日志级别为INFO,"log4j.properties"文件可能包含以下内容: ``` log4j.rootLogger=INFO, FILE log4j.appender.FILE=org.apache.log4j.FileAppender log4j....
3. **配置Tomcat**:在`$CATALINA_HOME/lib`目录下添加`log4j-api.jar`和`log4j-slf4j-impl.jar`,这将使Tomcat使用Log4j2作为其内部的日志系统。 4. **排除其他日志实现**:确保你的应用中没有引入其他的日志实现...
Log4j是一个广泛使用的开源日志框架,提供灵活的日志配置和多种级别的日志输出。本文将详细介绍如何在Tomcat服务器环境下使用Log4j接管生成日志文件。 首先,了解Log4j的核心组件: 1. **Logger**:负责生成日志...
这时,我们可以使用Log4j这个强大的日志框架来接管Tomcat的日志生成方式,实现更精细的日志控制和管理。 首先,Log4j是Apache的一个开源项目,提供了一种灵活的日志记录系统,允许开发者自定义日志级别、输出格式、...
`tomcat-juli` 是Tomcat自带的日志系统,而`tomcat-juli-adapters.jar` 是一个适配器,使得我们可以使用Log4j替换Tomcat默认的日志输出。 **1. 配置Tomcat-Juli** Tomcat-Juli是Tomcat的内置日志系统,它提供了一个...
这样,Tomcat就会使用Log4j进行日志记录,并按照设定的规则滚动`catalina.out`文件。 注意,你还可以根据需要自定义日志级别,例如将`log4j.rootLogger`的级别设置为`DEBUG`,以便记录更详细的信息。此外,可以通过...
然而,JULI的功能相对有限,不如Log4j强大,因此许多开发者倾向于将Tomcat的日志系统替换为Log4j。 为了将Tomcat的日志系统与Log4j结合,引入了`tomcat-juli-adapters.jar`。这个适配器库允许Tomcat的JULI接口与Log...
`log4j-1.2.17.jar`是Log4j的核心库,而`tomcat-juli-adapters.jar`则提供了一个适配器,使得Tomcat可以使用Log4j进行日志记录。 3. **tomcat-juli.jar**:此文件是Tomcat自带的日志组件,用于支持JULI。虽然我们...
这个适配器允许Tomcat使用非JUL的日志实现,比如通过配置可以使得Tomcat的日志输出通过Log4j进行,这样就统一了应用和服务器的日志处理方式,便于管理和分析。适配器通过导入适当的桥接类,使得Tomcat的JULI记录器...
Log4j是一款广泛使用的Java日志框架,它提供了灵活的日志记录、配置和管理功能。本篇文章将深入探讨如何在Tomcat 8.0.30版本中配置Log4j,实现日志自动按天分割并保存。 1. **Log4j介绍** Log4j是Apache软件基金会...
在IT行业中,日志记录是系统调试、性能分析和故障排查的重要工具,而Log4j则是Java编程语言中广泛使用的日志框架之一。本工程基于Eclipse IDE,配置了一个简单的Log4j设置,实现了每天自动将日志输出到一个特定命名...
问题的核心在于,当Tomcat8配置使用SLF4J和Log4j2时,如果日志无法正常输出,可能有以下几个原因: 1. **依赖冲突**:确保你的项目中没有引入了其他日志框架的jar包,如logback或log4j1.x,这可能导致SLF4J找不到...
通过以上步骤,我们可以利用Log4j的强大功能为Tomcat服务器实现日志分割,这不仅能优化日志管理,还能提高系统维护的效率。日志分割的实施,使得运维人员能够更加有效地分析和监控应用的运行状况,从而确保服务的...
为了使 Tomcat 使用 Log4j 而不是默认的日志系统,需要编辑 Tomcat 的 `server.xml` 文件,并在 `<GlobalNamingResources>` 元素内添加如下配置: ```xml <Resource name="log4jConfig" auth="Container" type=...
首先,需要将 Log4j 的 lib 包放在 Tomcat 的 lib 目录下,然后在 lib 目录新建一个 log4j.properties 文件,该文件用于配置 Log4j 的日志记录行为。下面是一个示例性的 log4j.properties 文件: log4j.rootLogger=...
在J2EE应用中,尤其是在Tomcat这样的Servlet容器中使用Log4j,通常需要在Web应用的`web.xml`配置文件中指定日志初始化参数。这可以通过在`web.xml`中添加一个`context-param`元素来实现,将Log4j的配置文件路径作为...
WAS 上 log4j 日志不能...解决 WAS 上 log4j 日志不能输出(ibatis)sql 语句的问题需要改变 WAS 的默认 LogFactory 实现类,使其使用 log4j 框架下的 LogFactory 实现类,并且需要正确配置 log4j.properties 文件。
Log4j是Apache的一个开源项目,它为Java应用程序提供了一个灵活的日志系统。这个系统能够帮助开发者记录程序运行过程中的各种信息,包括错误、警告、调试信息等,这对于软件的调试、性能分析以及问题追踪非常有帮助...