java透传参数至logback,自定义日志文件名。过期日志文件自动删除

这篇具有很好参考价值的文章主要介绍了java透传参数至logback,自定义日志文件名。过期日志文件自动删除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LogFilter

filter日志拦截,把不需要打印的日志信息拦截在外,只录入有key参数的(filterReply = FilterReply.ACCEPT;)。

package com.***.***.filter;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * task log filter
 */
public class LogFilter extends Filter<ILoggingEvent> {

    private static Logger logger = LoggerFactory.getLogger(LogFilter.class);

    /**
     * Task Logger Thread's name
     */
    public static final String LOG_FORMAT = "customLogId";

    /**
     * level
     */
    private Level level;

    /**
     * Accept or reject based on thread name
     *
     * @param event event
     * @return FilterReply
     */
    @Override
    public FilterReply decide(ILoggingEvent event) {
        FilterReply filterReply = FilterReply.DENY;
        if (event.getMDCPropertyMap().containsKey(LOG_FORMAT)) {
            filterReply = FilterReply.ACCEPT;
        }
        logger.debug("task log filter, thread name:{}, loggerName:{}, filterReply:{}, level:{}", event.getThreadName(),
                event.getLoggerName(), filterReply.name(), level);

        return filterReply;
    }
}

java打印日志

public void TestLog() {
    String customLogId = "123456789";
    MDC.put("customLogId", customLogId);
    log.info("customLogId={}, logTest start success!", customLogId);
    log.info("111111111111111111111111111111111111111111111111");
    log.info("customLogId={}, logTest end success!", customLogId);
    MDC.clear();
}

logback的XML配置:

filter class配置为filter的包路径.类名。如果不需要拦截日志的话,可以不用配置filter,java中也不用写。因为我的参数透传使用在了日志文件命名当中,没有key的数据会替换为unknown,日志就录入到unknown文件当中了,所以加了filter过滤。

appender SiftingAppender 可以使用discriminator自定义参数

discriminator 的key 是在java代码录日志之前通过MDC录入

<appender name="CUSTOMLOGFILE" class="ch.qos.logback.classic.sift.SiftingAppender">
        <filter class="com.***.***.filter.LogFilter"/>
        <discriminator>
            <key>customLogId</key>
            <defaultValue>unknown</defaultValue>
        </discriminator>
        <sift>
            <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>${log_dir}/custom/${customLogId}.log</file>
                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                    <!--日志文件输出的文件名-->
                    <fileNamePattern>${log_dir}/custom/%d{yyyy-MM-dd}/${customLogId}.%i.log</fileNamePattern>
                    <!--日志保留时长-->
                    <maxHistory>2</maxHistory>
                    <!--日志大小-->
                    <maxFileSize>2KB</maxFileSize>
                    <totalSizeCap>5KB</totalSizeCap>
                    <cleanHistoryOnStart>true</cleanHistoryOnStart>
                </rollingPolicy>

                <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                    <providers>
                        <pattern>
                            <pattern>
                                {
                                "time": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
                                "level": "%level",
                                "thread": "%thread",
                                "class": "%logger{40}",
                                "message": "%msg",
                                "stack_trace": "%exception{10}"
                                }
                            </pattern>
                            <charset>utf8</charset>
                        </pattern>
                    </providers>
                </encoder>
            </appender>
        </sift>
    </appender>

参数解析

RollingFileAppender可以用于滚动日志。期望根据日期、文件大小删除日志时,可使用。

file 生成的日志名称

rollingPolicy 滚动策略,这里采用的SizeAndTimeBasedRollingPolicy,基于日志文件大小和时间滚动。

fileNamePattern 定义翻转(归档)日志文件的名称。

它的值应该包括文件的名称以及适当放置的% d 转换说明符。% d 转换说明符可能包含日期和时间模式。如果省略了日期和时间模式,则假定使用默认模式 yyyy-MM-dd。翻转周期是从 fileNamePattern 的值推断出来的。这里的滚动周期需要和maxHistory配合使用。

maxFileSize 单个日志文件的最大体积,到达最大体积后就会触发日志滚动操作,生成新的日志文件

maxHistory 要保存的归档文件的最大数量,以异步方式删除旧文件。例如,如果通过fileNamePattern中的%d{yyyy-MM}指定滚动周期为月度滚动,并将 maxHistory 设置为6,那么存档文件中超过6个月的文件将被删除。

totalSizeCap 控制所有归档日志文件的总大小。当超出总大小上限时,将异步删除最早的归档日志文件。设置totalSizeCap 属性还要求设置 maxHistory 属性。优先“最大历史”限制,其次是“总大小上限”的限制。

按照实际业务情况配置 totalSizeCap ,可以有效避免占用过大的磁盘空间。

比如你希望 maxHistory 保留7天日志文件,但是可能这7个文件总大小超出磁盘容量,所以可以通过 totalSizeCap 来控制总大小,这样系统会判断大于此值时进行自动覆盖。

注意⚠️:单独配置totalSizeCap是没有意义的,一定要同时配置maxHistory属性,且大于0,才能实现超过总大小上限异步删除。

cleanHistoryOnStart 是否在应用启动的时候删除历史日志。

如果设置为真,将在启动应用程序时执行档案删除。默认情况下,此属性设置为 false。归档日志移除通常在滚动期间执行。但是,有些应用程序的存活时间可能不够长,无法触发滚动。因此,对于如此短命的应用程序,删除存档可能永远没有机会执行。通过将 cleanHistoryOnStart 设置为 true,将在启动 appender 时执行档案删除。

encoder 控制输出日志的格式和编码。

patten里的内容可以看到我改成了json格式。有利于后续在ELK中使用。

当然你也可以写成常规的打印的日志格式

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>

 <fileNamePattern>${log_dir}/custom/%d{yyyy-MM-dd}/${customLogId}.%i.log</fileNamePattern>

这段话要注意一下:

日志是根据%d来进行日期滚动的,如果有多个%d就无法识别了。

在fileNamePattern配置中添加多个%d的日期符号,但是只能有一个是主要的,其它的只能做为辅助(auxiliary)。在RollingCalendar类中,日志的文件滚动方式就是根据主%d那个日期判断的.

比如:/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log

public RollingCalendar(String datePattern) {
        super();
        this.datePattern = datePattern;
        this.periodicityType = computePeriodicityType();
}

public PeriodicityType computePeriodicityType() {

        GregorianCalendar calendar = new GregorianCalendar(GMT_TIMEZONE, Locale.getDefault());

        // set sate to 1970-01-01 00:00:00 GMT
        Date epoch = new Date(0);

        if (datePattern != null) {
            for (PeriodicityType i : PeriodicityType.VALID_ORDERED_LIST) {
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);
                simpleDateFormat.setTimeZone(GMT_TIMEZONE); // all date formatting done in GMT

                String r0 = simpleDateFormat.format(epoch);

                Date next = innerGetEndOfThisPeriod(calendar, i, epoch);
                String r1 = simpleDateFormat.format(next);

                // System.out.println("Type = "+i+", r0 = "+r0+", r1 = "+r1);
                if ((r0 != null) && (r1 != null) && !r0.equals(r1)) {
                    return i;
                }
            }
        }
        // we failed
        return PeriodicityType.ERRONEOUS;
    }

%i是自然数,当生成多个的时候会按照0123...生成尾号不同的文件。

图中配的时长大小比较小是为了测试。正常可以按周/月清理日志,大小在100MB,总大小20GB左右。根据情况调整文章来源地址https://www.toymoban.com/news/detail-701570.html

到了这里,关于java透传参数至logback,自定义日志文件名。过期日志文件自动删除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysdql 启动错误 unknown variable windows phpstudy mysql错误日志的正确文件名

    1. windowsphpstudy mysql错误日志的正确文件名 log-error=\\\"D:/phpstudy_pro/Extensions/MySQL5.7.26/data\\\"。 刚好 数据库文件目录也是\\\"D:/phpstudy_pro/Extensions/MySQL5.7.26/data\\\" 其实对应的错误日志是 D:/phpstudy_pro/Extensions/MySQL5.7.26/data.err  注意是.err结尾的文件,而不是linux *.log为结尾的 2   改成 

    2024年03月17日
    浏览(59)
  • js将后端返回的文件流导出为excel,并自定义下载文件名

    一. 需求 后台管理系统,常会出现导出excel表格功能;点击导出按钮,请求后端接口,需要将接口返回的 文件流 导出为excel,实现前端下载excel文件。 但是,返回的数据获取 response 时出现乱码,如图: 二. 实现思路 调用后端下载接口,获取传递过来的二进制数据流 创建 a 标

    2024年02月05日
    浏览(84)
  • dede织梦自定义文件名之用拼音或英文标题的方法

    让DedeCMS文章标题页显示路径为“标题拼音.html”,例如:文章标题为:我是一个兵,文章路径显示:woshiyigebing.html 方法: 后台-->网站栏目管理,修改栏目的高级选项,文章命名规则:{typedir}/{Y}{M}{D}/{aid}.html 修改为:{typedir}/{pinyin}.html {Y}{M}{D}没什么用,所以去掉了。 更新

    2024年02月02日
    浏览(46)
  • rollup打包js库 占位符替换成文件名和行号输出日志中定位报错位置

    问题:在打包的js库中有很多日志或者error的控制台输出,但是打包后的js调用报错后无法从控制台看到堆栈信息,无法定位报错的位置是在哪个文件的哪一行 需求:能够从报错中观察到报错在哪个文件的那一行,便于排查错误 实现:自定义插件来实现此功能 思路:在打包时

    2024年02月16日
    浏览(60)
  • java修文件名名称

    在java中如何修改文件名称呢?以下函数可以直接实现,如果修改成功会直接返回true,不成功则会提示错误信息;以下是程序的代码: 函数的两个参数分别为:原本的文件路径,新路径名。路径即文件路径+文件名。

    2024年02月15日
    浏览(39)
  • java获取文件夹下所有文件名

      在进行 Java编程的过程中,我们会经常使用到文件夹下的所有文件名。有时候可能不太熟悉 Java编程的小伙伴们会发现,在代码中没有获取到所有的文件名,那么这个时候我们应该怎么去获取到这些文件呢?在进行 Java编程的过程中,我们会经常使用到 Java里面的 JDBC数据库连

    2024年02月10日
    浏览(71)
  • java获取文件名后缀方法

      Java是一种应用广泛的编程语言,可以通过多种方式来实现对文件的操作。如文件名后缀、文件扩展名等。今天我们来看下 Java是如何获取文件名后缀的吧! 1.打开一个空文件,将其复制到一个新的文件夹中。 2.新建一个类,在里面定义方法,名称为 dirs. csvf 3.在 dirs. csvf类中

    2024年02月15日
    浏览(50)
  • Java文件下载中文文件名乱码的解决方案

      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作

    2024年02月13日
    浏览(59)
  • Java下载excel文件名中文乱码解决

    我是一名充满激情的程序员,💻希望和大家一起学习进步!我热爱编程,对技术充满好奇心和求知欲! 🗣️无论你是新手还是老手,都能从我的博客中获得有价值的内容! 🚀让我们一起努力,成为更优秀的程序员吧!💪💻 当使用Java下载Excel文件时,有时会遇到文件名中

    2024年02月07日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包