当前位置: 首页 > 知识库问答 >
问题:

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

秦景同
2023-03-14

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

<?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个答案

秦钟展
2023-03-14

我已经使用了这个subAppend方法(尝试使用@override注释以确保您重写的是超类方法。有可能是无意重载的,并且如果方法不重写,则使用该注释您将无法编译):

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

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

 类似资料:
  • 我需要控制日志框架的最大磁盘空间量。 例如,在log4j中,如果有如下所示的追加器,我可以很容易地估计需要多少磁盘空间: 对于maxFileSize和maxBackupIndex,我知道最多需要10x100KB。 我注意到DailyRollingFileAppender,但它不支持maxFileSize。 除了RollingFileAppender之外,是否还有其他fileappender可以实现

  • 问题内容: 假设从CGI开始,我已经将文件显示为文件。我想将的文件扩展名更改为显示文件。我该怎么做? 问题答案: , 例如:

  • 我们有一个巨大的应用程序使用我们的自定义RollingFileAppender(扩展org.apache.log4j.log4j中的RollingFileAppender 1. x)。我们已经重写了一些方法,但是有两个主要的方法是rollover()和subAppend(),如下所示: 在将其迁移到log4j2时,我希望尽可能利用log4j2的RollingFileAppender,同时只覆盖选定

  • 由来 顾名思义,FileAppender类表示文件追加器。此对象持有一个一个文件,在内存中积累一定量的数据后统一追加到文件,此类只有在写入文件时打开文件,并在写入结束后关闭之。因此此类不需要关闭。 在调用append方法后会缓存于内存,只有超过容量后才会一次性写入文件,因此内存中随时有剩余未写入文件的内容,在最后必须调用flush方法将剩余内容刷入文件。 也就是说,这是一个支持缓存的文件内容追加器

  • 我使用在文件中配置的logback来管理应用程序的日志。我想: 创建日志文件,这些日志文件在应用程序启动时贴上时间戳,并在应用程序的生命周期内作为单个日志文件保留。(我们可能同时运行一个应用程序的多个实例,或者在一天内运行多个实例,它们可能会运行几天。) 保持干净的日志文件目录,以便删除超过给定期间的日志。 实现第二个建议使用和,如下所示--这将日志文件保存7天。但是,这将使用一个文件来记录给定日

  • 问题内容: 我的页面结构为: 现在,DIV将具有更多内容,因此DIV的高度将根据子DIV的增加而增加。 但是问题是身高没有增加。如何使它的高度等于父代的高度? 问题答案: 对于元素,添加以下属性: 然后针对这些: