You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Log4j按小时分目录+跨目录连续索引及全局滚动配置问询

Log4j 2 配置方案

核心配置思路

  • 全局索引延续:用Log4j 2内置的${counter:}占位符实现跨目录的递增索引,替代默认的目录内重置的%i。
  • 全局滚动清理:通过DefaultRolloverStrategy的delete规则,结合路径排序器遍历所有小时目录,按文件时间从旧到新排序,删除超出数量上限的日志文件。

完整log4j2.xml示例

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="logDir">./logs</Property>
        <Property name="logAppName">MyApp</Property>
        <Property name="logSessionData">session123</Property>
        <!-- 全局计数器初始值,需延续历史索引时手动指定最后一个索引值 -->
        <Property name="logCounterStart">0</Property>
    </Properties>

    <Appenders>
        <RollingRandomAccessFile 
            name="RollingFile" 
            append="true"
            filename="${logDir}/${logAppName}_${logSessionData}_LAST.logmx"
            <!-- 全局计数器替代%i,确保跨目录索引不重置 -->
            filePattern="${logDir}/$${date:yyyy-MM-dd-HH}/${logAppName}_${logSessionData}_#${counter:LOG_INDEX:-${logCounterStart}}.logmx">
            
            <!-- 日志格式定义 -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            
            <!-- 滚动触发策略:按小时+文件大小双触发 -->
            <Policies>
                <!-- 每小时自动创建对应目录并触发滚动 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!-- 文件达到100MB时触发滚动 -->
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
            
            <!-- 全局滚动清理规则 -->
            <DefaultRolloverStrategy max="10000">
                <Delete basePath="${logDir}" maxDepth="2">
                    <!-- 匹配所有小时目录下的滚动日志文件 -->
                    <IfFileName glob="*/*_#*.logmx"/>
                    <!-- 按文件修改时间升序排序(旧文件在前) -->
                    <PathSorter comparator="lastModified" order="ascending"/>
                    <!-- 保留最近10000个文件,删除超出部分 -->
                    <IfAccumulatedFileCount exceeds="10000"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

关键配置说明

1. 全局索引延续实现

  • LOG_INDEX是全局计数器的唯一标识,所有滚动操作共享该计数器,确保新目录下的日志索引直接延续上一目录的最后索引,不会重置。
  • 若需要从历史索引继续计数,修改logCounterStart属性为上次最后一个日志文件的索引值即可。

2. 全局滚动清理实现

  • maxDepth="2":遍历根日志目录下的二级目录(即各小时目录),确保所有历史日志都被纳入清理范围。
  • PathSorter按文件修改时间升序排序,保证删除的是最旧的日志文件,而非仅当前目录内的旧文件。
  • IfAccumulatedFileCount控制全局保留的日志总数,超出上限时自动清理旧文件。

注意事项

  • 需使用Log4j 2.10.0及以上版本,确保${counter:}占位符和PathSorter功能正常工作。
  • 若需按文件创建时间排序,将comparator值改为creationTime即可。

内容的提问来源于stack exchange,提问作者אחת111

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:45:16