Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置日志文件名以在Log4j中包含当前日期_Java_.net_Logging_Log4net_Log4j - Fatal编程技术网

Java 设置日志文件名以在Log4j中包含当前日期

Java 设置日志文件名以在Log4j中包含当前日期,java,.net,logging,log4net,log4j,Java,.net,Logging,Log4net,Log4j,我想将log4j和log4net appender的日志文件名设置为当前日期。我们正在进行每日滚动,但当前日志文件没有日期。日志文件名格式为 logname.2008-10-10.log 有人知道我最好的方法吗 编辑:我忘了提到我们也希望在log4net中这样做。另外,任何解决方案都需要在JBoss中可用。DailRollingFileAppender正是您要搜索的 <appender name="roll" class="org.apache.log4j.DailyRollingFil

我想将log4j和log4net appender的日志文件名设置为当前日期。我们正在进行每日滚动,但当前日志文件没有日期。日志文件名格式为

logname.2008-10-10.log
有人知道我最好的方法吗


编辑:我忘了提到我们也希望在log4net中这样做。另外,任何解决方案都需要在JBoss中可用。

DailRollingFileAppender正是您要搜索的

<appender name="roll" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="application.log" />
    <param name="DatePattern" value=".yyyy-MM-dd" />
    <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" 
          value="%d{yyyy-MMM-dd HH:mm:ss,SSS} [%t] %c %x%n  %-5p %m%n"/>
    </layout>
  </appender>

我99%确定RollingFileAppender/DailRollingFileAppender虽然为您提供了所需的日期滚动功能,但无法指定当前日志文件也应使用
日期模式


您可能只需要将RollingFileAppender(或者DailRollingFileAppender,我忘了它在log4net中是哪个)作为子类并修改命名逻辑即可。

我已经创建了一个appender,可以实现这一点


我不知道这在Java中是否可行,但在.NET中,RollingFileAppender上的StaticLogFileName属性为您提供了所需的内容。默认值为true

<staticLogFileName value="false"/>

完整配置:



“.log”
用于不让日期格式识别日志中的全局日期模式“g”。

使用log4j.properties文件,并在我的POM中包含1.1和log4j 1.2.16

log4j.appender.LOGFILE=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.LOGFILE.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.LOGFILE.RollingPolicy.FileNamePattern=/logs/application_%d{yyyy-MM-dd}.log

本例将为每分钟创建记录器,如果您希望每天更改
DatePattern

<appender name="ASYNC" class="org.apache.log4j.DailyRollingFileAppender">
   <param name="File" value="./applogs/logger.log" />
   <param name="Append" value="true" />
   <param name="Threshold" value="debug" />
   <appendToFile value="true" />
   <param name="DatePattern" value="'.'yyyy_MM_dd_HH_mm"/>
   <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
      <param name="fileNamePattern" value="./applogs/logger_%d{ddMMMyyyy HH:mm:ss}.log"/>
      <param name="rollOver" value="TRUE"/>
   </rollingPolicy>
   <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%d{ddMMMyyyy HH:mm:ss,SSS}^[%X{l4j_mdc_key}]^[%c{1}]^ %-5p %m%n" />
   </layout>
</appender>
<root>
   <level value="info" />
   <appender-ref ref="ASYNC" />
</root>

作为对提到DailRollingFileAppender的两个答案的回应(抱歉,我没有足够的代表直接对它们发表评论,我认为这一点需要提及),我要警告,不幸的是,该类的开发人员已经记录了它表现出同步和数据丢失,并建议在新的部署中采用替代方案

您可以动态设置

SimpleLayout layout = new SimpleLayout();           
FileAppender appender = new FileAppender(layout,"logname."+new Date().toLocaleString(),false);
logger.addAppender(appender); 

即使你像@gedevan建议的那样使用DailRollingFileAppender,你仍然会得到
logname.log.2008-10-10
(一天后,因为前一天的日志会被存档,并且日期会连接到它的文件名)。 因此,如果您希望在末尾使用.log,则必须在DatePattern上执行以下操作:


log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-MM'.log'

您可以像这样通过编程实现:

        String dateFile = LocalDate.now().toString() + ".log";
        Enumeration enm = Logger.getRootLogger().getAllAppenders();
        Appender appender = null;
        while(enm.hasMoreElements()){
            appender = (Appender)enm.nextElement();
            String c = appender.getClass().toString();
            if(c.contains("FileAppender")){
                String f = ((FileAppender)appender).getFile();
                ((FileAppender)appender).setFile(f+dateFile);
                System.out.println("From:"+f+" to:"+dateFile);
            }
        }

这不是简单地创建一个名为“application.log”的日志文件,并且只在滚动日志文件中放置datepattern吗?因此,您每天都会得到一个单独的日志文件。但是今天的日志文件将命名为application.log,没有日期。在大多数情况下都可以。关于“DatePattern”的两条注释:-我使用“.yyy-MM-dd.lo\g”为所有日志文件获得相同的扩展名。-需要在g之前加反斜杠(至少对于log4net而言),以防止.Net应用预定义的“g”格式。@如果应用您提到的格式,您的日志是否以mylog.log.yyy-MM-dd.log结尾?或者您正在以某种方式删除以前的扩展?从log4j文档中:观察到DailRollingFileAppender出现同步问题和数据丢失。()。你真的应该遵循@shinds answer这正是我要找的。只是为了澄清一下:HTML实体
应该在那里,而不是
?^-^Pro level:99
log4j.appender.out.RollingPolicy.FileNamePattern=logs/%d{yyyy-MM-dd HH-MM-ss}cron-script-x/out.log log4j.appender.err.RollingPolicy.FileNamePattern=logs/%d{yyyyy-MM-dd HH-MM-ss}cron-script-x/err.log
截至目前,下载镜像链接都已断开。您仍然可以在归档存储库中找到该库:log4j.appender..DatePattern=yyyy-MM-dd将完成此任务。文件名将每天滚动,不需要额外的依赖项。请小心使用文件名中的斜杠“/”。我希望用户:
“logname”+新日期().format(“yyyy-mm-dd-hh-mm”)+“.log”
这将仅在应用程序启动时创建新日志文件,不会按日期将日志剪切为文件
        String dateFile = LocalDate.now().toString() + ".log";
        Enumeration enm = Logger.getRootLogger().getAllAppenders();
        Appender appender = null;
        while(enm.hasMoreElements()){
            appender = (Appender)enm.nextElement();
            String c = appender.getClass().toString();
            if(c.contains("FileAppender")){
                String f = ((FileAppender)appender).getFile();
                ((FileAppender)appender).setFile(f+dateFile);
                System.out.println("From:"+f+" to:"+dateFile);
            }
        }