我需要传递一些值来启用may app中的某些代码(在这种情况下,可选择在某些条件下将某些统计信息写入文件,但通常可能是这样)。
我的Java应用程序已作为服务安装。所以我想到的每一种方式都有一些缺点:
所以我想也许有一些方法(或黑客)使用log4j记录器将该值传递给我的代码。我已经想过一种方法,虽然非常有限:
在我的代码库com.dummy.DevOptions
中添加一个虚拟类public class DevOptions { public static final Logger logger = Logger.getLogger(DevOptions.class);
在我的代码中,使用它如下:
if(DevOptions.logger.isInfoEnabled()){ //做我的可选东西 } // ... if(DevOptions.logger.isDebugEnabled()){ //做其他的事 }
这允许我在各种值之间使用区别对象,我可以通过向DevOptions添加更多记录器来增加数量。但我想知道是否有更简洁的方法,可能只在log4j.xml中配置记录器?
答案 0 :(得分:0)
在log4j中你根本不需要Java类来创建记录器(这可能会让人感到意外)。您只需要一个包限定字符串,而不是创建记录器类别的Java类。如果我是你,我会做以下
PS:代码无法保证编译/运行
public class SomeAppCode {
public static final Logger specialLogger = Logger.getLogger("com.mypackage.mysubpackage.speciallogger");
public void someMethod() {
if(specialLogger.isDebugEnabled()) {
//do low level stuff
}
}
}
在你的log4j.xml中为这个提到的字符串添加一个类别,如果你想要你可以将“additivity”设置为true / false(取决于你是否要将此日志消息传播到多个loggerS)
PS:注意,specialLogger是公共静态的,可以被100多个类使用,就像它们自己的记录器一样。
答案 1 :(得分:0)
好吧我觉得我找到了我需要的东西,实际上并不那么难......
public class DevOptions{
public static boolean isEnabled(String myvalue){
Logger logger = Logger.getLogger(myvalue);
return logger.isDebugEnabled();
}
}
public class SomeAppCode {
public void someMethod() {
if(DevOptions.isEnabled("value.A")) {
//do low level stuff
}
}
}
我可以在log4j.xml中添加尽可能多的值,例如value.A:
<logger name="value.A" additivity="true"><level value="debug" /></logger>
这样我只需修改log4j.xml即可添加任意数量的值,无需向DevOptions添加更多记录器,只需要一个就足够了。