【问题标题】:EJB SLF4J with log4j - No appenders could be found带有 log4j 的 EJB SLF4J - 找不到附加程序
【发布时间】:2017-06-09 18:27:51
【问题描述】:

我正在尝试在 EJB 内的 Bean 中使用 SLF4J 和 log4j,我已经尝试将 log4j.properties 文件放在很多地方,但我在 Glassfish Server 控制台中不断收到此错误:

Grave:   log4j:WARN No appenders could be found for logger (uy.ort.enviosya.cadets.services.CadetsBean).
Grave:   log4j:WARN Please initialize the log4j system properly.
Grave:   log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info

这是我的属性文件:

# LOG4J configuration
log4j.rootLogger=DEBUG, Appender1,Appender2

log4j.appender.Appender1=org.apache.log4j.ConsoleAppender
log4j.appender.Appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender1.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n

log4j.appender.Appender2=org.apache.log4j.FileAppender
log4j.appender.Appender2.File=C:/Users/Log4jWebDemo.log
log4j.appender.Appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.Appender2.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n

与这个问题相关的问题说我应该把它放在类路径中,但老实说我不知道​​他们的意思(对 EJB 来说完全是新的)。

这就是我在 bean 中所做的:

@Stateless
public class SomeBean implements SomeBeanRemote {

    private static final Logger LOGGER = LoggerFactory.getLogger(SomeBean.class);

    @Override
    public someMethod() {
        LOGGER.info("Prueba");
        ...
    }

   ...
}

另外,我应该将文件放在 EJB 中吗?那如果我想修改Appender2的目的地呢?

我使用的是 Netbeans 8.2。

更新 1

我已将它放置在我的 ejb 的 META-INF 文件夹中,并且据我所见,它存在于我在 .ear 中部署的 Cadets-ejb.jar 的同一个文件夹中。

但我仍然遇到同样的错误。

部分文件夹结构:

Some
    build
    Some-ejb
        build
        dist
        nbproject
        src
            conf
                META-INF
            java
        test
    dist
    lib
    nbproject
    src

更新 2

我设法让它工作,但是通过手动将属性文件放置在构建文件夹中的正确位置,这意味着我每次进行干净构建时都需要这样做。

我尝试将它放在 src 文件夹中,但是当我构建它时,它没有被复制,只有 src/conf中的内容被复制,这是该文件的错误位置。

为什么src 中的文件在构建时会被忽略?

这是我现在的结构:

Some
    /build
    /Some-ejb
        /build
        /dist
        /nbproject
        /src
            /conf
                /META-INF
                   MANIFEST.MF
            /java
           /log4j.properties
        /test
    /dist
    /lib
       /log4j.jar
    /nbproject
    /src

我现在知道,一旦创建了 jar,文件就不需要与 META-INF 和我的类包处于同一级别。

解决方案

我把它放在这里解决了

Some
    /build
    /Some-ejb
        /build
        /dist
        /nbproject
        /src
            /conf
                /META-INF
                   MANIFEST.MF
            /java
                log4j.properties
        /test
    /dist
    /lib
       /log4j.jar
    /nbproject
    /src

【问题讨论】:

标签: java jakarta-ee glassfish log4j slf4j


【解决方案1】:

在我google了很多之后,我想我找到了解决方案:

用于全局配置

如果您的 log4j 库包含在您的 EAR 文件中,请检查您的应用服务器的 JVM 属性以确保设置了 log4j.configuration 属性:

  1. 登录 Glassfish 管理控制台 (http://[hostname]:4848/)
  2. 单击“服务器(管理服务器)”-> 单击“服务器配置”配置-> JVM 设置-> JVM 选项。 (取决于您的服务器版本,但重要的是 JVM 设置 > JVM 选项)
  3. 如果存在-Dlog4j.configuration 的条目,请验证它是否包含您的 log4j.properties 文件的位置
  4. 如果-Dlog4j.configuration 的条目不存在,则创建一个。它必须遵循以下模板:-Dlog4j.configuration=file:///path/to/your/log4j.properties
  5. 重新启动 GlassFish。
  6. 部署示例应用并检查 Log4J 语句现在是否可用。

如果您的项目不包含 log4j 库

  1. 将 log4j.jar 复制到 GLASSFISH_HOME/lib 中。

为了一个项目

例如,您可以具有以下结构:

Some
    /build
    /Some-ejb
        /build
        /dist
        /nbproject
        /src
            /conf
                /META-INF
                   MANIFEST.MF
            /java
        /test
    /dist
    /lib
       /log4j.jar
    /nbproject
    /src
       /log4j.properties

为了将 log4j 文件包含到您的类路径中,您必须将以下内容放入 EJB 项目的 META-INF/MANIFEST.MF

Class-Path: src lib/log4j.jar

是的:它与 EAR 相关,与 EJB 项目无关。

不要将log4j.properties 本身放在类路径中,只放在包含该文件的目录中。

【讨论】:

  • 在这种情况下,我部署到服务器的每个耳朵都将使用相同的属性,对吧?我部署了不止一个,我希望它们是独立的。
  • 我更新了我的答案,请试试这个并给我您的反馈。
  • 我试过并更新了问题,将它放在src 文件夹中,它不会在构建时复制到build 文件夹
猜你喜欢
  • 1970-01-01
  • 2013-05-19
  • 2012-09-13
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多