在哪里配置内部tomcat7 stdout/stderr日志文件

räp*_*äph 16 logging tomcat log4j tomcat7

我根据http://tomcat.apache.org/tomcat-7.0-doc/logging.html使用tomcat 7.0.40和log4j配置

除了创建了一些日志文件之外,所有内容都按预期工作,这些日志文件实际上没有在我的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
Run Code Online (Sandbox Code Playgroud)

创建的文件虽然不在我的配置中,但是:

  • 公地daemon.yyyy-MM-dd.log
  • tomcat7-stderr.yyyy-MM-dd.log
  • tomcat7-stdout.yyyy-MM-dd.log

如你所见,他们使用每日滚动文件appender,这是不需要的,因为我需要一个免维护系统,所以我更喜欢使用maxBackupIndex的scrollfileappender来防止日志的无限增长.

那么我在哪里可以配置stdout,stderr和commons-daemon日志?是否有某些配置或我可以用我自己的log4j配置覆盖配置?谢谢

M..*_*M.. 18

我预见到我们的某个系统将来会有一些类似的要求/面临同样的问题.所以热衷于自己找到一些解决方案/解决方法.

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

然而,我发现人们采取两种处理"tomcat日志越过限制"的方法.

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

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

    YourTomcatInstallDir\conf\context.xml  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑上下文标记以添加swallowOutput="true"如下: -

    <Context swallowOutput="true">
    
    Run Code Online (Sandbox Code Playgroud)

    (这会吞下所有stdout/stderr并重定向到您的基础日志系统.)

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

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

    log4j.logger.org.apache.catalina=INFO, YourAppender
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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


小智 13

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

希望有所帮助.


Sta*_*uff 9

禁用 Procrun GUI 内的日志文件创建

简洁版本

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

Procrun GUI 内部。

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

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

中等版本:我对这个解决方案不太满意,但对于我必须管理的 Tomcats,我设置了几件事:

  • 我已经最大限度地减少了 web 应用程序中进入 catalina.out/stdout/stderr 文件的内容:我已经从 web 应用程序自己的日志记录配置中删除了所有控制台日志记录。(毕竟:不需要在 web 应用程序自己的 Log4J 管理的日志和 catalina.out/stderr/stdout 中拥有相同的日志?)
  • 我已经最大限度地减少了 Tomcat 本身进入 catalina.out/stdout/stderr 文件的内容:根据 Apache 的建议,我已从logging.properties 中删除了 ConsoleHandler。(推理是相同的:不需要记录两次。)
  • 我(目前)决定保留 Procrun 的日志(commons-daemon、stdout、stderr)。但我希望通过每周重新启动和清理工作相结合,以某种方式限制它们可以增长的大小。每周自动重新启动可确保 Procrun 将启动这三个文件的一组新的(并带有时间戳)。以及每周自动化的deage32作业会在一段时间后清理这些旧文件。
  • 我考虑过使用LogRotateWin,但无法使其与锁定访问的文件一起使用。copytruncate(即使是应该执行此操作的目录也不行。)也许我将来会再试一次。
  • 另一件尚未尝试过的事情:Tomcat 的swallowOutput属性 ** 更新:2022-03-30,我已经尝试过,但它对我的 webapps 根本不起作用。而且关于 Apache 的描述听起来很可怕。所以我决定不使用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选项卡。

“监控 Tomcat”图标

Procrun 的“日志记录”选项卡

这是全新安装后使用所有默认值的 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 将不会创建新文件。此外,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
Run Code Online (Sandbox Code Playgroud)

默认日志级别为info.

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

“日志前缀”为空

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

“日志前缀”绝对路径

如果您将Log 路径指向一个不存在的目录,则 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
Run Code Online (Sandbox Code Playgroud)

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

但如果您输入I\DONT\CARE,则不会创建任何文件。那么这三个日志文件都不会被创建。

PS C:\> handle -nobanner commons-daemon
No matching handles found.
Run Code Online (Sandbox Code Playgroud)

对于输入带有冒号的内容(例如“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
Run Code Online (Sandbox Code Playgroud)

重定向 Stdout 日志文件和重定向 Stderr 日志文件

我在这里只描述 Stdout。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

“重定向标准输出”为空

如果将重定向标准输出留空,则不会创建标准输出日志文件。(我仔细检查了handle.exe。)此行为与日志文件的行为不同commons-daemon

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

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

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

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

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

如果将“重定向标准输出”设置为“mystdout”,则将创建一个具有完整路径的文件:“C:\Program Files\Apache Software Foundation\Tomcat 7.0\mystdout”。请注意,这是在日志路径目录之外。此行为不同于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. 采取一个巧妙的解决方法:将 Procrun 设置Log Path:NOTADRIVE:. 那么这三个日志文件都不会被创建。

  2. 采取一个不那么麻烦的解决方法:禁用 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 文件。--“Procrun”只是几个现有的(据称)通用 java 服务包装器之一。我在这里写“据说”,因为“通用”似乎是“commons daemon”的设计目标,但实际上我从未见过它在 Tomcat 以外的任何地方使用。-- 在谷歌搜索“java servicewrapper”时,我发现了几个项目,但我还没有尝试过其中任何一个。

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

进一步阅读