我的应用程序有很多EJB。当前定制的Logger实现会创建一个这样的记录器;
private static Logger logger = Logger.getInstance(“SERVICE_NAME”);
,日志记录将进入文件;
(适用路径)/SERVICE_NAME/SERVICE_NAME.log
我想用logback复制这种行为,但是在logback.xml配置中抓住'logger'名称时遇到了麻烦。它可以在log encoder.pattern中看到,即“%d%-5level%logger {35} - %msg%n”。
任何想法如何将其转换为属性/变量然后在元素中使用它?
答案 0 :(得分:6)
我有部分解决方案。如果我创建自己的Discriminator,我可以使用logback.xml中的Discriminator来实现每个EJB的seperate-log-files。
鉴别;
public class LoggerNameBasedDiscriminator implements Discriminator<ILoggingEvent> {
private static final String KEY = "loggerName";
private boolean started;
@Override
public String getDiscriminatingValue(ILoggingEvent iLoggingEvent) {
return iLoggingEvent.getLoggerName();
}
@Override
public String getKey() {
return KEY;
}
public void start() {
started = true;
}
public void stop() {
started = false;
}
public boolean isStarted() {
return started;
}
}
然后是我的logback.xml;
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg</pattern>
</encoder>
</appender>
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator class="package.to.LoggerNameBasedDiscriminator"/>
<sift>
<appender name="FILE-${loggerName}" class="ch.qos.logback.core.FileAppender">
<FILE>path/to/logs/${loggerName}/${loggerName}.log</FILE>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %-50(%level %logger{35}) %msg%n</pattern>
</encoder>
</appender>
</sift>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="SIFT" />
</root>
</configuration>
此解决方案似乎有效,但现在我没有基于时间或大小的日志轮换!
答案 1 :(得分:1)
感谢您的示例,我为基于loggername的鉴别器实现了一个解决方案,该解析器将不同的记录器输出路由到不同的文件。虽然logback的文档很冗长,但我找不到这些重要信息。你肯定已经找到了yayitswei提到的解决方案。
logback.xml:
[...]
<timestamp key="startTimestamp" datePattern="yyyy-MM-dd"/>
<timestamp key="folderTimestamp" datePattern="MM-yyyy"/>
<property name="LOGDIR" value="/var/log/spock" />
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator class="com.enterprise.spock.LoggerNameBasedDiscriminator" />
<sift>
<appender name="FILE-${loggerName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOGDIR}/${loggerName}-${startTimestamp}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOGDIR}/${folderTimestamp}/${loggerName}-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
<maxFileSize>500KB</maxFileSize>
<maxHistory>100</maxHistory>
<totalSizeCap>50MB</totalSizeCap>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<pattern>%level %date{HH:mm:ss.SSS}: %msg %n</pattern>
</encoder>
</appender>
</sift>
</appender>
[...]
编辑: 我将SizeBndRollingPolicy替换为建议here的SizeAndTimeBasedRollingPolicy。你至少需要logback 1.1.7。
您得到的是每个Logger创建的日志文件。 每个日志文件都如下所示:/var/log/loggername-2017-08-03.log。
当向文件写入大约500KB时,它将作为gz-zip文件存档到/var/log/loggername/08-2017/loggername-2017-08-03-0.log.gz.
gz-zipfile-name末尾的0是%i
上面的<fileNamePattern>
。没有%i
它将无法正常工作。如果某些东西不起作用,请记住在logback.xml中使用<configuration debug=true>
。