【问题标题】:How generate log files separated by apps running over websphere 9 ? I use java.util.logging to generate logs如何生成由在 websphere 9 上运行的应用程序分隔的日志文件?我使用 java.util.logging 生成日志
【发布时间】:2019-12-29 03:40:46
【问题描述】:

我使用 websphere 9 应用服务器来部署 war's 和 ear's,并使用 java.util.logging 将日志生成到应用程序中。我尝试使用属性文件来配置 LogManager 的 FileHandler,但 websphere 将所有其他日志写入我的文件。 我不使用 log4j,因为我无法在运行时设置日志级别。

是否可以通过 websphere 上的应用程序使用 java.util.logging 生成不同的文件日志?

This is my properties file Logger.properties

handlers= java.util.logging.FileHandler
#java.util.logging.ConsoleHandler.level = INFO
#java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# Set the default formatter to be the simple formatter
java.util.logging.FileHandler.formatter =java.util.logging.SimpleFormatter
# Use UTF-8 encoding
java.util.logging.FileHandler.encoding  = UTF-8
# Write the log files to some file pattern
java.util.logging.FileHandler.pattern = C:/Users/pmendez/Documents/Log/testLogs.log
# Limit log file size to 5 Kb
java.util.logging.FileHandler.limit = 5000
# Keep 10 log files
java.util.logging.FileHandler.count = 10
#Customize the SimpleFormatter output format 
java.util.logging.SimpleFormatter.format = %d [%t] %-5p (%F:%L) - %m%n 

【问题讨论】:

  • 请在您的问题中包含您的 logging.properties。
  • 好的,我包括这个。我位于 Websphere 的共享库中。

标签: java ejb websphere java.util.logging


【解决方案1】:

我尝试使用属性文件来配置 LogManager 的 FileHandler,但 websphere 将所有其他日志写入我的文件。

根据您的 logging.properties,您将 FileHandler 附加到根记录器。预计会看到来自 WebSphere 的日志记录,因为默认情况下 Logger::setUseParentHandlers 设置为 true。

是否可以通过 websphere 上的应用程序使用 java.util.logging 制作不同的文件日志?

您必须执行以下操作之一:

  1. 将 FileHandler 附加到应用程序的根记录器,这样 FileHandler 就不会附加到 WebSphere 应用程序的父级。假设应用程序包是com.my.app.rules,您可以添加 tocom.my.app.rules.handlers=java.util.logging.FileHandler 的条目并删除根记录器的附件。接下来,您从代码中请求记录器并将其固定到内存中,以便此包成为您的应用程序代码的新根记录器。
  2. 创建java.util.logging.Filter并将其安装在FileHandler上。

  3. 关闭 WebSphere 的日志记录。您可以通过将根记录器设置为关闭并强制所有记录器说出信息来做到这一点。

    .level=OFF com.my.app.rules.class1.level=INFO com.my.app.rules.class2.level=INFO com.my.app.rules.class3.level=INFO

可以通过app设置一个FileHandler吗?

默认java.util.logging.LogManager 仅支持一组 FileHandler 设置。您可以将实例附加到各种记录器,但它不允许通过 logging.properties 设置具有不同设置的实例。但是,LogManager 确实支持每个文档:

属性“配置”。此属性旨在允许运行任意配置代码。该属性定义了一个空格或逗号分隔的类名列表。将为每个命名类创建一个新实例。每个类的默认构造函数可以执行任意代码来更新日志配置,例如设置日志级别、添加处理程序、添加过滤器等。

因此,您需要做的是与您的应用程序捆绑一个配置类,该类执行所需的 FileHandler 和记录器配置,并修改您的 logging.properties 以加载它。这种方法的一个问题是 LogManager 只能看到来自系统类加载器的类。

【讨论】:

  • 应用程序位于通过 Websphere 9 实现的集群上,我们实现了一个特定的 Logger 接口,每个应用程序都使用该接口来编写日志。我们需要一个应用程序的日志文件。我尝试了您的解决方案,但我无法统计引用类。可以通过 app 设置一个 FileHandler 吗?我们在 Logger 上使用如下代码: InputStream configFile = LoggerJUL.class.getResourceAsStream("/Logger.properties"); LogManager.getLogManager().readConfiguration(configFile);
  • @PabloMendez 编辑了答案。
【解决方案2】:

从 jmehrens 的回答中,您可以看到这可能有点困难。也许您应该考虑将日志记录切换到High Performance Extensible Logging (HPEL)。它只是在应用服务器中设置,所以应用程序代码没有变化。

然后您可以使用command line tool 查询给定应用程序的日志:

logViewer.sh -includeExtensions appName=PlantsByWebSphere

如果符合您的目的,这会容易得多。此外,如果您计划将来将应用程序移动到容器/云中或将它们重构为微服务,现在不建议生成单独的日志文件。

【讨论】:

    【解决方案3】:

    我对这个问题的解决方案是创建一个 PersonalFileHandler 以在所有 Logger 上使用。属性从名为“Logger.properties”的属性文件中读取,invoque 以编程方式读取此文件,如下所示:

    //Read config file
    LogManager.getLogManager().readConfiguration(LoggerJUL.class.getResourceAsStream("/Logger.properties"));
    //Add handler to logger
    Logger.getLogger(clazz)).addHandler(new PersonalFileHandler());
    

    PersonalFileHandler 扩展了 FileHandler,属性由运行时 FileHandler 类的 configure 方法设置。

    【讨论】:

    • 使用此答案的最后一段打开一个新问题。从这个答案中删除最后一段。
    • 好的。谢谢。我创建了另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多