【问题标题】:Max log file size in log4j 1.2.17 with properties具有属性的 log4j 1.2.17 中的最大日志文件大小
【发布时间】:2018-12-07 11:17:48
【问题描述】:

我正在将我们服务器上的记录器配置为每天压缩日志。我还需要确保单个日志文件不会变得太大(比如每个文件 10MB)。

都没有工作,但首先我想解决文件大小的问题。

这是我的 log4j.properties 文件:

log4j.rootLogger=DEBUG, file

log4j.appender.file=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.file.rollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.file.rollingPolicy.fileNamePattern=./log/logging.%d.log.zip
log4j.appender.file.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
log4j.appender.file.TriggeringPolicy.maxFileSize=1000000
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

我们使用 log4j 1.2.17,现在我添加了相同版本的 log4j extras。

当我测试日志时,它会创建任意大文件。我尝试使用 maxFileSize 和 MaxFileSize 代替 maxFileSize,使用“10MB”代替数字,但没有任何效果。

我也尝试过以编程方式设置属性,虽然这会使事情变得困难,因为我们有很多使用记录器的类。

但这也没有用。事实证明,我的 Logger 实例(?)中没有 Appender。这是我的代码:

logger = Logger.getLogger(LogTest.class);
//        RollingFileAppender app = (RollingFileAppender) logger.getAppender("file");
//        app.setMaxFileSize("1000000");
Enumeration allAppenders = logger.getAllAppenders();
System.out.println(allAppenders);
for (Enumeration<Object> iter = allAppenders; iter.hasMoreElements();) {
    Object elem = iter.nextElement();
    System.out.println(elem);
}

输出为空枚举:

org.apache.log4j.helpers.NullEnumeration@1161fded

我没有找到另一个对我的问题有用的帖子。有什么想法吗?

【问题讨论】:

    标签: log4j rollingfileappender


    【解决方案1】:

    @GregT 如您所知,log4j 具有三个主要结构 - 附加程序、优先级(记录器)和模式布局。默认情况下,root Logger 在我们实例化 log4j 时设置,例如Logger log = Logger.getInstance(Somclass.class) -> 它添加了 rootlogger 的可加性(意味着默认情况下,rootlogger 中设置的优先级和级别由该子 logger 继承)。现在您可以选择在 lo4j 配置中定义自己的优先级和级别(在 xml 或属性文件中)。

    这是我为相同的配置。消除触发策略和动态命名,这里是使用 .properties 文件的示例配置

    log4j.threshold = INFO
    #Specify the appender and the priority
    log4j.rootLogger = DEBUG, Appender1, Appender2
    
    log4j.appender.Appender1 = org.apache.log4j.ConsoleAppender
    
    log4j.appender.Appender2 = org.apache.log4j.RollingFileAppender
    log4j.appender.Appender2.File = app/log1.log
    
    log4j.appender.Appender1.layout = org.apache.log4j.PatternLayout
    log4j.appender.Appender2.layout = org.apache.log4j.PatternLayout
    
    # Print the date in ISO 8601 format
    log4j.appender.Appender1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    log4j.appender.Appender2.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    

    注意:这里如果您将阈值设置为 INFO,即使优先级设置为 DEBUG 级别,它也只会在“日志”实例中打印出符合 INFO 级别的语句。

    请注意,我们还可以为不同的模块设置不同的日志记录

    log4j.rootLogger=DEBUG
    
    # AdminFileAppender - used to log messages in the admin.log file.
    log4j.appender.AdminFileAppender=org.apache.log4j.FileAppender
    log4j.appender.AdminFileAppender.File=app/admin.log
    log4j.appender.AdminFileAppender.layout=org.apache.log4j.PatternLayout
    log4j.appender.AdminFileAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
    
    # ReportFileAppender - used to log messages in the report.log file.
    log4j.appender.ReportFileAppender=org.apache.log4j.FileAppender
    log4j.appender.ReportFileAppender.File=app/report.log
    log4j.appender.ReportFileAppender.layout=org.apache.log4j.PatternLayout
    log4j.appender.ReportFileAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
    
    **log4j.logger.com.vaannila.admin=,AdminFileAppender 
    log4j.logger.com.vaannila.report=,ReportFileAppender** 
    

    如果您想在达到配置的阈值大小时推出新文件,则可以使用 RollingFileAppender。这里管理模块日志写入“admin.log”文件,报告模块写入“report.log”文件

    希望对你有帮助

    编辑:我担心基于时间/基于大小的触发策略效果很好,并且仅适用于 xml 配置而不是属性文件配置。请检查一下。而且您也不必包含 apache-log4j-extras 依赖项。 1.2.17 附带它。这是我使用的基于 XML 的配置

     <Appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            </Console>
    
            <RollingFile name="info" filepattern="apps/logs/${hostName}-info-%i.log"
                filename="apps/logs/${hostName}-info.log">
    
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %X{userName} [%C] %F:%L - %m%n" />
                <Policies>
    
                    <SizeBasedTriggeringPolicy size="20 MB" />
    
                </Policies>
    
                <DefaultRolloverStrategy max="1" min="1" />
    
            </RollingFile>
            <RollingFile name="debug" filepattern="apps/logs/${hostName}-debug-%i.log"
                filename="apps/logs/${hostName}-debug.log">
    
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %X{userName} [%C] %F:%L - %m%n" />
                <Policies>
    
                    <SizeBasedTriggeringPolicy size="20 MB" />
    
                </Policies>
    
                <DefaultRolloverStrategy max="1" min="1" />
    
            </RollingFile>
            <Routing name="RoutingAppender">
                <Routes pattern="${ctx:logFileName}">
                    <Route>
                        <RollingFile name="${ctx:logFileName}-logfile"
                            fileName="apps/logs/${hostName}-${ctx:logFileName}.log"
                            filePattern="apps/logs/${hostName}-${ctx:logFileName}-%i.log">
                            <PatternLayout>
                                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS}[%X{logTrackingId}] [%t] %c{1} - %msg%n
                                </pattern>
                            </PatternLayout>
                            <Policies>
                                <SizeBasedTriggeringPolicy size="20 MB" />
                            </Policies>
                            <DefaultRolloverStrategy max="1" min="1" />
                        </RollingFile>
                    </Route>
                </Routes>
            </Routing>
    
            <RollingFile name="RollingFileMonitor" filepattern="apps/logs/${hostName}-monitor-%i.log"
                filename="apps/logs/${hostName}-monitor.log">
    
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %X{userName} [%C] %F:%L - %m%n" />
                <Policies>
                    <SizeBasedTriggeringPolicy size="20 MB" />
                </Policies>
    
            </RollingFile>
    
            <RollingFile name="RollingFileAPM" filename="apps/logs/${hostName}-apm.log"
                filepattern="apps/logs/${hostName}-apm-%i.log">
                <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %X{userName} [%C] %F:%L - %m%n" />
                <Policies>
                    <SizeBasedTriggeringPolicy size="20 MB" />
                </Policies>
                <DefaultRolloverStrategy min="1" max="1" />
            </RollingFile>
        </Appenders>
    
    
        <Loggers>
            <Root level="info">
                <AppenderRef ref="Console" />
            </Root>
            <Logger name="com.XXXX.app.service" additivity="false">
                <AppenderRef ref="RollingFileMonitor" />
            </Logger>
            <Logger name="com.XXXX.apm" additivity="false">
                <AppenderRef ref="RollingFileAPM" />
            </Logger>
    
            <Logger name="com.XXXX,config" level="info" additivity="false">
                <AppenderRef ref="info" />
            </Logger>
    
            <Logger name="com.XXXXXX.controller" level="info" additivity="false">
                <AppenderRef ref="RoutingAppender" />
            </Logger>
            <Logger name="com.XXXXX.impl" level="info" additivity="false">
                <AppenderRef ref="RoutingAppender" />
            </Logger>
            <Logger name="com.XXXXX.impl" level="info" additivity="false">
                <AppenderRef ref="RoutingAppender" />
            </Logger>
            <Logger name="com.XXXX.logging" level="info" additivity="false">
                <AppenderRef ref="RoutingAppender" />
            </Logger>
            <Logger name="com.zaxxer.hikari" level="debug" additivity="false">
                <AppenderRef ref="debug" />
            </Logger>
        </Loggers>
    

    希望这能回答您的问题。

    【讨论】:

    • 这对 SizeBasedTriggeringPolicy 或 TimeBasedRollingPolicy 有何帮助?
    • @GregT 我已经更新了答案。抱歉,我一开始误解了这个问题。
    • 如果它只适用于 XML 真的很有趣,而且非常出乎意料。最后,我们使用 XML 配置文件迁移到 log4j 2,它完成了这项工作。我试图将 XML 写回属性文件,但没有成功(没有日志输出)。也许甚至 log4j2 都无法在属性文件中处理这些策略?
    • 不幸的是,这个 XML 配置文件也不起作用,“log4j:WARN No appenders could be found for logger ...请正确初始化 log4j 系统。”。我明确给出了配置文件的位置。我尝试添加缺少的 标记,但没有帮助。我觉得现在没那么重要了。还是谢谢你!
    • 没问题@GregT。我会尝试复制它,因为它现在对我来说工作正常,一旦我得到解决方案,我会发布它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多