【问题标题】:Weblogic 12c: separate logging for a web applicationWeblogic 12c:Web 应用程序的单独日志记录
【发布时间】:2019-01-11 08:31:29
【问题描述】:

我正在尝试让 Weblogic 12c为应用程序单独记录,而不是将所有内容都写入服务器日志。

我正在使用 java.util.logging 如下:

private static final Logger log = Logger.getLogger(ReceiveController.class.getName());
...
log.info("Initializing...");

这是我的 weblogic.xml:

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
    <context-root>mywebapp</context-root>
    <logging>
        <log-filename>mywebapp.log</log-filename>
        <logging-enabled>true</logging-enabled> <!--true/false - no difference-->
    </logging>
</weblogic-web-app>

日志文件 mywebapp.log 已创建,但日志仍会转到 AdminServer.log

我的期望: mywebapp 的日志将转到 mywebapp.log,而不是 AdminServer.log。

此外,https://docs.oracle.com/cd/E24329_01/web.1211/e21049/weblogic_xml.htm#i1063198 上显示“需要文件名的完整地址。”,但即使仅指定了文件名,也会创建文件。 mywebapp.log 是空的,即使我提供了完整路径。

更新。问题不在于按记录器名称分隔日志消息。例如,我们有两个基于 Spring Framework 的应用程序。在这两种情况下,记录器名称都以“org.springframework”之类的开头。问题是即使记录器名称相同,如何分隔消息。

例如Tomcat uses customised LogManager:

Apache Tomcat 有自己的几个关键元素的实现 java.util.logging API。这种实现称为 JULI。钥匙 组件有一个自定义的 LogManager 实现,即知道 在 Tomcat 上运行的不同 Web 应用程序(以及它们的不同 类加载器)。它支持私有的每个应用程序日志记录 配置。当 Web 应用程序运行时,Tomcat 也会通知它 从内存中卸载,以便对其类的引用可以 清除,防止内存泄漏。

【问题讨论】:

  • 我没有找到它的记录位置,但是 ServletContext.log(...) 方法记录的消息被写入应用程序日志。这是我发现的唯一方法,软件开发人员如何将内容写入此日志(在 Weblogic 14c 上尝试过)。

标签: java weblogic weblogic12c java.util.logging weblogic14c


【解决方案1】:

java.util.logging 的默认配置在 $JAVA_HOME/jre/lib/logging.properties 中。它应包含以下参数:

handlers= java.util.logging.ConsoleHandler
.level= INFO
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.xyz.foo.level = SEVERE

如果你想强制使用不同的配置文件,你必须添加启动参数

 -Djava.util.logging.config.file=<path to configuration file>

如果你想要所有的日志,你应该将 java.util.logging.ConsoleHandler.level 设置为 ALL。 com.xyz.foo 是一个虚拟记录器。您可以在配置文件中包含更多内容。 如果你想在你的代码中指向那个记录器,你应该使用类似的东西:

LogManager logManager = LogManager.getLogManager();
Logger log = logManager.getLogger("com.xyz.foo");

如果你想登录到一个文件,你应该使用 FileHandler,所以你的配置文件应该是这样的:

handlers= java.util.logging.FileHandler
java.util.logging.FileHandler.pattern=<path to your log file>
java.util.logging.FileHandler.limit=50000
java.util.logging.FileHandler.count=1
   
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
com.xyz.foo.level = FINEST

【讨论】:

  • AFAIS 它不会解决问题。问题是如何拆分部署在服务器上的不同JEE应用的日志消息。
  • 这与原来的悬赏问题不同。如果您想要多个文件用于不同的发行版,您可以以编程方式为您的记录器配置文件处理程序。在链接tabnine.com/code/java/classes/java.util.logging.FileHandler 上查看一些示例无论如何,最好的解决方案是使用 logback 或 log4j2,最新版本。
  • 一个应用程序不仅包括开发者创建的logger,还包括很多第三方库(例如Spring Framework)创建的logger。我不知道如何在不创建自己的自定义 LogManager 的情况下仅针对单个 Web 应用程序操作所有记录器。
猜你喜欢
  • 2011-10-26
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多