在osgi maven bundle中以编程方式更改log4j文件名无法正常工作

时间:2014-03-05 12:20:38

标签: java maven log4j apache-karaf

我正在开发一个maven-osgi包并在karaf中部署..在那里,一段代码,应该从karaf / etc获取.cfg文件,并在运行时以编程方式更改它们。在'内调用writeTrace() for loop'来自另一个类。这样我就可以创建不同的文件,并且相应的日志记录应该进入该文件。

   public void writeLog(int i,String HostName) {
    StringBuilder sb = new StringBuilder();
    sb.append("\n  HEADER : \n");
    ....
    String str = sb.toString();
    String logfile = ("/home/Dev/" + HostName + i);
    logger = LoggerFactory.getLogger("TracerLog");
    updateLog4jConfiguration(logfile);
    logger.error(str + i);}


    public void updateLog4jConfiguration(String logFile) {
    Properties props = new Properties();
    try {
        // InputStream configStream = getClass().getResourceAsStream(
        // "/home/Temp-files/NumberGenerator/src/main/java/log4j.properties");
        InputStream configStream = new FileInputStream("etc/org.ops4j.pax.logging.cfg");
        props.load(configStream);       
        System.out.println(configStream);
        configStream.close();
    } catch (IOException e) {
        System.out.println("Error: Cannot laod configuration file ");
    }
    props.setProperty("log4j.appender.Tracer.File", logFile);
    LogManager.resetConfiguration();
    PropertyConfigurator.configure(props);
}

我可以看到使用主机名创建的新文件,例如(hostname_1,hostname_2等等),但只在karaf / etc配置的实际appender上进行日志记录... thaat是log.txt ..

    log4j.logger.TracerLog=TRACE,Tracer
    log4j.appender.Tracer=org.apache.log4j.RollingFileAppender
    log4j.appender.Tracer.MaxBackupIndex=10
    log4j.appender.Tracer.MaxFileSize=500KB 
    log4j.appender.Tracer.File=/home/Dev/log.txt

我对此错误感到震惊..不知道是否必须对karaf或代码问题做些什么.. ???

1 个答案:

答案 0 :(得分:2)

为什么不仅仅使用ConfigurationAdminService而不是更改文件? 只需从注册表中引用配置管理服务,然后使用PID org.ops4j.pax.logging 进行配置。
使用此方法,您将拥有可用于您的提案的所有配置属性,并且您的代码中有更改此属性。您还可以添加新配置条目。最后,ConfigurationAdminService和felix FileInstaller的组合甚至会将您的更改保留在配置文件中。

顺便说一下。你知道有一个用于配置配置的shell命令,所以实际上还要改变org.ops4j.pax.logging服务的配置吗? 做一个:

config:list

检索所有可用配置 和

config:list "(service=org.ops4j.pax.logging)" 

只检索此信息。