`
xxxxxxxx_rui
  • 浏览: 43493 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Linux 日志超大问题

阅读更多
为了能够满足我的一个项目中日志输出的特殊要求,我花了好几个小时配置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 配置,一般如下:

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.ConsoleAppenderlog4j.appender.A1.layout=org.apache.log4j.PatternLayout ## Print the date in ISO 8601 format#log4j.appender.A1.layout.ConversionPattern=%d %-5p %c - %m%n
## Configuration for a rolling log file (\"tomcat.log\").#log4j.appender.R=org.apache.log4j.DailyRollingFileAppenderlog4j.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.loglog4j.appender.R.layout=org.apache.log4j.PatternLayout## Print the date in ISO 8601 format#log4j.appender.R.layout.ConversionPattern=%d %-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 了解命名方法。








tomcat6.0输出日志的问题 浏览次数:2468次悬赏分:0 | 解决时间:2007-12-27 16:16 | 提问者:漂泊如风
我在server.xml设置好了<logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/>
可是怎么我重启了tomcat可是看不到它生成的日志呢???
       最佳答案 我在server.xml设置好了<logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhost_log." suffix=".txt" timestamp="true"/>
分享到:
评论

相关推荐

    linux查看日志命令

    linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志命令linux查看日志...

    linux收集日志工具

    本文将详细介绍一种名为"logtoolV1"的Linux日志收集工具,该工具专门设计用于汇总和分析软件及硬件的相关信息。 首先,我们要理解Linux日志的重要性。在Linux环境下,各种服务、应用以及系统组件会不断产生日志,...

    linux日志路径收集

    ### Linux日志路径收集 在Linux系统中,日志文件是非常重要的组成部分,它们记录了系统运行过程中的各种信息,包括但不限于错误、警告、通知等,这些信息对于系统管理员来说是诊断问题、排查故障的重要依据。本文将...

    LogManager_Linux.rar_Linux日志_LogManager_linux 日志_linux 日志_日志

    下面我们将深入探讨`LogManager`在Linux日志处理中的应用及其核心特性。 首先,日志分级是`LogManager`的一个关键特性。在软件开发中,不同级别的日志信息对于调试和分析系统行为有着不同的价值。通常,我们有如下...

    linux日志管理,进行linux的日志管理

    Linux日志管理是系统维护和故障排查的重要组成部分,它记录了操作系统中发生的各种事件,包括用户登录、系统错误、网络活动等。日志管理的主要功能有审计和监测,它可以帮助系统管理员监控系统状态,及时发现和处理...

    linux系统中c++写日志文件功能分享

    在实际编程中,使用这样的日志系统可以帮助开发者快速定位问题,尤其是当程序在生产环境中出现异常时。通过控制日志级别,可以决定在日志文件中记录哪些级别的信息,从而平衡调试信息的详细程度和磁盘空间的使用。...

    Linux登录日志时间戳转换工具

    Linux登录日志时间戳转换工具,主要用于Linux系统登录分析,方便溯源。

    linux 日志查看分析

    linux 日志查看分析

    Linux下面日志代码

    在Linux系统中,日志...了解和熟练掌握这些Linux日志管理技术,能帮助开发者更好地理解程序运行情况,及时发现并解决问题,提高系统稳定性。在实际项目中,根据需求选择合适的日志处理方法,可以提升开发和运维效率。

    logc.rar_C++ 日志系统_Linux日志_linux 日志_logc_日志记录 linux

    本文将深入探讨如何在Linux环境中使用C++来创建一个日志系统,以及Linux日志的相关概念。 首先,了解Linux日志系统的基础知识至关重要。在Linux中,日志主要用于记录系统事件和应用程序运行情况,它可以帮助开发者...

    Linux C 实现日志打印功能

    本篇文章将深入探讨如何在Linux环境下用C语言实现日志打印功能。 首先,理解日志的基本结构和分类至关重要。常见的日志级别有DEBUG、INFO、NOTICE、WARNING、ERROR、CRITICAL、ALERT和EMERGENCY,这些级别按照严重...

    详解linux下nohup日志输出过大问题解决方案

    本文将详细讨论如何解决`nohup`日志输出过大问题,并提供一些实用的解决方案。 首先,理解`nohup`命令的基本用法至关重要。`nohup`命令的基本语法是`nohup [command] [args] [&]`。运行这个命令时,系统会忽略所有...

    linux查找日志技巧

    在Linux系统中,日志文件是维护和诊断问题的重要工具之一。通过对日志文件的有效管理与检索,可以帮助系统管理员快速定位问题并解决故障。本文将详细介绍Linux环境下常用的日志查找技巧,包括基本命令的使用方法及其...

    linux系统日志解析

    ### Linux系统日志解析 在Linux系统中,日志文件是非常重要的组成部分,它们记录了系统的运行状态、应用程序的行为以及各种事件的发生情况。通过对这些日志的分析,可以帮助系统管理员及时发现并解决问题,确保系统...

    linux下nohup日志输出过大问题的解决方法

    Linux 下 nohup 日志输出过大问题的解决方法 Linux 是一个功能强大且广泛使用的操作系统,nohup 命令是 Linux 中的一个常用命令,用于在后台运行程序并将输出重定向到文件中。但是在使用 nohup 命令时,经常会遇到...

    集中化Linux日志管理系统

    集中化的Linux日志管理系统可以有效地解决这一问题,提高工作效率并确保数据的安全性。以下将详细讲解相关知识点。 **1. 日志管理的重要性** 日志文件记录了系统的运行状态、错误信息以及各种操作记录,对于诊断...

    linux下的异步日志记录类

    在Linux操作系统中,日志记录是一项至关重要的任务,它帮助开发者追踪程序运行状态,调试问题,以及维护系统稳定性。本文将深入探讨Linux下用于异步日志记录的类,并基于提供的文件名`debugger.cpp`、`debug_msg.cpp...

    linux常用定时日志清理脚本

    linux常用定时日志清理脚本,一些应用服务器长年累积日志量庞大,用这个定时任务清理指定日志类文件。参考下吧~

    linux日志打印.cpp

    linux系统下打印日志到文件中,包含当前时间,不限定日志内容和参数。用来调试软件,查看方便日志信息。

    linux下读写日志文件

    从执行体程序库中的CLLogger类可知,通过缓存要写入文件中的数据,能够提高读写磁盘的性能。编写一个文件操作的封装类,调用该类的写操作接口时,数据要首先写到缓存,然后再根据策略写到文件中。...

Global site tag (gtag.js) - Google Analytics