20

根据http://tomcat.apache.org/tomcat-7.0-doc/logging.html ,我正在使用带有 Log4j 配置的 Apache Tomcat 7.0.40

一切都按预期工作,除了创建了一些日志文件,这些文件实际上没有在我的log4j.properties

log4j.rootLogger=INFO, CATALINA

# Define all the appenders
log4j.appender.CATALINA=org.apache.log4j.RollingFileAppender
log4j.appender.CATALINA.File=${catalina.base}/logs/catalina.log
log4j.appender.CATALINA.MaxFileSize=3MB
log4j.appender.CATALINA.MaxBackupIndex=10
log4j.appender.CATALINA.Append=true
log4j.appender.CATALINA.Encoding=UTF-8
log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.LOCALHOST=org.apache.log4j.RollingFileAppender
log4j.appender.LOCALHOST.File=${catalina.base}/logs/localhost.log
log4j.appender.LOCALHOST.MaxFileSize=3MB
log4j.appender.LOCALHOST.MaxBackupIndex=10
log4j.appender.LOCALHOST.Append=true
log4j.appender.LOCALHOST.Encoding=UTF-8
log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.MANAGER=org.apache.log4j.RollingFileAppender
log4j.appender.MANAGER.File=${catalina.base}/logs/manager.log
log4j.appender.MANAGER.MaxFileSize=3MB
log4j.appender.MANAGER.MaxBackupIndex=10
log4j.appender.MANAGER.Append=true
log4j.appender.MANAGER.Encoding=UTF-8
log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.HOST-MANAGER=org.apache.log4j.RollingFileAppender
log4j.appender.HOST-MANAGER.File=${catalina.base}/logs/host-manager.log
log4j.appender.HOST-MANAGER.MaxFileSize=3MB
log4j.appender.HOST-MANAGER.MaxBackupIndex=10
log4j.appender.HOST-MANAGER.Append=true
log4j.appender.HOST-MANAGER.Encoding=UTF-8
log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost]=INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager]=\
  INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager]=\
  INFO, HOST-MANAGER

尽管它们不在我的配置中,但创建的文件是:

  • 公共守护进程。yyyy-MM-dd .log
  • tomcat7-stderr。yyyy-MM-dd .log
  • tomcat7 标准输出。yyyy-MM-dd .log

正如您所看到的,他们使用的DailyRollingFileAppender是不需要的,因为我需要一个免维护系统。所以我更喜欢RollingFileAppenderwithmaxBackupIndex来防止日志无限增长。

那么在哪里可以配置stdout,stderrcommons-daemon日志呢?某处是否有一些配置,或者我可以用我自己的 Log4j 配置覆盖配置?谢谢

4

5 回答 5

20

我预见我们在未来某个时间在我们的一个系统上会有类似的要求/面临同样的问题。所以热衷于自己寻找一些解决方案/解决方法。

首先查看commons-daemon,看看是否有任何配置可以实现日志上的maxbackupindex;但搜索并没有太大帮助。

但是,我发现人们采用两种方法来处理“tomcat 日志越界”。

第一种方法:在Tomcat内部配置

  1. context.xml在路径中的 Tomcat 中 查找:-

    YourTomcatInstallDir\conf\context.xml  
    
  2. 编辑上下文标签以添加swallowOutput="true"如下: -

    <Context swallowOutput="true">
    

    (这会吞噬你所有的 stdout/stderr 并重定向到你的底层日志系统。)

  3. 在你的 log4j.properties; 添加配置以将您的org.apache.catalina日志重定向到您自己的日志文件。

    您的记录器将如下所示:-

    log4j.logger.org.apache.catalina=INFO, YourAppender
    

    YourAppender现在您可以设置MaxBackupIndexMaxFileSize实现定义的翻转次数和日志大小限制。)

如果上述方法不起作用;您可以尝试使用第二种方法中提到的外部实用程序

第二种方法:使用“logrotate”进行外部配置

有一个简单的工具logrotate可用于在您无法控制的日志上实现所需的效果。这里有一些链接可以帮助您入门。

该工具的使用非常简单,快速浏览这些链接应该可以满足您的需求。

于 2014-09-25T17:40:43.507 回答
13

我有同样的问题,最后偶然发现了解决方案。Tomcat 7 for windows 有一个名为 Monitor Tomcat 的 tomcat 属性应用程序。在日志记录选项卡上,您需要删除重定向标准输出和标准错误输入框中的“自动”值。只需将其留空,它就不会创建这些文件。然后,您可以使用 log4j 为这些关键文件创建滚动日志文件,以供将来调试。

希望有帮助。

于 2013-12-09T17:01:03.810 回答
5

在 Procrun GUI 中禁用日志文件创建

短版

那么在哪里可以配置 stdout、stderr 和 commons-daemon 日志?

在 Procrun GUI 内部。

某处是否有一些配置,或者我可以用我自己的 Log4j 配置覆盖配置?

不,我希望,但我不这么认为。但这里有一个肮脏的技巧来阻止 Procrun 完全记录:设置Log Path:NOTADRIVE:(包括尾随:)。然后不会创建三个日志文件(commons-daemon、stderr、stdout)。

中版:我对解决方案不是很满意,但是对于我必须管理的 Tomcat,我设置了几件事:

  • 我已经最小化了从我的 webapps 进入 catalina.out/stdout/stderr 文件的内容:我已经从 webapps 自己的日志配置中删除了所有控制台日志记录。(毕竟:不需要在 webapps 自己的 Log4J 管理的日志和 catalina.out/stderr/stdout 中都有相同的日志?)
  • 我已经最小化了 Tomcat 本身进入 catalina.out/stdout/stderr 文件的内容:根据 Apache 的建议,我已经从 logging.properties 中删除了 ConsoleHandler。(推理是一样的:不需要记录两次。)
  • 我(现在)决定保留 Procrun 的日志(commons-daemon、stdout、stderr)。但我希望通过结合使用每周重启和清理工作来以某种方式限制它们可以增长的大小。每周自动重启确保 Procrun 将启动这三个文件的新(和时间戳)集。并且每周一次的自动delage32作业会在一段时间后清理这些旧文件。
  • 我考虑过使用LogRotateWin,但无法使用锁定访问的文件。(即使copytruncate是应该这样做的目录也不行。)也许我将来会再试一次。
  • 另一件事尚未尝试:Tomcat 的swallowOutput属性。

长版见下文。(这是一次漫无目的的深潜。考虑一下自己被警告过。)


Tomcat 作为 Windows 服务

默认的 Windows 安装程序会将 Tomcat 注册为服务。

对此的内部机制称为Commons Daemon Service Manager

有 Unix 和 Windows 版本。而Win32版本被称为“Procrun”。

Procrun 有一个 GUI,严格来说这个 GUI 被称为“ Prunmgr ”。——但我会掩饰这一点,假装它都被称为“Procrun”。

Procrun 不使用标准的 Windows 事件日志框架。相反,Procrun 将创建一些日志文件。让我们启动 GUI,看看它们是什么。

启动 Procrun GUI

Windows 图标只是标记为Monitor Tomcat

在默认安装中,这是一个启动的快捷方式"C:\Program Files\Apache Software Foundation\Tomcat 7.0\bin\Tomcat7w.exe" //MS//Tomcat7

开始这将带您直接进入 Procrun 的Logging选项卡。

Procrun 的“日志记录”选项卡

这是全新安装后 Procrun 的“日志记录”选项卡的屏幕截图,所有默认设置:

(安装细节:apache-tomcat-7.0.40.exe在 Win10 x64 上。)

Procrun 可以生成几个文件:

  1. commons-daemon日志文件。
  2. Pid file。_ 我们现在不关心这个。
  3. Redirect Stdout日志文件。
  4. Redirect Stderror日志文件。

Procrun 生成 3 个日志文件。

所以有3个日志文件。而 Procrun 只会在你重启 Tomcat 时启动一个新的。

因此,如果旧日志文件变得太大,Procrun 将不会创建新文件。此外,Procrun 不会对位于日志目录中的旧日志文件做任何事情,并使日志目录本身太大。

让我们看看各个日志文件以及它们的作用:commons-daemon日志文件、Redirect Stdout日志文件和Redirect Stderror日志文件。

commons-daemon日志文件

该文件包含有关 Procrun 本身工作原理的信息。例子:

PS C:\> Get-Content -Path "C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs\commons-daemon.2020-09-08.log"

[2020-09-08 16:06:28] [info]  [ 4276] Commons Daemon procrun (1.0.15.0 64-bit) started
[2020-09-08 16:06:28] [info]  [ 4276] Running 'Tomcat7' Service...
[2020-09-08 16:06:28] [info]  [17304] Starting service...
[2020-09-08 16:06:29] [info]  [17304] Service started in 1135 ms.
[2020-09-08 16:09:24] [info]  [11520] Stopping service...
[2020-09-08 16:09:25] [info]  [11520] Service stop thread completed.
[2020-09-08 16:09:25] [info]  [ 4276] Run service finished.
[2020-09-08 16:09:25] [info]  [ 4276] Commons Daemon procrun finished

默认日志级别为info.

所以路径和文件名是这样构造的:日志路径+“\”+日志前缀+“.” + 日期格式为 YYYY-MM-DD + ".log"。

“日志前缀”为空

如果您将日志前缀留空,那么它将默认为commons-daemon. 如果您关闭 Procrun 并重新打开它,那么Log 前缀将设置为commons-daemon. 换句话说:你不能把它留空。如果你尝试,那么 Procrun 会默默地把它改回来。

“日志前缀”绝对路径

如果你将日志路径指向一个不存在的目录,那么 ProcRun 将尝试创建这个目录。

“日志前缀”不是绝对路径

如果您放入 IDONTCARE,则会发生以下情况:

PS C:\> handle.exe commons-daemon                                                                                                                                                                                                                                              
Nthandle v4.22 - Handle viewer
Copyright (C) 1997-2019 Mark Russinovich
Sysinternals - www.sysinternals.com

Tomcat7.exe        pid: 4880   type: File           1B8: C:\Windows\System32\IDONTCARE\commons-daemon.2020-09-08.log


PS C:\> handle -nobanner IDONTCARE                                                                                                                                                                                                                                             Tomcat7.exe        pid: 4880   type: File           1B8: C:\Windows\System32\IDONTCARE\commons-daemon.2020-09-08.log
Tomcat7.exe        pid: 4880   type: File           1BC: C:\Windows\System32\IDONTCARE\tomcat7-stdout.2020-09-08.log
Tomcat7.exe        pid: 4880   type: File           1D4: C:\Windows\System32\IDONTCARE\tomcat7-stdout.2020-09-08.log
Tomcat7.exe        pid: 4880   type: File           1D8: C:\Windows\System32\IDONTCARE\tomcat7-stderr.2020-09-08.log
Tomcat7.exe        pid: 4880   type: File           1DC: C:\Windows\System32\IDONTCARE\tomcat7-stderr.2020-09-08.log

是的。它在 C:\Windows\System32 中创建了一个名为 IDONTCARE 的目录。这可不是个好主意。

但是,如果您输入 I\DONT\CARE,则不会创建任何文件。然后不会创建三个日志文件。

PS C:\> handle -nobanner commons-daemon                                                                                                                                                                                                                                        No matching handles found.

输入带有冒号的内容(例如“NOTADRIVE:”)也是如此。

“日志路径”为空

如果您将日志路径留空,则 Procrun 将默认默认为%SYSTEMROOT%\System32\LogFiles\Apache. (见下文。)我对此感到惊讶。(但它实际上是记录在案的默认行为。

PS C:\> handle.exe commons-daemon                                                                                      
Nthandle v4.22 - Handle viewer
Copyright (C) 1997-2019 Mark Russinovich
Sysinternals - www.sysinternals.com

Tomcat7.exe        pid: 7504   type: File            88: C:\Windows\System32\LogFiles\Apache\commons-daemon.2020-08-31.log

重定向标准输出日志文件和重定向标准错误日志文件

我将在这里只描述标准输出。Stderr 的行为是相同的。

“重定向标准输出”auto

重定向标准输出的默认设置是auto. 然后路径和文件名是这样构造的:日志路径+ "" + your-service-name-here + "-stdout"。+ 日期格式为 YYYY-MM-DD + ".log"。

“auto”的大写似乎无关紧要。全部小写的“auto”与全部大写的“AUTO”一样。

示例:使用默认安装,您的服务名称将是“Tomcat7”。如果您在 2020 年 9 月 8 日启动 Tomcat,那么全名将是:C:\Program Files\Apache Software Foundation\Tomcat 7.0\logs\tomcat7-stdout.2020-09-08.log

“重定向标准输出”为空

如果您将Redirect Stdout留空,则不会创建 Stdout 日志文件。(我仔细检查了handle.exe。)此行为与commons-daemon日志文件的行为不同。

“重定向标准输出”绝对路径

如果将Redirect Stdout设置为绝对路径,则将在那里创建日志文件。

如果目录不存在,则不会创建。此行为不同于commons-daemon日志文件的行为。

如果绝对路径的文件名部分是“auto”,那么这没有特殊含义。它不会创建带时间戳的文件。它只会创建一个名为“auto”的文件。

相对路径(“auto”以外的词)

如果您将Redirect Stdout 设置为“mystdout”,则将使用完整路径创建一个文件:“C:\Program Files\Apache Software Foundation\Tomcat 7.0\mystdout”。请注意,这在Log Path目录之外。此行为不同于commons-daemon日志文件的行为。

Procrun 在这里使用的路径来自 Procrun | “启动” | “工作路径:”

(默认为C:\Program Files\Apache Software Foundation\Tomcat 7.0

(此路径存储在此处的 Windows 注册表中:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Start => WorkingPath -- 这是在我的 Win10 x64 机器上。不确定为什么使用 WOW6432Node。)

解决方法

我想到了几种解决方法:

  1. 制作一个 hacky 解决方法:将 Procrun 设置Log Path:NOTADRIVE:. 然后不会创建三个日志文件。

  2. 做一个不那么 hacky 的解决方法:禁用创建 stdout/stderr 文件(见下文)。您仍然需要一种方法来清理旧的“commons-daemon”文件。(我知道没有办法禁用这些文件的创建。只是清空文本字段不会成功。)但至少这些文件应该很小。

  3. 设置 Tomcat 和/或整台机器的自动重启。这将创建一个带有重启日期时间戳的文件。您仍然需要一种方法来清理旧的 commons-daemon/stdout/stderr 文件。但至少它们不会被锁定为“正在使用”,你可以删除它们,也许像DelAge.

  4. 使用外部 Logrotate-for-Windows 实用程序(例如LogRotateWin来旋转当前文件并清理旧的旋转文件。例如,请参阅此答案:https ://serverfault.com/questions/358172/equivalent-of- logrotate-for-windows/1032685#1032685

  5. 不要使用 Procrun 并以其他方式启动 Windows Tomcat。这不会创建任何 commons-daemon/stdout/stderr 文件。

我认为官方的立场可以粗略地概括为“什么?你的 catalina/stdout/stderr 文件太大了?好吧,你不应该向那些记录任何东西。” 换句话说:如果您完全使用 Procrun,那么唯一官方支持的选项似乎是数字 2(和 4)。

进一步阅读

于 2019-01-29T14:57:29.873 回答
1

在 Windows 上,您必须转到 tomcat/bin/service.bat 并编辑 PR_LOGPATH 变量(全部)。并且可能通过“服务删除”和“服务安装”重新安装服务在linux系统上的解决方案必须非常相似

于 2014-08-22T08:57:01.533 回答
0

对于那些只想自定义创建这 3 个日志的位置的人:

如果您将 Tomcat 作为服务运行并且您希望自定义commons-daemonstderrstdout文件所在的位置,那么您可以使用命令行参数启动您的服务,--LogPath或者在服务器机器上PR_LOGPATH使用您的自定义路径设置一个环境变量。

这也与其他参数一起记录在此处: https ://tomcat.apache.org/tomcat-8.0-doc/windows-service-howto.html

于 2019-04-03T20:54:36.350 回答