Locale <=> Tomcat日志中的时间/日期格式?

3
我在从Eclipse运行Tomcat时无法更改Tomcat日志中的区域设置/日期格式。它使用12小时制,而我想要使用24小时制(语言为英语,这已经是我想要的)。到目前为止,我尝试了以下方法:
  • 在Tomcat的启动配置中设置LANGLC_ALL环境变量为en_GB
  • 在Tomcat的启动配置中添加-Duser.language=en -Duser.region=GB到VM选项中
  • 在Eclipse的eclipse.ini中添加-Duser.language=en -Duser.region=GB
  • 在JRE配置中将-Duser.language=en -Duser.region=GB设置为默认VM参数
如果我从shell中运行Tomcat,通过在bin\catalina.bat中添加-Duser.language=en -Duser.region=GB到%JAVA_OPTS%,它按预期工作,例如在这里列出的outlined here,但当它在Eclipse中运行时,这并不会影响Tomcat。注意:我无法重现此问题,并且必须假定我错误地使用了Java 6而不是7来运行Tomcat。所用软件:Tomcat 7.0.54,Oracle JDK 1.7.0_60(64位),Windows 8(64位)。

更新:感谢Michael-O的回答,我意识到自Java 7以来Java的语言环境解析已经发生了改变。事实上,返回到Java 6可以解决我的问题并给了我24小时制的时钟,但这对于我的当前项目是不可行的。

我没有能够在Java 7中实现相同的效果。据说,通过将系统属性sun.locale.formatasdefault设置为true可以返回到旧的语言环境解析,但这似乎根本不影响Tomcat 7日志中的时间显示。过了一会儿,我在这个错误中找到了一个相当明确的陈述:

我们失去了根据地区决定24小时或12小时制时间的能力,但是我们通过在logging.properties中提供java.util.logging.SimpleFormatter.format属性的格式字符串来覆盖默认格式的能力。

因此,似乎手动定义这个格式字符串是唯一的方法,Michael-O也建议这样做,所以我接受了他的答案。

在深入研究java.util.Formatter语法的疯狂后,我现在已经使用了这个格式字符串,并需要将其放入Tomcat启动配置的VM选项中:

-Djava.util.logging.SimpleFormatter.format="%1$ty%1$tm%1$td_%1$tH%1$tM%1$tS_%1$tL %4$4.4s %3$s %5$s %n"

输出:

151003_195915_359 INFO org.apache.coyote.http11.Http11Protocol Starting ProtocolHandler ["http-bio-8080"] 
151003_195915_375 INFO org.apache.coyote.ajp.AjpProtocol Starting ProtocolHandler ["ajp-bio-8009"] 
151003_195915_375 INFO org.apache.catalina.startup.Catalina Server startup in 1280 ms

如果需要使用ISO 8601时间戳,请使用以下较短的格式:

-Djava.util.logging.SimpleFormatter.format="%tFT%<tT.%<tL %4$4.4s %3$s %5$s %n"

输出:

2015-10-03T19:37:03.703 INFO org.apache.coyote.http11.Http11Protocol Starting ProtocolHandler ["http-bio-8080"] 
2015-10-03T19:37:03.703 INFO org.apache.coyote.ajp.AjpProtocol Starting ProtocolHandler ["ajp-bio-8009"] 
2015-10-03T19:37:03.703 INFO org.apache.catalina.startup.Catalina Server startup in 1189 ms 

1
感谢您进行了额外的调查并提供了工单链接。 JUL仍然很讨厌。但有一个建议:最好使用以下格式:%tFT%<tT.%<tL...这样更容易阅读,而且您将免费获得ISO 8601。 - Michael-O
我其实喜欢我的时间戳那样,但我知道这有点古怪 :) 包括你的版本在上面! - zb226
1
猜猜看?我刚刚试图将该属性传递给Tomcat,无论是在setenv.shcatalina.sh中,还是直接在catalina.sh的Java命令中,我都无法正确转义属性值中的空格。这个JUL让我发疯了,我已经浪费了两个小时来完成这个糟糕的任务,但没有任何结果。我将评估:https://github.com/grgrzybek/tomcat-slf4j-logback - Michael-O
1
这是一个后续问题:https://dev59.com/SGgu5IYBdhLWcg3wdG2o - Michael-O
2个回答

2

你可能遭受了Java 7中的这种变化的影响。

我唯一看到的解决方案是为ISO 8601制定一个自定义格式化程序。


谢谢,这绝对是根本原因!回到Java 6(但这个项目我做不到)它又可以工作了。我仍在寻找解决方案的过程中... - zb226
@zb226,我也很生气。我唯一看到的解决方案是使用ISO 8601的自定义格式化程序。为什么不向Tomcat发出错误报告,以便默认情况下在日志输出中使用ISO 8601? - Michael-O
我可能会这样做,但我需要先完全理解。它怎么可能仍然可以从命令行工作?这让我觉得是Eclipse的问题,而不是Tomcat的问题。 - zb226
1
@zb226 你可以设置-Dsun.locale.formatasdefault=true来恢复先前的设置。请注意,Eclipse会分叉VM并传递可能与命令行不同的其他属性。 - Michael-O
1
当然,我也尝试过这个。但是都不起作用。请查看我的更新,其中提供了一条新的信息,说明为什么目前无法实现。 - zb226
显示剩余2条评论

1
希望您需要更改中的日期格式。请按以下方式修改您的。
对于:
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
org.apache.juli.OneLineFormatter.timeFormat = yyyy-MM-dd HH:mm:ss

对于java.util.logging.SimpleFormatter,如下:
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format = "%4$s: %5$s [%1$tc]%n"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接