【问题标题】:Migrated to logback on weblogic, but is not logging迁移到 weblogic 上的 logback,但没有记录
【发布时间】:2013-08-08 22:19:01
【问题描述】:

我正在运行 POC 来查看将我们的 j2ee 应用程序迁移到 logback 的影响。 我在官方网站上花了一些时间,显然,除了新 jars 之外,唯一的变化是 logback.xml 文件。不幸的是,看起来还不够,部署工作正常,日志文件也已创建,但没有记录任何内容(空)。

我的代码有以下语句

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger log = LoggerFactory.getLogger(CustomerServiceBean.class);
log.debug("test Log Back - customer ID  " + input.getCustomerId());

pom.xml 现在有以下内容

<dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
   <version>0.9.18</version>
 </dependency>

logback.xml(使用官网的网络工具创建)

<configuration>
   <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <!--See also http://logback.qos.ch/manual/appenders.html#RollingFileAppender-->
   <File>/var/log/dcs-3/dcs3.log</File>
   <encoder>
     <pattern>%d{ABSOLUTE} %5p %c{1}:%L - %m%n</pattern>
   </encoder>
   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
     <maxIndex>1</maxIndex>
     <FileNamePattern>/var/log/dcs-3/dcs3.log.%i</FileNamePattern>
   </rollingPolicy>
   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
     <MaxFileSize>1MB</MaxFileSize>
   </triggeringPolicy>
 </appender>
 <logger name="com.lgi.dcs" level="DEBUG" />
 <root level="debug">
   <appender-ref ref="file"/>
 </root>
</configuration>

有什么想法吗? 谢谢

更新
我按照建议做了一些更改。问题仍然存在,但我能够获得更多信息。
我记录了一个错误而不是一个简单的调试。我从项目中删除了所有 log4j jar 或依赖项,并添加了 log4j-bridge。我将 logback.xml 更改为从另一篇文章中获取的更通用的内容,并在控制台上使用了除了文件之外的附加程序。

现在在我的 IDE 中,Logger 实例看起来是由 ch.qos.locback.classic.Logger 实现的。 日志文件仍然是空的,但如果我将其删除,则会在服务器启动期间重新创建。 在服务器日志上,我现在可以看到我的测试消息,例如:

SLF4J:类路径包含多个 SLF4J 绑定。 SLF4J:找到 绑定在 [zip:/opt/oracle-soa/user_projects/domains/osb/servers/AdminServer/tmp/_WL_user/dcs3-ear-3/9yhkv9/APP-INF/lib/logback-classic-0.9.18.jar!/org /slf4j/impl/StaticLoggerBinder.class] SLF4J:发现绑定 [zip:/opt/oracle-soa/user_projects/domains/osb/servers/AdminServer/tmp/_WL_user/dcs3-ear-3/9yhkv9/APP-INF/lib/logback-classic-0.9.18.jar!/org /slf4j/impl/StaticLoggerBinder.class] SLF4J:见http://www.slf4j.org/codes.html#multiple_bindings 解释。 11:40:17.902 [[ACTIVE] ExecuteThread: '12' 用于队列: 'weblogic.kernel.Default (self-tuning)'] 错误 c.l.d.s.customer.CustomerServiceBean - 测试 Log Back - 客户 ID 6107576

这或许让我想到了 weblogic 中的 log4j。

【问题讨论】:

  • 你的 logback.xml 看起来怎么样?
  • 类路径中有 logback.xml 吗?你的程序在运行时会找到它吗?
  • 我猜是的,因为文件已创建,但为空。它位于耳朵的 ejb 部分,与以前的 log4j 处于同一级别。
  • 但是在调试时我看到了记录器的 org.slf4j.impl.Log4jLoggerAdapter。
  • 您是否尝试记录与调试不同的级别?尝试在错误级别记录一些内容,看看会发生什么。这不太可能发生,但您可能会错误地将其他日志框架留在类路径上。请仔细检查 log4j、apache-logging、jboss-logging

标签: java logback


【解决方案1】:

对于 Java EE 应用程序,如果您的应用程序直接写入文件系统,则会违反规范(因为这会在多 JVM 容器上中断)。

这基本上排除了战内/入耳式记录。

考虑使用 slf4j java.util.logging 桥,让容器捕获和管理日志记录。

【讨论】:

    【解决方案2】:

    Log4jLoggerAdapter 存在于 SLF4J Log4J 包装器实现中。很可能您的类路径中有 slf4j-log4j12,因此 SLF4J 同时有 2 个日志记录后端 impl(LogBack 和 Log4J Impl)

    另一个答案是提到 log4j-over-slf4j,它用于将调用重定向到 Log4J 以使用 SLF4J,如果您使用 LogBack,则应该存在(当然,如果您希望 log4j 消息通过 SLF4J)

    【讨论】:

      【解决方案3】:

      正如您在上面提到的,记录器工厂返回 log4j 的实例而不是 logback。这意味着您在类路径上仍然有 log4j。它可以直接提供并错误地留在那里,或者它作为您正在使用的库的依赖项。如果您使用的是 maven,请尝试调查 EFFECTIVE POM 是否存在 log4j,并排除它们。否则你必须手动完成。如果您会发现该依赖项,删除它应该可以解决问题。

      您应该寻找的 jar 可能是 slf4j 桥 log4j-over-slf4jjcl-over-slf4j 也可能是相关的。

      【讨论】:

      • 我觉得你说的不对……请参考我的其他回答
      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 2019-02-03
      • 2022-06-10
      • 2022-08-05
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多