I have configured glassfish 3 to use SLF4J in the past by using the SLF4J JUL bridge and it worked fine. The problem I'm having now is that if I use my same setup, SLF4J complains about there being duplicate SLF4J bindings on the classpath and after searching, glassfish itself contains those reference.
How do I get SLF4J working? I tried making my dependency upon the SLF4J-API as provided, and then removed LogBack Classic since glassfish already contains some logback code. Doing those things doesn't yield any successful results.
Walter
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
来源:https://stackoverflow.com/questions/20430780/cannot-get-slf4j-working-with-glassfish-4