首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Logback+SLF4J不会在JavaEE 7应用程序中记录日志

Logback+SLF4J不会在JavaEE 7应用程序中记录日志
EN

Stack Overflow用户
提问于 2018-06-08 17:14:49
回答 1查看 637关注 0票数 0

我正在构建一个简单的应用程序,现在我正面临着javaee应用程序上的“日志噩梦”。我做了几天的搜索,数以百计的更改/测试,但没有办法让它运行。我的应用程序由一个简单的

代码语言:javascript
复制
  EAR
   +-- /lib
   |     +-- slf4j-api-1.7.25.jar
   |     +-- logback-classic-1.2.3.jar
   |     +-- logback-core-1.2.3.jar
   |
   +-- JAR (JPA/EJB/Producers/Interceptors)
   |    +--src/main/resources
   |        +-- logback.xml
   |        +-- logback-test.xml
   |
   +-- WAR

库被加载到EAR文件的lib目录中。

我在EJB项目中的pom.xml包含以下依赖项:

代码语言:javascript
复制
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

还有提供的javaee-api-7.0。我将日志工具放在EJB项目中,这样我就可以在webapp中使用日志生成器,并将记录器也注入到JSF控制器中。logback.xml是这样的:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <property name="DEV_HOME" value="c:/Dev" />

    <appender name="FILE-AUDIT"
                  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${DEV_HOME}/debug.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>WE:%d{yyyy-MM-dd HH:mm:ss} - %msg%n</Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>${DEV_HOME}/archived/debug.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <logger name="it.univaq.we2018" level="DEBUG" additivity="false">
        <appender-ref ref="FILE-AUDIT" />
    </logger>

    <root level="ERROR">
        <appender-ref ref="FILE-AUDIT" />
    </root>
</configuration>

我的所有类都在it.univaq.we2018包(.service、.controllers等)下。下面是CDI生成器(这里的System.out只是为了我的目的):

代码语言:javascript
复制
@Named
@Singleton
public class LoggerProducer {
    @Produces
    public Logger produceLogger(InjectionPoint ip) {
        System.out.println("-----> construct logging for: "+ip.getMember().getDeclaringClass());
        Logger log = LoggerFactory.getLogger(ip.getMember().getDeclaringClass());
        System.out.println("-----> LogFactory is: "+log+" for "+log.getName()); 
        return log;
    }
}

这是一个使用它的EJB:

代码语言:javascript
复制
@Stateless
@LocalBean
public class SecurityService implements Serializable {
    @Inject
    Logger log;

    public boolean performSecurityCheck(String userName, String target) {        
        log.debug("Testing ["+target+"] for user ["+userName+"]...");
        return true;
    }
}

记录器和LoggerFactory的软件包是org.slf4j

已尝试将logback.xml移动到每个文件夹/包下...什么都没有。输出总是相同的:

代码语言:javascript
复制
INFORMAZIONI:   indexController.init() INFORMAZIONI:   ---- ENTER:
[it.univaq.we2018.tutor.controller.IndexController.doAction()]

INFORMAZIONI:   -----> construct logging for: class
it.univaq.we2018.tutor.service.SecurityService

INFORMAZIONI:   -----> LogFactory is: 
Logger[it.univaq.we2018.tutor.service.SecurityService]
for it.univaq.we2018.tutor.service.SecurityService

INFORMAZIONI:  10:38:34.423 [http-thread-pool::http-listener-1(4)] DEBUG
it.univaq.we2018.tutor.service.SecurityService - Testing
[it.univaq.we2018.tutor.controller.IndexController.doAction()] for
user [null]...

INFORMAZIONI:   indexController.doAction() INFORMAZIONI:  
BaseService.businessMethod() INFORMAZIONI:   ---- EXIT: 
[it.univaq.we2018.tutor.controller.IndexController.doAction()]

日志行#4应该转到文件,但是文件从来没有打开过,日志的格式与配置不一致(应该以WE:前缀开头,并且有不同的模式)。我不知道该怎么解决这个问题。我一直认为JavaEE应用程序的日志记录需要从头开始重新设计:应用程序服务器应该提供一个类似于数据源的“插件”机制,以减少所有这些与配置、类加载、库冲突等相关的问题。

运行在Java8.2Maven javaee7原型项目上,NetBeans 1.8_172下的Payara 5.182。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 08:43:34

您有一个资源可见性问题。

EAR/lib目录中的WAR不能看到EJB WAR或WAR文件中的类或资源。您的配置当前似乎在EJB模块中。因此,EAR/lib目录中的日志回退类看不到配置文件。

如果必须将日志配置打包,则需要将其放在EAR/lib目录中的jar中,才能找到它。

有关EAR文件中资源和类的可见性的更多信息,可以在我对My ear is not able to find ejb module classes的回答中找到。

就我个人而言,我更喜欢将日志配置外部化。在回滚的情况下,可以使用-Dlogback.configurationFile=/path/to/config.xml环境变量指定配置文件的路径。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50757241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档