【问题标题】:cannot get SLF4J working with glassfish 4无法让 SLF4J 与 glassfish 4 一起工作
【发布时间】:2013-12-06 18:13:16
【问题描述】:

我过去通过使用 SLF4J JUL 桥将 glassfish 3 配置为使用 SLF4J,它工作正常。我现在遇到的问题是,如果我使用相同的设置,SLF4J 会抱怨类路径上有重复的 SLF4J 绑定,并且在搜索之后,glassfish 本身包含这些引用。

如何让 SLF4J 工作?我尝试依赖提供的 SLF4J-API,然后删除了 LogBack Classic,因为 glassfish 已经包含一些 logback 代码。做这些事情不会产生任何成功的结果。

沃尔特

【问题讨论】:

  • 您能否添加一些有关您收到的错误消息的详细信息?
  • 当我将 glassfish 配置为使用 SLF4J 时,我的所有消息基本上都消失了,没有错误。

标签: slf4j glassfish-4 glassfish-embedded


【解决方案1】:

这可能对你有帮助

下载Glassfish 4SLF4JLogback

停止 gf4

$GF_INSTALL\bin>asadmin stop-domain

然后

复制

  • 7 月到 slf4j-1.7.5
  • slf4j-api-1.7.5
  • logback-core-1.0.13
  • logback-classic-1.0.13

$GF_INSTALL/glassfish/lib/endorsed

中创建logback.xml

$GF_INSTALL/glassfish/domains/domain1/config

包含

<configuration debug="true" scan="true">
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>/tmp/gf_server.log</file>
        <append>true</append>
        <encoder>
            <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{52} - %msg%n</Pattern>
        </encoder>
    </appender>
    <root>
        <level value="INFO"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

修改

$GF_INSTALL/glassfish/domains/domain1/config/logging.properties

替换

handlers=java.util.logging.ConsoleHandler
handlerServices=com.sun.enterprise.server.logging.GFFileHandler
java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.file=${com.sun.aas.instanceRoot}/logs/server.log
com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0
com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1
java.util.logging.FileHandler.limit=50000
com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false
com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000
com.sun.enterprise.server.logging.GFFileHandler.excludeFields=
com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true
com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false
java.util.logging.FileHandler.count=1
com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0
log4j.logger.org.hibernate.validator.util.Version=warn
com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0
com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false
java.util.logging.FileHandler.pattern=%h/java%u.log
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter

handlers=org.slf4j.bridge.SLF4JBridgeHandler
handlerServices=com.sun.enterprise.server.logging.GFFileHandler
java.util.logging.ConsoleHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.ODLLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.file=/tmp/server.log
com.sun.enterprise.server.logging.GFFileHandler.rotationTimelimitInMinutes=0
com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1
java.util.logging.FileHandler.limit=50000
com.sun.enterprise.server.logging.GFFileHandler.logtoConsole=false
com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000
com.sun.enterprise.server.logging.GFFileHandler.excludeFields=
com.sun.enterprise.server.logging.GFFileHandler.multiLineMode=true
com.sun.enterprise.server.logging.SyslogHandler.useSystemLogging=false
java.util.logging.FileHandler.count=1
com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0
log4j.logger.org.hibernate.validator.util.Version=warn
com.sun.enterprise.server.logging.GFFileHandler.maxHistoryFiles=0
com.sun.enterprise.server.logging.GFFileHandler.rotationOnDateChange=false
java.util.logging.FileHandler.pattern=%h/java%u.log
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.alarms=false

将这两个新的 JVM 选项添加到

domain->configs->config->java-config

$GF_INSTALL/glassfish/domains/domain1/config/domain.xml

<jvm-options>-Djava.util.logging.config.file=${com.sun.aas.instanceRoot}/config/logging.properties</jvm-options>
<jvm-options>-Dlogback.configurationFile=file:///${com.sun.aas.instanceRoot}/config/logback.xml</jvm-options>

然后重新启动 gf4

$GF_INSTALL\bin>asadmin 启动域

【讨论】:

  • 其中一部分看起来与我已经做过的类似,我希望在接下来的 2 天内尝试这个并报告回来。谢谢,
  • 不客气,沃尔特,它在干净的 gf4 中按预期工作。
  • 乍一看,它似乎在工作;但是,我只尝试了其中的一个子集:我已经拥有的重要的一个(SLF4JBridgeHandler),我将 java.util.logging.config.file 和 logback.configurationFile 更新为本地提供的一个。我注意到,即使我的配置为根级别显示 DEBUG,它只记录 INFO 或更高级别。
  • 另外,我使用的是maven glassfish插件,所以略有不同。
  • @WalterWhite 您是否设法解决了仅记录级别为 INFO 或更高级别的问题?我在使用嵌入式 glassfish 时遇到了同样的问题。
【解决方案2】:

如果其他人在配置 ch.qos.logback.core.rolling.RollingFileAppender 时遇到问题,我可能会为您提供解决方案。

问题是,按照@vzamanillo 的说明,logback 本身被初始化了两次。这是由 GlassFish 的类加载器隔离引起的(一次由主 ClassLoader,一次由 EAR ClassLoader)。如果你使用debug=true 配置 logback,它就会变得可见。如果现在使用RollingFileAppender,则会在同一个配置的日志文件上打开两个输出流。这可以防止在翻转期间删除日志文件(在调试模式下可见)。

为了解决这个问题,我将库从 /modules/endorsed 移至 /domains/domain1/lib/ext。现在 GlassFish 4(具体 Payara)只初始化一次 logback,一切都按预期工作。

顺便说一句:要替换 JUL 日志记录,必须指定 &lt;contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator" /&gt;,否则您将面临很大的性能问题。

要将潜在的第 3 方库的日志也发送到 SLF4j,请不要忘记安装调度程序 jar,即:

  • jcl-over-slf4j.jar
  • jul-to-slf4j.jar
  • log4j-over-slf4j.jar

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 2011-05-17
    • 2020-02-29
    • 2011-04-25
    • 2014-11-22
    • 2014-05-15
    • 2010-10-16
    • 2019-11-27
    • 2017-02-12
    相关资源
    最近更新 更多