【问题标题】:log4j.properties FileAppender filename patternlog4j.properties FileAppender 文件名模式
【发布时间】:2015-09-15 04:31:28
【问题描述】:

我使用slf4j/logback有一段时间了,我们在logback.xml中自定义的文件名是:

<timestamp key="ymd" datePattern="yyyyMMdd" />
<timestamp key="hms" datePattern="HHmmss" />
... ...
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/var/log/${ymd}/${HOSTNAME}-${USER}-${hms}.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
        <fileNamePattern>/var/log/${ymd}/${HOSTNAME}-${USER}-${hms}.%i.log</fileNamePattern>

现在我切换到 slf4j/log4j。如何在 log4j.properties 中有类似的日志文件名模式?

log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=/var/log/${ymd}/${HOSTNAME}-${USER}-${hms}.log?

【问题讨论】:

    标签: log4j configuration-files


    【解决方案1】:

    使用 Log4J 2,等效配置 (log4j2.properties) 将是:

    name = MyApp
    
    property.ymd=$${date:yyyyMMdd}
    property.hms=$${date:HHmmss}
    
    appender.rolling.type = RollingFile
    appender.rolling.name = RollingFile
    appender.rolling.fileName =/var/log/${ymd}/${env:HOSTNAME}-${env:USER}-${hms}.log
    appender.rolling.filePattern =/var/log/${ymd}/${env:HOSTNAME}-${env:USER}-${hms}.%i.log
    
    appender.rolling.layout.type = PatternLayout
    appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
    
    appender.rolling.policies.type = Policies
    appender.rolling.policies.size.type=SizeBasedTriggeringPolicy
    appender.rolling.policies.size.size=1KB
    
    rootLogger.level=debug
    rootLogger.appenderRef.rolling.ref=RollingFile
    

    您没有指定 logback 的触发策略,所以我使用了一个简单的 SizeBasedTriggerPolicy 来进行演示。

    使用 Log4J 1 是否不可能(至少据我所知)通过纯配置方式实现相同的功能,因此您将不得不求助于编程配置,例如:

    //Parameters
    String user = System.getenv("USER2");
    String host = System.getenv("HOSTNAME");
    
    Date now = new Date();
    String day = new SimpleDateFormat("yyyyMMdd").format(now);
    String time = new SimpleDateFormat("HHmmss").format(now);
    
    //Filename pattern
    String pattern = String.format("/var/log/%s/%s-%s-%s",day,host,user,time);
    
    //Create a new RollingFileAppender instance
    RollingFileAppender appender = new RollingFileAppender();
    appender.setName("ROLLING");
    appender.setFile(pattern+".log");
    
    FixedWindowRollingPolicy policy = new FixedWindowRollingPolicy();
        policy.setFileNamePattern(pattern+".%i.log");
        policy.setMinIndex(1);
        policy.setMaxIndex(5);
        policy.activateOptions();
    appender.setRollingPolicy(policy);
    
    appender.setTriggeringPolicy(
        new SizeBasedTriggeringPolicy(1000)
    );
    
    appender.setLayout(
        new PatternLayout("%d %m%n")
    );
    
    appender.activateOptions();
    
    //Attach it to the ROOT logger
    Logger.getRootLogger().addAppender(
        appender
    );
    

    请注意,Log4J 1 早在 2015 年就已正式进入“生命尽头”:

    2015 年 8 月 5 日,Logging Services 项目管理委员会宣布 Log4j 1.x 已结束生命周期。有关公告的完整文本,请参阅 Apache 博客。建议使用 Log4j 1 的用户升级到 Apache Log4j 2

    因此强烈建议升级到 2.X,除非由于某种原因无法选择。

    【讨论】:

    • 但是 Log4J 1 是什么?
    • AFAIK 这不能通过纯配置方式在 Log4J 1 中完成。有一个 RollingFileAppender 和一个 FixedWindowRollingPolicy (log4j-extras),可用于基于索引滚动文件,还有一个 DailyRollingAppender/TimeBasedRollingPolicy,可用于在文件名中包含日期,但据我所知不可能同时做这两件事。
    • 这很容易通过编写一些代码来克服(为“ymd”/“hms”时间戳设置系统属性或实现自定义附加程序/滚动策略),但 IMO 没有什么意义,由于 Log4J 1 已经很久了deprecated,所以升级到 2.0 是一个更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    相关资源
    最近更新 更多