首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在logback高级文件命名中扩展FileAppender

在logback高级文件命名中扩展FileAppender
EN

Stack Overflow用户
提问于 2016-05-18 04:11:33
回答 1查看 2.1K关注 0票数 0

问题:

我正在从log4j转换为logback,并且我的自定义FileAppender有问题。我试图复制我的request_req#_req_type_date.log行为,FileAppender创建了一个名为FileAppender的新文件

目前,记录的数据是正确的,但是它被附加到同一个文件request.log中,而不是为每个旅行请求创建一个新的日志文件。

问题:

为了创建新的请求日志文件而不是附加到单个日志文件,我需要更改什么?

这是我的logback.xml配置:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="FORM_REQ" class="com.app.package.FormRequestAppender">
        <file>${catalina.base}/APPlogs/formrequests/request.xml</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%msg%n</Pattern>
        </encoder>  
    </appender>

    <logger name="formRequestLogger" level="DEBUG" additivity="false">
        <appender-ref ref="FORM_REQ" />
    </logger>

    <root level="INFO">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />

    </root>
</configuration>

这是我的自定义(FormRequestAppender):FileAppender

代码语言:javascript
复制
import org.apache.commons.lang3.StringUtils;


import ch.qos.logback.core.FileAppender;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.spi.*;

public class FormRequestAppender<E> extends FileAppender<E> {

    private static String path = null;


    protected void subAppend(LoggingEvent event) {
        this.closeOutputStream();
        setFileName();
        this.setFile(fileName);     
        this.subAppend(event);
    }

    private void setFileName() {
        if (fileName != null) {
            try {
                String paths[] = fileName.split("\\/");
                StringBuilder sb = new StringBuilder();
                if (path == null) {
                    for (int i = 0; i < paths.length - 1; i++) {
                        sb.append(paths[i] + "//");
                    }
                    path = sb.toString();
                } else {
                    sb.append(path);
                }
                sb.append("request");
                String reqNum = getAttribute(TRAVEL_REQUEST_NUMBER);
                String approvalStatus = getAttribute(APPROVAL_STATUS);
                String postSubmitType = getAttribute(POST_SUBMIT_APP_TYPE);
                if (!StringUtils.isEmpty(reqNum)) {
                    sb.append("_");
                    sb.append(reqNum);
                }
                if (!StringUtils.isEmpty(approvalStatus)) {
                    sb.append("_");
                    sb.append(approvalStatus);
                }
                if (!StringUtils.isEmpty(postSubmitType)) {
                    sb.append("_");
                    sb.append(postSubmitType);
                }
                sb.append("_");
                sb.append(DateTimeUtil.getDateTimeString(new Date()));
                sb.append(".xml");
                fileName = sb.toString();
            } catch (Exception e) {
                addError("An exception on FormRequestAppender.setFileName - " + e.getMessage());
            }
        }
    }

}

这是提交新请求时唯一使用它的类:

代码语言:javascript
复制
public class SubmissionService {

    private static final Logger formRequestLogger = LoggerFactory.getLogger("formRequestLogger");
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-18 04:29:32

我已经使用了这个subAppend方法(尝试使用@重写注释来确保您正在重写超类方法。在没有意图的情况下重载是可能的,如果方法没有覆盖,使用该注释您将无法编译):

代码语言:javascript
复制
@Override
protected void subAppend(E event) {
    setFileName();
    this.setFile(fileName);
    start();
    super.subAppend(event);
}

剩下的代码和你的一样。append属性不需要在logback.xml中指定。希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37290156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档