有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有log4j的java EJB SLF4J找不到追加器

我试图在EJB中的Bean中使用SLF4J和log4j,我已经尝试过放置log4j。属性文件在相当多的地方,但我在Glassfish服务器控制台中不断遇到此错误:

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

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

我试着将它放在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

共 (1) 个答案

  1. # 1 楼答案

    在我搜索了很多之后,我想我找到了一个解决方案:

    用于全局配置

    如果您的日志4j库包含在EAR文件中,那么请检查应用程序服务器的JVM属性,以确保日志4j正确。已设置配置属性:

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

    如果您的项目不包含log4j库

    1. 复制log4j。玻璃鱼_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本身放在类路径中,只放在包含该文件的目录中