【问题标题】:Extending FileAppender in logback - advanced file naming在 logback 中扩展 FileAppender - 高级文件命名
【发布时间】:2016-05-18 04:11:33
【问题描述】:

问题:

我正在从 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");

【问题讨论】:

    标签: java log4j logback


    【解决方案1】:

    我已经使用了这个 subAppend 方法(尝试使用 @Override 注释来确保您正在覆盖超类方法。可能会无意中重载,并且使用该注释,如果方法不是,您将无法编译覆盖):

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

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

    【讨论】:

    • 谢谢,但很遗憾,这并没有什么不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多