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

Evi*_*kie 5 java windows service tomcat jvm-arguments

我在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
Run Code Online (Sandbox Code Playgroud)

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

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

我试图简化它 - gc-%DATE%.log, gc-${DATE}.log在所有情况下变量都无法解决.

任何帮助表示赞赏!

编辑:请注意,当应用程序作为Windows服务运行时,任何解决方案都必须正常工作.独自站立很好,我们已经覆盖了.仅在使用Windows服务时才会这样.

ala*_*inm 5

编辑 - 使用Tomcat作为Windows服务

我已经使用文档将Tomcat安装为Windows服务.

然后我从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
Run Code Online (Sandbox Code Playgroud)

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

然后重新启动服务,现在正确解析了日志路径.

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


如果你使用catalina.bat

为什么它不起作用?因为你遇到了延迟扩张的问题.

您必须使用setlocal ENABLEDELAYEDEXPANSIONin 启用延迟扩展catalina.bat

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


小智 5

使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

--JvmOptions "...;-Xloggc:%CATALINA_BASE%\logs\gc-%%t.log;..."
Run Code Online (Sandbox Code Playgroud)

请注意 %%t。需要额外的 % 作为转义字符。