我有一个部署在GlassFish 3.1.1上的Web应用程序。目前的情况是所有日志语句,即GlassFish中的日志语句和我的应用程序中的日志语句都写入GlassFish的server.log
。
我需要一个用于分隔日志记录的配置,以便它记录到两个不同的文件,一个用于GlassFish(server.log
),另一个用于我的应用程序(application.log
)。
我尝试了以下内容:
我将此添加到我的domain.xml
:
<jvm-options>-Dlog4j.configuration=file:///${com.sun.aas.instanceRoot}/config/_logging.properties</jvm-options>
<jvm-options>-Dlogback.configurationFile=file:///${com.sun.aas.instanceRoot}/config/logback.xml</jvm-options>
这是我的logback.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{dd MMM yyyy HH:mm:ss.SSS} %-5p %class:%L - %m%ex</pattern>
</encoder>
</appender>
<appender name="defaultLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>application.log</file>
<encoder>
<pattern>%d{dd MMM yyyy HH:mm:ss.SSS} %-5p %F - %m%n%ex</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>application.%i{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5MB</MaxFileSize>
</triggeringPolicy>
</appender>
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="defaultLog"/>
</root>
</configuration>
这是_logging.properties
:
handlers = org.slf4j.bridge.SLF4JBridgeHandler
com.sun.enterprise.server.logging.GFFileHandler.flushFrequency=1
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.logtoConsole=true
com.sun.enterprise.server.logging.GFFileHandler.rotationLimitInBytes=2000000
com.sun.enterprise.server.logging.GFFileHandler.alarms=false
com.sun.enterprise.server.logging.GFFileHandler.formatter=com.sun.enterprise.server.logging.UniformLogFormatter
com.sun.enterprise.server.logging.GFFileHandler.retainErrorsStasticsForHours=0
GlassFish中包含的原始logging.properties
处于初始状态。
我记录这样的消息:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Stub {
private Logger logger = LoggerFactory.getLogger(Stub.class);
public void test() {
logger.info("hello");
}
}
现在,使用此配置我有以下情况:
application.log
server.log
server.log
几乎是我想要的,但这显然会产生一些冗余,并且不是目标的正确解决方案(将记录分开)。
如果我从ConsoleAppender
删除了logback.xml
,那么它看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="defaultLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>application.log</file>
<encoder>
<pattern>%d{dd MMM yyyy HH:mm:ss.SSS} %-5p %class - %m%n%ex</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>application.%i{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>5KB</MaxFileSize>
</triggeringPolicy>
</appender>
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="defaultLog"/>
</root>
</configuration>
然后我在server.log
中只有GlassFish特定的日志消息,application.log
中只有应用程序错误消息,但是应用程序日志消息没有出现在NetBeans控制台中(因为它们没有附加到控制台很明显)。
我真的不知道这是如何工作的,所以有一个问题是,为什么(部分)以这种方式工作? logback
如何知道只应将特定于应用程序的消息登录到application.log
?为什么GlassFish消息未登录application.log
?
我怀疑GlassFish以不同的方式记录他的东西?我想我必须以某种方式改变正常的GlassFish日志记录的配置,但我不知道如何。我尝试将我的应用程序包的日志级别设置为正常logging.properties
中的OFF,但这不会改变任何内容,我想这是因为日志消息看起来像这样:
[#|2014-05-23T16:43:02.948+0200|INFO|glassfish3.1.1|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=10;_ThreadName=Thread-2;|23 Mai 2014 16:43:02.947 INFO com.test.MyInitializer - [Module initialized]|#]
它看起来无法过滤消息,因为它们来自javax.enterprise.system.std.com.sun.enterprise.server.logging
,但如果我过滤此包,则日志消息不会记录在控制台中。
我的主要问题:如何解决问题,如何仅将特定于应用程序的消息记录到不同的日志文件,将所有GlassFish日志消息记录到server.log
,并将所有日志消息发送到控制台?