java - 如何从 jboss 模块内使用 slf4j 进行日志记录?

标签 java jboss wildfly slf4j jboss-modules

如何从 jboss 模块内登录到 console/server.log?

假设我有一个类:

public class MyClass {

    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);

    private boolean done = false;

    public void doSomething() {
        logger.info("Look ma, I'm logging!");
        done = true;
    }

    public boolean isDone() {
        return done;
    }
}

如果我想从已部署的工件(例如 MyWebProject.war)登录,我所要做的就是:

  1. 针对 slf4j-api 进行编译

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.7</version>
        <scope>provided</scope>
    </dependency>
    
  2. 部署

    ./jboss-cli.sh -c "deploy  MyWebProject.war"
    
  3. 利润

    2015-10-19 11:04:02,445 INFO  [com.myCompany.MyClass] (default task-13) Look ma, I'm logging!
    
<小时/>

但是在我的一生中,我无法在 jboss 模块中做同样的事情。

示例:如果 MyWebProject.war 使用 MyModule.jar,并且 MyModule.jar 部署为jboss模块:

${jbossHome}/modules/com/mycompany/mymodule/main
                                            |____ MyModule.jar
                                            |____ module.xml

模块.xml

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.mycompany.mymodule">
  <resources>
    <resource-root path="MyModule.jar" />
  </resources>
  <dependencies>
    <module name="org.slf4j" />
  </dependencies>
</module>

如果我将 MyClass 移动到 MyModule.jar 并从 MyWebProject.war 使用它,我可以看到副作用(例如,isDone() == true),但没有任何内容写入 server.log

我错过了什么?除了 slf4j 之外,我还需要任何其他模块依赖项吗?

最佳答案

为了进一步引用,我的问题与日志记录无关。上面的食谱按预期工作。事实上,我因为一个转移注意力的问题而遭受了痛苦:我原来的 module.xml 从未真正使用过。我实际上是在另一个模块中加载一个同名的旧类。该类的旧版本没有日志记录,因此一开始就不应该存在。

无论如何,我认为我的问题的根本原因(除了我缺乏关注之外)是jboss-cli中的一个小错误。

我使用以下命令部署mymodule:

module add --name=com.mycompany.mymodule \
            --resources=MyModule.jar \
            --dependencies=org.slf4j \
            --main-class=com.mycompany.mymodule.Main 

此命令生成一个 module.xml,如下所示:

<?xml version="1.0" ?>

<module xmlns="urn:jboss:module:1.1" name="com.mycompany.mymodule">

    <main-class value="com.mycompany.mymodule.Main"/>

    <resources>
        <resource-root path="MyModule.jar"/>
    </resources>

    <dependencies>
        <module name="org.slf4j"/>
    </dependencies>
</module>

当我最终设法让我的 Web 项目尝试加载 mymodule 时,它失败了,堆栈跟踪如下:

18:45:59,999 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-7) MSC000001: Failed to start service jboss.module.service."deployment.MyWebProject.war".main: org.jboss.msc.service.StartException in service jboss.module.service."deployment.MyWebProject.war".main: WFLYSRV0179: Failed to load module: deployment.MyWebProject.war.war:main
    at org.jboss.as.server.moduleservice.ModuleLoadService.start(ModuleLoadService.java:91)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.jboss.modules.ModuleLoadException: Error loading module from C:\opt\server\wildfly-9.0.1.Final\modules\com\mycompany\mymodule\main\module.xml
    at org.jboss.modules.ModuleXmlParser.parseModuleXml(ModuleXmlParser.java:150)
    at org.jboss.modules.ModuleXmlParser.parseModuleXml(ModuleXmlParser.java:127)
    at org.jboss.modules.LocalModuleFinder$1.run(LocalModuleFinder.java:150)
    at org.jboss.modules.LocalModuleFinder$1.run(LocalModuleFinder.java:144)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.jboss.modules.LocalModuleFinder.findModule(LocalModuleFinder.java:144)
    at org.jboss.modules.ModuleLoader.findModule(ModuleLoader.java:452)
    at org.jboss.modules.ModuleLoader.loadModuleLocal(ModuleLoader.java:355)
    at org.jboss.modules.ModuleLoader.preloadModule(ModuleLoader.java:302)
    at org.jboss.modules.ModuleLoader.preloadExportedModule(ModuleLoader.java:313)
    at org.jboss.modules.ModuleLoader.preloadModule(ModuleLoader.java:326)
    at org.jboss.as.server.moduleservice.ServiceModuleLoader.preloadModule(ServiceModuleLoader.java:149)
    at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:234)
    at org.jboss.as.server.moduleservice.ModuleLoadService.start(ModuleLoadService.java:74)
    ... 5 more
Caused by: org.jboss.modules.xml.XmlPullParserException: Unexpected content of type 'element start' named 'main-class', text is: '<main-class value="com.mycompany.mymodule.Main"/>' (position: START_TAG seen ...n-class value="com.mycompany.mymodule.Main"/>... @5:54) 
    at org.jboss.modules.ModuleXmlParser.unexpectedContent(ModuleXmlParser.java:179)
    at org.jboss.modules.ModuleXmlParser.parseMainClass(ModuleXmlParser.java:620)
    at org.jboss.modules.ModuleXmlParser.parseModuleContents(ModuleXmlParser.java:445)
    at org.jboss.modules.ModuleXmlParser.parseDocument(ModuleXmlParser.java:261)
    at org.jboss.modules.ModuleXmlParser.parseModuleXml(ModuleXmlParser.java:148)
    ... 18 more

查看 module-1_1.xsd 我发现 main-class 元素需要 name 属性value 属性。所以我手动将 module.xml 更改为:

<main-class name="com.mycompany.mymodule.Main"/>

在我重新启动 WildFly 并重新部署我的网络项目后,一切都按预期工作。

关于java - 如何从 jboss 模块内使用 slf4j 进行日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33223088/

相关文章:

jboss - Wildfly 10 - 域模式下的身份验证失败

java - 我正在尝试采用 SEAM 2.3 项目并将其部署在 Jboss-WildFly 8.x 上

java - Weld -001409 : Ambiguous dependencies for type DataProvider with qualifiers @Default

java - Java 中具有 3 个子节点的树的迭代器实现

Java 正则表达式匹配任何与给定模式匹配且不在给定字符之间的内容

java - 如何减少java堆大小?

java - 如何在 Intellij IDEA 中正确配置 JBoss?我收到错误 :server instance not specified

java - Keycloak Quickstarts 在部署 Wildfly 中不起作用

java - 安卓Java : Receive Image over Socket

java - 为什么我的队列对输入字符串的排序与先进先出的基础不同?