【问题标题】:Modifying java.util.logging.SimpleFormatter format property under Tomcat修改Tomcat下的java.util.logging.SimpleFormatter格式属性
【发布时间】:2012-07-03 18:00:36
【问题描述】:

我正在使用 Tomcat 7.0.28,在 Ubuntu 上的 OpenJDK 1.7 下运行,并且正在尝试修改 java.util.logging.SimpleFormatter 使用的格式化字符串。根据该类的 Javadocs,我可以指定属性 java.util.logging.SimpleFormatter.format 来更改格式。事实上,当我在 Eclipse 中运行我的 webapp 并在我的 logging.properties 文件中更改此属性时,它可以工作。

但是,当我将应用程序部署到 Tomcat 时,此属性似乎没有任何作用。我确信我的属性文件被正确读取,因为我对其所做的其他更改确实生效(我正在使用

从文件中读取属性
LogManager.getLogManager().readConfiguration(new FileInputStream(file))

其中文件是通过我的 web.xml 文件中的参数配置的。我尝试将文件放在 WEB-INF/classes/logging.properties 中,但行为没有改变。

SimpleFormatter 的 Javadocs 指定如果属性文件和系统属性都指定格式字符串,则系统属性优先。我已经验证系统属性没有设置

context.log ("Formatting system property is " + System.getProperty("java.util.logging.SimpleFormatter.format"));

在 ServletContextListener.contextInitialized 方法中。

这是我的完整日志记录属性文件

handlers=java.util.logging.ConsoleHandler

#  Default logging level for root logger
.level=FINE

#  Set the level for the ConsoleHandler
java.util.logging.ConsoleHandler.level=FINE
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=[%1$tF %1$tr] %3$s %4$s:  %5$s %n

我已经尝试了所有我能想到的方法,包括修改 TOMCAT/conf 和 JRE_HOME/lib 目录中的 logging.properties。似乎没有任何区别。

【问题讨论】:

  • 面临同样的问题。这里有一个猜测:java.util.logging.SimpleFormatter.format 属性特性是在 Java 7 中引入的。我知道 Tomcat 基本上使用了 java.util.logging 的略微修改版本。不知道是不是这个原因。
  • 是的 nolan6000,我遇到了同样的问题,这与我使用的 JDK 版本有关。谢谢。

标签: tomcat java.util.logging


【解决方案1】:

不知道这是否能解决您的问题,但可能值得一试。我看到了相同的行为,尽管在我的情况下,我是以编程方式进行日志设置而不是使用属性。事实证明,java.util.logging.SimpleFormatter.format 的属性值需要在构造(在我的情况下)FileHandler 之前设置。我在构造 FileHandler 之后设置它,但在构造 SimpleFormatter 之前。我想知道,在您的属性文件中,在定义任何 Handler 属性之前定义 java.util.logging.SimpleFormatter.format 是否会解决问题。

【讨论】:

    【解决方案2】:

    java.util.logging.SimpleFormatter.format 确实被记录为可在 logging.properties 中设置 - 这对我也不起作用 - 或作为命令行参数(java 选项)。

    命令行参数似乎对我有用。因为 $JAVA_OPTS 变量经历了如此多的篡改并最终进入 eval,这就是我解决它的方法(在 Debian,java 1.7.0_07,apache-tomcat-7.0.30)

    $CATALINA_HOME/bin/catalina.sh(第 230 行):

    JAVA_OPTS="$JAVA_OPTS \"-Djava.util.logging.SimpleFormatter.format=%1\\\$tY-%1\\\$tm-%1\\\$td %1\\\$tH:%1\\\$tM:%1\\\$tS.%1\\\$tL %4\\\$s %3\\\$s %5\\\$s%6\\\$s%n\""
    

    【讨论】:

      【解决方案3】:

      您可能正在目睹this bug

      该错误已从 Tomcat 7.0.41 及 6.0.38 及以上版本修复。

      【讨论】:

        【解决方案4】:

        感谢 nolan6000 指出的the bug report 中的信息,我终于可以与 tomcat-juli 一起使用了。

        代替:

        java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
        

        必须是:

        1catalina.java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
        

        【讨论】:

        【解决方案5】:

        在默认的 Tomcat 8 JULI 记录器中使用格式化程序模式需要这个,您可以将参数放入全局 $tomcat/conf/logging.properties 或 webapp 特定的 $tomcat/webapps/myapp/WEB-INF/classes/logging.properties 文件。

        这是我的全局文件,其中还禁用了 manager-webapp 日志文件。日志线路为:
        2015-09-23 17:32:11 INFO org.apache.catalina.startup.Catalina Server startup in 1028 ms

        #handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
        handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
        
        .handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
        
        # formatter attributes = date, source, logger, level, message, thrown
        java.util.logging.SimpleFormatter.format = %1$tF %1$tT %4$s %3$s %5$s%6$s%n
        
        1catalina.org.apache.juli.AsyncFileHandler.level = FINE
        1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
        1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
        1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8
        1catalina.org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter
        #1catalina.org.apache.juli.AsyncFileHandler.bufferSize = 2048
        
        2localhost.org.apache.juli.AsyncFileHandler.level = FINE
        2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
        2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
        2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8
        2localhost.org.apache.juli.AsyncFileHandler.formatter = java.util.logging.SimpleFormatter
        #2localhost.org.apache.juli.AsyncFileHandler.bufferSize = 2048
        
        #3manager.org.apache.juli.AsyncFileHandler.level = FINE
        #3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
        #3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
        
        #4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
        #4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
        #4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
        
        java.util.logging.ConsoleHandler.level = FINE
        #java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
        java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
        
        
        ############################################################
        # Facility specific properties.
        # Provides extra control for each logger.
        ############################################################
        
        org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
        org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler
        
        #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
        #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler
        
        #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
        #org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler
        
        # For example, set the org.apache.catalina.util.LifecycleBase logger to log
        # each component that extends LifecycleBase changing state:
        #org.apache.catalina.util.LifecycleBase.level = FINE
        
        # To see debug messages in TldLocationsCache, uncomment the following lines
        #org.apache.jasper.compiler.TldLocationsCache.level = FINE
        #org.apache.jasper.servlet.TldScanner.level=FINE
        

        【讨论】:

        • 它似乎在全局文件中对我有用,但是当我在 web-app 特定文件中指定格式时,它似乎不起作用
        • 谢谢@Whome!它适用于我,但仅适用于 java.util.logging.SimpleFormatter。使用 org.apache.juli.OneLineFormatter 不会:(
        猜你喜欢
        • 2011-02-20
        • 1970-01-01
        • 2019-11-05
        • 2018-07-28
        • 1970-01-01
        • 2021-11-25
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多