如何将System Propery值用作记录器处理程序模式的一部分

时间:2017-04-25 13:34:37

标签: java logging java.util.logging

我使用java.util.logging.logger作为我的应用程序的日志记录引擎。我想将一个系统属性设置为handler.properties文件中提到的处理程序模式的值的一部分,如下所示,

int main(void){

        struct region * ptr = mmap(NULL, MAX_LEN*sizeof(struct region), PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED,-1,0);
        pid_t pid = fork();
        if (pid == 0){

                usleep(1500000);
                ptr[33].len = 42;

        }else if (pid > 0){

                usleep(1000000);
                printf("Value before: %d\n", ptr[33].len);
                usleep(1000000);
                printf("Value after: %d\n", ptr[33].len);

        }else{
                printf("Error: fork\n");
        }

        return 0;
}

我尝试设置上面的值,但它没有解析custom.home属性而是将其用作字符串并在初始化处理程序时给出以下错误

java.util.logging.FileHandler.pattern = path/${custom.home}/logs/server.log

有没有办法达到这个要求?

由于 达内什

2 个答案:

答案 0 :(得分:1)

路径路径/ $ {custom.home} /logs/server.log不存在! 使用:

`java.util.logging.FileHandler.pattern = "path/"+`System.getProperty("user.home")+"/logs/server.log";

代替。 但是eclipse说:" FileHander.pattern不可见!"

答案 1 :(得分:1)

根据您的问题,我假设您已手动设置名为custom_home的系统属性作为启动参数。然后,您可以继承java.util.logging.FileHandler以识别新的模式语法:

public class EnvFileHandler extends FileHandler {

    private static String pattern() throws IOException {
        String prefix = EnvFileHandler.class.getName();
        String v = LogManager.getLogManager().getProperty(prefix +".pattern");
        return v.replace("${custom_home}", System.getProperty("custom_home", "%hjava.log"));
    }

    public EnvFileHandler() throws IOException {
        super(pattern());
    }
}

然后使用logging.properties安装FileHandler子类,而不是安装FileHandler。

.handlers=package.of.EnvFileHandler
package.of.EnvFileHandler.pattern=path/${custom_home}/logs/server.log

如果您尚未设置此自定义属性,则此代码示例将默认为主目录。