如何在 Windows 下的 Java 服务中添加时间戳 GC 日志文件名?

How can I add timestamps GC log file names in a Java Service under Windows?

我在 Windows 下有一个针对 Apache Tomcat 运行的 Java 应用程序。有两种运行此应用程序的方法 - 作为 Windows 服务,或从批处理文件中手动调用 Tomcat。

当我通过批处理文件启动应用程序时,我使用以下内容将 GC 日志添加到 JVM 参数中:

-Xloggc=%~dp0..\logs\gc-%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%_%TIME:~0,2%.%TIME:~3,2%.%TIME:~6,2%.log

这会导致 GC 日志在文件名中输出日期 - 但是当作为服务运行时,DATETIME 变量无法正确解析。

使用 Windows 服务时,我必须在 JVM 参数中使用哪些变量以确保日期和时间附加到 GC 日志?

我已尝试对其进行简化 - gc-%DATE%.log, gc-${DATE}.log,在所有情况下该变量都不会解析。

感谢任何帮助!

编辑: 请注意,当应用程序作为 Windows 服务运行时,任何解决方案 必须 有效。单独使用很好,我们已经涵盖了。仅当使用 Windows 服务时。

编辑 - 使用 Tomcat 作为 Windows 服务

我已经使用 documentation.

作为 Windows 服务安装了 Tomcat

然后我 运行 来自 Tomcat bin 目录的命令行:

"tomcat7.exe" //US//Tomcat7 ++JvmOptions=-Xloggc:gc-%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%_%TIME:~0,2%.%TIME:~3,2%.%TIME:~6,2%.log

注意://US是更新服务命令。 Tomcat7 是服务的名称。

然后重启服务,现在日志路径已经正确解析了。

假设您有现有目录,它应该可以工作。您的日期表达式需要一个名为 gc-2015.1 的目录并创建一个名为 .01_13.43.35.log 的文件(如果我们是 2015 年 1 月 15 日 13 时 43 分 35 秒)


如果您正在使用 catalina.bat

为什么它不起作用?因为您遇到了延迟扩展的问题。

您必须在 catalina.bat

中使用 setlocal ENABLEDELAYEDEXPANSION 启用延迟扩展

然后将%替换为!。你最终会得到 -Xloggc="!~dp0..\logs\gc-!DATE:~-4!.!DATE:~4,2!.!DATE:~7,2!_!TIME:~0,2!.!TIME:~3,2!.!TIME:~6,2!.log".

希望这篇link能帮到你解决问题

http://tomcat.10.x6.nabble.com/gc-log-filename-variables-in-windows-td4987672.html

连我的观察结果都是一样的。

当我们使用 startup.bat 启动 tomcat 并在 catalina.bat 中为 JAVA_OPTS 变量设置与 gc 日志记录相关的值时它起作用。

为什么它起作用是有道理的,因为批处理解释器 会解决这个

-Xloggc=%~dp0..\logs\gc-%DATE:~-4%.%DATE:~4,2%.%DATE:~7,2%_%TIME:~0,2%.%TIME:~3,2%.%TIME:~6,2%.log

像这样

-Xloggc:C:\logs\gc-2015.01.17_17.14.09.log

并将其作为参数传递给 jvm。

我最接近的是使用位于 bin 目录下的 tomcat7w.exe 进行以下配置。

日志文件将在达到指定大小时开始滚动。 您可以在日志文件中找到时间戳。

也曾尝试配置 setenv.bat,但 tomcat7.exe 似乎没有使用它。

希望对您有所帮助。

您是否尝试过通过 this one 这样的包装器调用批处理文件?

编辑:还请记住,如有必要,必须按照@alain-janinm 的建议使用延迟扩展。

使用 java 8 您可以访问两个非常有用的新替换。添加了 %t 和 %p,其中 %t 是时间戳,%p 是进程 ID。

-Xloggc:C:\logs\gc_%t_%p.log 将在 C:\logs.

中产生一个类似这样的文件
gc_2016-08-12_10-12-29_pid7320.log

此功能没有很好的记录。我在这里发现了它: OpenJDK Bug JDK-6950794

因为我也希望它在 windows 服务中工作,所以我已通过以下方式将此功能的使用添加到 tomcat service.bat 脚本中。

--JvmOptions "...;-Xloggc:%CATALINA_BASE%\logs\gc-%%t.log;..."

记下 %%t。需要额外的 % 作为转义字符。