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

时间:2016-05-18 04:11:33

标签: java log4j logback

问题:

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

的新文件

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

问题:

我需要更改哪些内容才能创建新的请求日志文件而不是附加到单个日志文件?

这是我的 logback.xml 配置:

<?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>

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

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());
            }
        }
    }

}

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

public class SubmissionService {

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

1 个答案:

答案 0 :(得分:0)

我已经使用了这个subAppend方法(尝试使用@Override注释来确保你重写超类方法。有可能是无意中重载而且如果方法不是那么你将无法编译压倒一切的):

@Override
protected void subAppend(E event) {
    setFileName();
    this.setFile(fileName);
    start();
    super.subAppend(event);
}

其余代码与您的相同。不需要在logback.xml中指定append属性。 希望它有所帮助。