我过去通过使用 SLF4J JUL 桥将 glassfish 3 配置为使用 SLF4J,它运行良好。我现在遇到的问题是,如果我使用相同的设置,SLF4J 会抱怨类路径上有重复的 SLF4J 绑定,并且在搜索之后,glassfish 本身包含这些引用。
如何让 SLF4J 工作?我尝试依赖提供的 SLF4J-API,然后删除了 LogBack Classic,因为 glassfish 已经包含一些 logback 代码。做这些事情不会产生任何成功的结果。
沃尔特
我过去通过使用 SLF4J JUL 桥将 glassfish 3 配置为使用 SLF4J,它运行良好。我现在遇到的问题是,如果我使用相同的设置,SLF4J 会抱怨类路径上有重复的 SLF4J 绑定,并且在搜索之后,glassfish 本身包含这些引用。
如何让 SLF4J 工作?我尝试依赖提供的 SLF4J-API,然后删除了 LogBack Classic,因为 glassfish 已经包含一些 logback 代码。做这些事情不会产生任何成功的结果。
沃尔特
这可能会帮助你
停止 gf4
$GF_INSTALL\bin>asadmin stop-domain
接着
复制
- 七月到 slf4j-1.7.5
- slf4j-api-1.7.5
- logback-core-1.0.13
- logback-经典-1.0.13
至
$GF_INSTALL/glassfish/lib/认可
在中创建 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 选项添加到
域->配置->配置->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 启动域
如果其他人在配置时遇到问题ch.qos.logback.core.rolling.RollingFileAppender
,我可能会为您提供解决方案。
问题是,按照@vzamanillo 的说明,logback 本身被初始化了两次。这是由 GlassFish 的类加载器隔离引起的(一次由主 ClassLoader,一次由 EAR ClassLoader)。如果你用 .config 配置 logback,它就会变得可见debug=true
。如果RollingFileAppender
现在使用 a,则在同一个配置的日志文件上打开了两个 OutputStream。这可以防止在翻转期间删除日志文件(在调试模式下可见)。
为了解决这个问题,我将库/modules/endorsed
从 /domains/domain1/lib/ext
. 现在 GlassFish 4 (concrete Payara) 只初始化一次 logback,一切都按预期工作。
顺便说一句:要替换 JUL 日志记录,<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator" />
必须指定,否则您将面临很大的性能问题。
要将潜在的 3rd 方库的日志也发送到 SLF4j,请不要忘记安装调度程序 jar,即: