log4j - WebLogic 12C 集中式 Log4J 或 Logback 配置

标签 log4j weblogic slf4j logback syslog

我想配置一个集中登录到 WebLogic 12C。根据业务需求,我必须在生产环境中使用 Syslog,并且我必须在开发和测试环境中提供自定义(例如文件、控制台日志)。我只想为域中的每个应用程序处理 1 个集中日志配置。这些应用程序使用 SLF4J API。在 Glassfish 3.1 和 WebLogic 10.3.5 中,当我将 Logback 或 Log4J 桥及其实现放入域库中并进行配置时,它们运行良好。但是在 WebLogic 12C 中我遇到了很多问题。主要问题是 WL 已经包含模块之间的 SLF4J 绑定(bind)(我不想修改 WL,或者我应该吗?)。因此,当我放置第二个绑定(bind)时,SLF4J 无法初始化它/它们并使用默认的 JUL 记录器。我还尝试通过 WL 管理控制台配置 Log4J 记录器,但只有服务器消息进入 Log4J 记录器,应用程序的消息仍然进入 JUL。 ( http://docs.oracle.com/cd/E24329_01/web.1211/e24428/config_logs.htm#i1011558 , https://forums.oracle.com/forums/thread.jspa?threadID=1037672 )

那么我如何才能在 WebLogic12C 域中仅维护 1 个 Log4J 或 Logback(或满足上述要求的任何其他解决方案)配置?

感谢您的帮助!

最佳答案

如果你想使用 SLF4J 和 Logback,这里有一些说明:

您必须将您希望与您的应用程序一起使用的 SLF4J 和 Logback 工件捆绑在一起(这是我找到的唯一可行的解​​决方案!我知道通常不会捆绑 SLF4J 绑定(bind)!)。还要在您的 WAR 项目中捆绑一个 weblogic.xml(WebLogic 特定的 web.xml),并在您的 EAR 项目中捆绑 weblogic-application.xml(WebLogic 特定的 application.xml)(如果您同时使用两者,则选择匹配的一个) .同样,EAR 和 WAR 都必须提供以下工件:

  • slf4j-api
  • logback 核心
  • 经典的logback

那些xml文件的内容:

weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app
    xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
    http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">

    <!-- GERMAN: http://www.torsten-horn.de/techdocs/jee-oracleweblogic.htm -->
    <wls:container-descriptor>
        <wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
    </wls:container-descriptor>
</wls:weblogic-web-app>

weblogic-application.xml

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90">

    <!-- GERMAN: http://www.torsten-horn.de/techdocs/jee-oracleweblogic.htm -->
    <prefer-application-packages>
        <package-name>org.slf4j.*</package-name>
        <package-name>org.apache.commons.logging.*</package-name>
    </prefer-application-packages>

    <prefer-application-resources>
        <resource-name>org/slf4j/impl/StaticLoggerBinder.class</resource-name>
    </prefer-application-resources>

</weblogic-application>

通过这些 xml 文件,您告诉 WebLogic 更喜欢捆绑版本而不是 WebLogic 附带的版本 (WAR)。对于 EAR,这可以在每个包/资源的基础上完成。更准确地说,类加载器的顺序针对指定的包进行了更改。

虽然仅将 SLF4J 和 Logback jar 与 EAR 或 WAR 捆绑在一起会让您出错或根本没有日志记录,但在将工件捆绑在两者中时您也会收到警告。如果有人有改进的想法,请随时发表评论!

据我了解,EAR 和 WAR 文件在 WebLogic 中具有不同的类加载器,即使 WAR 与 EAR 捆绑在一起也是如此。这就是为什么你不能在他们之间共享这个库,对吗?

配置回退: 为了能够在运行时更改 logback 配置,您必须将 logback.xml 放置在 WebLogic 类路径中的某个位置。我找到了很多网站,告诉我 WebLogic 从域目录加载资源文件,但在我的例子中它不在类路径中,所以我不得不通过服务器启动脚本将它添加到全局类路径(这会影响每个域的登录设置!)。 同样,欢迎任何改进!

关于log4j - WebLogic 12C 集中式 Log4J 或 Logback 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15013427/

相关文章:

java - 如何使用Log4j为jsp页面创建日志文件

node.js - Angularjs 应用程序托管在 J2EE 服务器上而不是 Node.js 服务器上

java - logback 每个记录器配置不起作用

logging - 如何为 grails 插件配置日志记录?

java - 如何将 log4j 日志记录集成到我的客户端-服务器程序中?

tomcat - 在 Tomcat 7 中使用 Log4j 进行应用程序日志记录

docker - Ansible Docker:使用容器执行外壳文件

java - 如何调试部署在Weblogic上的EJB

java - 如何向 OSGI Bundle (Eclipse-Plugin) 提供 log4j.properties?

Java:sl4j 如何记录所有类?