cannot get SLF4J working with glassfish 4

柔情痞子 提交于 2019-11-28 06:31:28

This may helps you

Download Glassfish 4, SLF4J and Logback

Stop gf4

$GF_INSTALL\bin>asadmin stop-domain

and then

Copy

  • jul-to-slf4j-1.7.5
  • slf4j-api-1.7.5
  • logback-core-1.0.13
  • logback-classic-1.0.13

to

$GF_INSTALL/glassfish/lib/endorsed

Create logback.xml in

$GF_INSTALL/glassfish/domains/domain1/config

containing

<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>

Modify

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

and replace

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

with

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

Add this two new JVM options to

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

in

$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>

then start gf4 again

$GF_INSTALL\bin>asadmin start-domain

If someone else having trouble with configured ch.qos.logback.core.rolling.RollingFileAppender, i might have a solution for you.

The problem is, that following the instructions of @vzamanillo, logback itself is initialized twice. This is caused by classloader isolation of GlassFish (one time by main ClassLoader, one time by EAR ClassLoader). It becomes visible, if u configure logback with debug=true. If a RollingFileAppender is used now, two OutputStreams were opened on the same configured logfile. This prevents the logfile to be removed during rollover (visible in debug mode).

To fix this issue, i moved the libraries from /modules/endorsed to /domains/domain1/lib/ext. Now GlassFish 4 (concrete Payara) initializes logback only once and everything works as expected.

By the way: to replace JUL logging, specifying <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator" /> is a MUST, otherwise you are facing big performance issues.

To dispatch also the loggings of potential 3rd party libs to SLF4j, don't forget to install the dispatcher jars as well, which are i.e.:

  • jcl-over-slf4j.jar
  • jul-to-slf4j.jar
  • log4j-over-slf4j.jar
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!