java - 如何在 EJB 模块中使用 log4j?

标签 java log4j ejb

我有一个使用 Netbeans 和 glassfish 3.1.2 的 EJB 模块。 我需要实现日志,但我不知道如何在 EJB 中配置 log4j。 我在部署时遇到了这个问题:

SEVERE: log4j:ERROR Ignoring configuration file [file:/C:/Users/Luis Carlos/AppData/Roaming/NetBeans/7.2/config/GF3/domain1/config/log4j.properties].
SEVERE: log4j:WARN No appenders could be found for logger (beans.RutasBean).
SEVERE: log4j:WARN Please initialize the log4j system properly.
SEVERE: log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

它显示在 glassfish 服务器控制台中。

这是 log4j.properties 文件:

log4j.rootLogger=DEBUG, FILE
log4j.logger.myapp=DEBUG
log4j.appender.FILE=org.apache.log4j.RollingFileAppender 
log4j.appender.FILE.File=/space/gfv3/v3setup/GlassFish3/GlassFish/domains/domain1/logs/log4j.log
log4j.appender.FILE.MaxFileSize=100KB 
log4j.appender.FILE.MaxBackupIndex=1 
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.ConversionPattern=%d{DATE} %-5p %c{1} : %m%n 

我试过了 this 它说我必须在 glassfish 的服务器管理员中像这样配置属性文件 -Dlog4j.configuration=file:///${com.sun.aas.instanceRoot}/config/log4j.properties 但没用

我有一个 Singleton Session Bean 并且在启动方法中我配置了日志,所以根据 this我在 bean 里有:

    private Logger log;
private static final String LOG4J_PROPERTIES = "/log4j.properties";

@PostConstruct
public void startup(){
    URL url = this.getClass().getResource(LOG4J_PROPERTIES);
    if(url == null || url.getFile().length() == 0) {
    throw new RuntimeException("Log4j config file "+ LOG4J_PROPERTIES +" not found");
}
    PropertyConfigurator.configure(url);
    log = Logger.getLogger(this.getClass());
    log.info("Starting application");
    em = Persistence.createEntityManagerFactory("BuscaBus-ejbPU");
    rutaController = new RutaJpaController(ut, em);
    actualizarCoordenadasRutas();
    ...
}

但还是出现同样的错误

如何在 EJB 环境中配置 log4j? 谢谢

最佳答案

执行以下操作:

  1. 从您的服务器中删除 -Dlog4j.configuration=
  2. 删除您可能已放入 C:/Users/Luis Carlos/AppData/Roaming/NetBeans/7.2/config/GF3/domain1/config 中的任何 log4j.properties >
  3. 删除以下代码:

    URL url = this.getClass().getResource(LOG4J_PROPERTIES);
    if(url == null || url.getFile().length() == 0) {
    throw new RuntimeException("Log4j config file "+ LOG4J_PROPERTIES +" not found");
    
  4. 删除这个:PropertyConfigurator.configure(url);

完成上述步骤后,您的代码就可以让 Log4J 自动从 classpath 加载其 log4j.properties 文件。根据我的经验,这是配置 Log4J 最灵活的方式。剩下您要做的就是确保 log4j.properties 确实存在于类路径中的某处。

您有以下选择:

  1. log4j.properties 文件放在 EJB 模块的默认包中。这样,log4j.properties 文件将与您的应用程序一起打包。这有利有弊,但那是另一回事(很可能属于不同的问答话题)。
  2. log4j.properties 放在文件系统的某个目录中,并将该目录添加到服务器的类路径中。按照 GlassFish 文档了解如何执行此操作。

如果您坚持要通过 URL 引用 log4j.properties 文件,请恢复 -Dlog4j.configuration= 指令。确保您提供的 URL,指定 log4j.properties 文件,实际存在。另外,指定 -Dlog4j.debug=true;这将为您提供来自 Log4J 本身的调试信息,准确地告诉您它在做什么。

关于java - 如何在 EJB 模块中使用 log4j?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13594676/

相关文章:

java - 在 Android/Java 上安全使用 glMapBufferRange()

java - Log4 使用十六进制代码记录 HTTP 响应

java - EJB 定时器和可靠性

java - 为什么 Android 套接字周期性读取如此缓慢?

java - 如何将 Java List 传递给 Scala,在 Scala 中对其进行过滤并返回给 Java?

java - 如何创建重叠的背景和前景图像?

java - Java 编译器可以避免 Log4j 参数的参数表达式求值吗

java - slf4j 依赖项破坏 log4j 配置的问题

java - 在测试 apsect 方面,EJB 3.x 相对于 EJB 2.1 有哪些优势

java - Glassfish 还是 Tomcat+OpenEJB?哪种变体更适合小型应用程序?