不能让SLF4J使用glassfish 4

时间:2013-12-06 18:13:17

标签: slf4j glassfish-4 glassfish-embedded

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

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

沃尔特

2 个答案:

答案 0 :(得分:6)

这可能有助于你

下载Glassfish 4SLF4JLogback

停止gf4

$GF_INSTALL\bin>asadmin stop-domain

然后

复制

  
      
  • 七月到SLF4J-1.7.5
  •   
  • SLF4J-API-1.7.5
  •   
  • 的logback核-1.0.13
  •   
  • 的logback经典-1.0.13
  •   

  

$ GF_INSTALL /的glassfish / LIB /认可

中创建logback.xml
  

$ GF_INSTALL /的glassfish /域/域1 /配置

<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 /域/域1 /配置/ 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选项添加到

  

结构域&GT; configs-&GT; config-&GT; java的配置

in

  

$ GF_INSTALL /的glassfish /域/域1 /配置/ 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&gt; asadmin start-domain

答案 1 :(得分:1)

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

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

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

顺便说一句:要替换JUL日志记录,指定<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator" />是必须的,否则您将面临严重的性能问题。

为了将潜在的第三方库的记录发送到SLF4j,也不要忘记安装调度员罐,即:。

  • JCL-过slf4j.jar
  • 七月到slf4j.jar
  • 的log4j-过slf4j.jar