Jakarta ee 回写+;SLF4J不登录JavaEE 7应用程序
我正在构建一个简单的应用程序,现在我正面临javaee应用程序上的“日志噩梦”。我已经做了几天的搜索,数百次的更改/测试,但是没有办法让它运行。 我的应用程序是由一个简单的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
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()]