Jakarta ee 回写+;SLF4J不登录JavaEE 7应用程序

Jakarta ee 回写+;SLF4J不登录JavaEE 7应用程序,jakarta-ee,wildfly,logback,slf4j,payara,Jakarta Ee,Wildfly,Logback,Slf4j,Payara,我正在构建一个简单的应用程序,现在我正面临javaee应用程序上的“日志噩梦”。我已经做了几天的搜索,数百次的更改/测试,但是没有办法让它运行。 我的应用程序是由一个简单的 EAR +-- /lib | +-- slf4j-api-1.7.25.jar | +-- logback-classic-1.2.3.jar | +-- logback-core-1.2.3.jar | +-- JAR (JPA/EJB/Producers/I

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

  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
lib被加载到EAR文件的lib目录中。
EJB项目中的mypom.xml包含以下依赖项:

<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>
这是一个使用它的EJB:

@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;
    }
}
记录器和记录器工厂的软件包是org.slf4j
试图移动每个文件夹/包下的logback.xml…什么都没有。输出总是相同的:

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应用程序的日志记录需要从头开始进行彻底的重新设计:appserver应该提供一个“插件”机制,比如数据源,它可以减少与配置、类加载、库冲突等相关的所有问题


在NetBeans 8.2 maven javaee7原型项目上运行,Payara 5.182下的Java 1.8172。

您遇到了资源可见性问题

EAR/lib目录中的JAR无法在EJB JAR或WAR文件中看到类或资源。您的配置当前似乎位于EJB模块中。因此,EAR/lib目录中的log-back类无法看到配置文件

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

有关EAR文件中资源和类的可见性的更多信息,请参见我对的回答


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

谢谢您的帮助!将logback库移动到另一个JAR中并包含到项目中。启动它时,它会查看EBJJAR文件(在Payara的日志中看到一条消息)。所以我只是将logback.xml文件移动到ejb jar的META-INF中,瞧,它启动了!
@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;
    }
}
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()]