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

Extending FileAppender in logback - advanced file naming

问题:

我正在从 log4j 转换为 logback,但我的自定义 FileAppender 有问题。我正在尝试复制我的 log4j 行为,其中 FileAppender 创建了一个名为 request_req#_req_type_date.log[=36= 的新文件]

目前,记录的数据是正确的,但是它附加到同一个文件 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());
            }
        }
    }

}

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

public class SubmissionService {

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

我已经使用了这个 subAppend 方法(尝试使用 @Override 注释来确保你重写了 super class 方法。可能会无意地重载并且使用该注释你将无法如果方法没有被覆盖则编译):

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

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