【问题标题】:configure log4j to log to custom file at runtime配置 log4j 以在运行时记录到自定义文件
【发布时间】:2009-08-24 18:49:59
【问题描述】:

谁能指导我如何配置 log4j 以登录到我在运行时指定的特定文件。日志文件的名称和路径是在运行时生成的,应用程序必须登录到该文件特定文件。

log4j.properties 文件中的文件附加程序条目通常指向应用程序将使用的日志文件。但是在这种情况下,我想从命令行读取日志文件路径并记录到该特定文件。

我怎样才能做到这一点?

【问题讨论】:

    标签: java log4j


    【解决方案1】:

    您也可以从 log4j.properties 文件中执行此操作。使用下面的示例文件,我添加了系统属性 ${logfile.name}

    # logfile is set to be a RollingFileAppender
    log4j.appender.logfile=org.apache.log4j.RollingFileAppender
    log4j.appender.logfile.File=${logfile.name}
    log4j.appender.logfile.MaxFileSize=10MB
    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logfile.layout.ConversionPattern=[%-5p]%d{yyyyMMdd@HH\:mm\:ss,SSS}\:%c - %m%n
    

    然后可以通过两种不同的方式设置日志文件名:

    1. 作为命令行,系统属性传递给 java "-Dlogfile.name={logfile}"
    2. 在 java 程序中直接设置系统属性(在调用 log4j 之前)。

      System.setProperty("logfile.name","some path/logfile name string");

    【讨论】:

    • "系统属性传递给 java -Dlogfile.name={logfile}" 正是我要找的
    • 太好了——正是我要找的——但是如果系统属性“logfile.name”没有在命令行上设置会发生什么?抛出运行时异常?
    • 如果你使用log4j2,你应该在xml中写${sys:logfile.name}
    • 所以称我为白痴,但如果你执行 #2 并且它不接受它怎么办?我有一个没有 log4j 的 main 函数和系统属性集。有什么想法吗?
    • 此方法不适用于静态记录器,该记录器在 System.setProperty() 调用之前初始化。
    【解决方案2】:

    改编自 log4j 文档:

    import org.apache.log4j.Level;
    import org.apache.log4j.Logger;
    import org.apache.log4j.SimpleLayout;
    import org.apache.log4j.FileAppender;
    
    public class SimpandFile {
       static Logger logger = Logger.getLogger(SimpandFile.class);
       public static void main(String args[]) {
    
          // setting up a FileAppender dynamically...
          SimpleLayout layout = new SimpleLayout();    
          FileAppender appender = new FileAppender(layout,"your filename",false);    
          logger.addAppender(appender);
    
          logger.setLevel((Level) Level.DEBUG);
    
          logger.debug("Here is some DEBUG");
          logger.info("Here is some INFO");
          logger.warn("Here is some WARN");
          logger.error("Here is some ERROR");
          logger.fatal("Here is some FATAL");
       }
    }
    

    【讨论】:

      【解决方案3】:

      也可以通过 log4j.properties 文件中定义的这个属性来完成

      log4j.appender.logfile=org.apache.log4j.RollingFileAppender
      log4j.appender.logfile.maxFileSize=5000KB
      log4j.appender.logfile.maxBackupIndex=5
      log4j.appender.logfile.File=/WebSphere/AppServer/profiles/Custom01/error.log
      log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
      log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %C %M %c{1}:%L - %m%n
      

      【讨论】:

        【解决方案4】:

        工作和相同已经过测试

        // setting up a FileAppender dynamically...
        SimpleLayout layout = new SimpleLayout(); 
        RollingFileAppender appender = new RollingFileAppender(layout,"file-name_with_location",true);
                            appender.setMaxFileSize("20MB");
                            logger.addAppender(appender);
        

        【讨论】:

          【解决方案5】:

          只需删除您的 log4j 代码并在您的 java 类中替换此代码即可运行良好,无需添加属性或 xml 文件


          SimpleDateFormat dateFormatsd = new SimpleDateFormat("dd-MM-yyyy-hh-mm");
          String dateandtime=dateFormatsd.format(new Date());
          
          SimpleLayout layout = new SimpleLayout(); 
          RollingFileAppender appender = new RollingFileAppender(layout,".\\Logs\\log "+dateandtime+".txt",true);
                                      appender.setMaxFileSize("20MB");
                                      logger.addAppender(appender);
          

          上面的代码会记录每分钟的日志。

          谢谢

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-09-25
            • 2014-08-18
            • 2010-09-30
            相关资源
            最近更新 更多