【问题标题】:Where to configure internal tomcat7 stdout/stderr log files在哪里配置内部 tomcat7 stdout/stderr 日志文件
【发布时间】:2013-11-16 05:25:31
【问题描述】:

根据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

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

  • commons-daemon.yyyy-MM-dd.log
  • tomcat7-stderr.yyyy-MM-dd.log
  • tomcat7-stdout.yyyy-MM-dd.log

如您所见,他们使用DailyRollingFileAppender,这是不希望的,因为我需要一个免维护系统。所以我更喜欢 RollingFileAppendermaxBackupIndex 以防止日志无限增长。

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

【问题讨论】:

  • 你想摆脱那些日志?
  • 不一定。我想将它们更改为翻转定义的次数,这样一年后我就没有 365 个日志了。但是为了利益 - 如何完全摆脱它们?
  • 您找到解决问题的方法了吗?
  • 检查此链接,它适用于我的 tomcat 8.5 Tomcat log file location

标签: tomcat logging log4j tomcat7


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在 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 文件的内容:As per Apache's recommendation 我已经从 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 并重新打开它,那么 日志前缀 将被设置为 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。 (见下文。)我对此感到惊讶。 (但其实是documented default behavior.

    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

    “重定向标准输出”为空

    如果您将重定向标准输出留空,则不会创建标准输出日志文件。 (我仔细检查了 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. 做一个不那么老套的解决方法:禁止创建 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)。

    进一步阅读

    【讨论】:

      【解决方案3】:

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

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

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

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

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

        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 的简单工具可用于在您无法控制的日志上实现所需的效果。这里有一些链接可以帮助您入门。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          希望对您有所帮助。

          【讨论】:

          • 我无法找到 commons-daemon 日志文件的解决方案,但由于它似乎只记录与服务启动和停止相关的条目,因此在我的实例中它的影响可以忽略不计。跨度>
          • 您能否澄清最后一部分,“您可以使用 log4j 为那些关键文件创建滚动日志文件..”?如何将 stdout 和 stderr 重定向到滚动日志文件?
          • 当您将 tomcat 作为窗口服务运行时,此答案对静音 tomcat 的日志记录非常有帮助。
          • 我的 Windows 服务 tomcat8-stdout.date.log 文件都有一行,“Commons Daemon procrun stdout initialized”和 tomcat8-stderr.date.log 文件提供了与 catalina.date 类似的信息。日志文件,例如将相同的内容过滤到 INFO 或更高级别,并以不同的方式对其进行格式化。通过删除 auto 来抑制两者是一个很好的清理。谢谢。
          猜你喜欢
          • 2014-09-03
          • 1970-01-01
          • 2020-05-10
          • 1970-01-01
          • 1970-01-01
          • 2022-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多