Logback + GlassFish:如何将所有内容记录到控制台,但仅将特定于应用程序的消息记录到其他日志文件

时间:2014-05-23 15:14:09

标签: logging glassfish glassfish-3 slf4j logback

我有一个部署在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");
    }
}

现在,使用此配置我有以下情况:

  • 所有日志语句都在NetBeans控制台中打印
  • 我的应用程序的日志语句记录到application.log
  • 我的应用程序中的日志语句还会记录到server.log
  • GlassFish的日志语句记录到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,并将所有日志消息发送到控制台?

0 个答案:

没有答案