当前位置 : 主页 > 编程语言 > java >

Sentinel参数设置不当导致日志数量持续增长分析

来源:互联网 收集:自由互联 发布时间:2023-02-04
Sentinel介绍 Sentinel是阿里巴巴开源的分布式限流平台,目前在Github有18.4k的star,Github地址:​​github.com/alibaba/Sen…​​他主要以流量为切入点,从流量控制、熔断降级、系统自适应保护

Sentinel介绍

Sentinel是阿里巴巴开源的分布式限流平台,目前在Github有18.4k的star,Github地址:​​github.com/alibaba/Sen…​​ 他主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助用户保障微服务的稳定性

问题描述

最近发现生产的Sentinel日志文件数量一直在增多,所以对Sentinel日志文件生成策略进行分析,发现在生成日志文件时,如果参数配置不合理,就会产生如下效果,具体原因请查看问题定位章节

Sentinel参数设置不当导致日志数量持续增长分析_日志文件

问题定位

Sentinel参数设置不当导致日志数量持续增长分析_应用名称_02

上图为Sentinel日志文件写入流程,在写入指标时,如果检测到文件不存在或文件大小超过50M就会创建文件,而在创建文件时首先会获取文件名称,而文件名称有以下两种策略

日志文件名称获取

  • 如果csp.sentinel.log.use.pid为true,那么文件名称前缀会包含当前pid,格式为:应用名称-metrics.log.pidxxx
  • 如果csp.sentinel.log.use.pid为false,生成文件名称前缀不包含pid,格式为:应用名称-metrics.log
  • 有了文件前缀以后再拼接当前日期,就会返回以下两种格式的一种

    • 应用名称-metrics.log.pidxxx.yyyy-MM-dd
    • 应用名称-metrics.log.yyyy-MM-dd

    删除多余文件

    在获取文件名称以后,就会创建日志文件,在创建时首先会检查是否有多余的文件,如果文件数大于6个,那么会进行循环删除,直到剩下6个文件,具体代码如下,可以看到在删除文件时又调用了​​listMetricFiles​​,所以需要具体查看​​listMetricFiles​​逻辑是否有坑

    //批量删除文件private void removeMoreFiles() throws Exception { List<String> list = listMetricFiles(baseDir, baseFileName); if (list == null || list.isEmpty()) { return; } for (int i = 0; i < list.size() - totalFileCount + 1; i++) { String fileName = list.get(i); String indexFile = formIndexFileName(fileName); //删除指标文件 new File(fileName).delete(); ... //删除以idx结尾的索引文件 new File(indexFile).delete(); .. } }

    查找历史文件

    ​​listMetricFiles​​方法会根据文件前缀查找文件,如果开启了​​csp.sentinel.log.use.pid​​为true,就可能导致返回的文件数量有变化

    假设应用名称为sentinel-demo,pid为5687,那么文件前缀为sentinel-demo-metrics.log.pid5687,根据前缀查询会返回相关文件

    但如果系统发布重启了,那么pid就会发生变化,这样就会查不到之前的文件,查找不到文件就没法删除,这样依次类推,就会产生大量文件

    /** * 查找指标文件 * baseDir 日志文件路径 * baseFileName为文件前缀 * @throws Exception */ public static List<String> listMetricFiles(String baseDir, String baseFileName) throws Exception { List<String> list = new ArrayList<String>(); File baseFile = new File(baseDir); File[] files = baseFile.listFiles(); if (files == null) { return list; } for (File file : files) { String fileName = file.getName(); if (file.isFile() && fileNameMatches(fileName, baseFileName) && !fileName.endsWith(MetricWriter.METRIC_FILE_INDEX_SUFFIX) && !fileName.endsWith(".lck")) { list.add(file.getAbsolutePath()); } } Collections.sort(list, MetricWriter.METRIC_FILE_NAME_CMP); return list; } /** * fileName 本地文件名称 * baseFileName 文件前缀,格式为一下两种,sentinel-demo为应用名称,5687为pid * sentinel-demo-metrics.log * sentinel-demo-metrics.log.pid5687 */ public static boolean fileNameMatches(String fileName, String baseFileName) { if (fileName.startsWith(baseFileName)) { String part = fileName.substring(baseFileName.length()); // part is like: ".yyyy-MM-dd.number", eg. ".2018-12-24.11" return part.matches("\\.[0-9]{4}-[0-9]{2}-[0-9]{2}(\\.[0-9]*)?"); } else { return false; } }

    参数说明

    • csp.sentinel.log.use.pid日志文件包含pid
    • csp.sentinel.metric.file.total.count日志文件保留数量,默认值为6
    • csp.sentinel.metric.file.single.size单日志文件大小,默认为50M

    总结

    由于在系统启动时指定了​​csp.sentinel.log.use.pid​​为true,所以日志文件名称会包含pid,但是由于系统重启pid会发生变化,所以在删除文件时根据文件前缀,没法查找到上一个pid的日志文件,因此就会产生大量的日志文件

    修复方式

  • 显示指定​​csp.sentinel.log.use.pid​​为false
  • 启动时不指定​​csp.sentinel.log.use.pid​​
  • 网友评论