在 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 可以生成几个文件:
commons-daemon
日志文件。
Pid file
。_ 我们现在不关心这个。
Redirect Stdout
日志文件。
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。)
解决方法
我想到了几种解决方法:
制作一个 hacky 解决方法:将 Procrun 设置Log Path:
为NOTADRIVE:
. 然后不会创建三个日志文件。
做一个不那么 hacky 的解决方法:禁用创建 stdout/stderr 文件(见下文)。您仍然需要一种方法来清理旧的“commons-daemon”文件。(我知道没有办法禁用这些文件的创建。只是清空文本字段不会成功。)但至少这些文件应该很小。
设置 Tomcat 和/或整台机器的自动重启。这将创建一个带有重启日期时间戳的文件。您仍然需要一种方法来清理旧的 commons-daemon/stdout/stderr 文件。但至少它们不会被锁定为“正在使用”,你可以删除它们,也许像DelAge
.
使用外部 Logrotate-for-Windows 实用程序(例如LogRotateWin来旋转当前文件并清理旧的旋转文件。例如,请参阅此答案:https ://serverfault.com/questions/358172/equivalent-of- logrotate-for-windows/1032685#1032685
不要使用 Procrun 并以其他方式启动 Windows Tomcat。这不会创建任何 commons-daemon/stdout/stderr 文件。
我认为官方的立场可以粗略地概括为“什么?你的 catalina/stdout/stderr 文件太大了?好吧,你不应该向那些记录任何东西。” 换句话说:如果您完全使用 Procrun,那么唯一官方支持的选项似乎是数字 2(和 4)。
进一步阅读