是否有可能在运行时对对象进行一些更改。
我的问题是我有一个类返回logger实例。并且该类只包含一个返回记录器的公共方法。下面是班级..
public class LoggerManager {
public Logger getLogger(String FQCN) {
Logger logger = Logger.getLogger(FQCN);
logger.setLevel(Level.INFO);
return logger;
}
}
现在,如果我想在运行时更改返回的对象,
这意味着logger对象被设置为级别INFO,我希望在程序执行期间只在特定时间调用此代码时将其更改为DEBUG ...而不在任何地方更改代码..这样的事情......
logger.setLevel(Level.DEBUG);
我可以通过任何方式实现这一目标吗?
因为这个类在我的代码中到处使用..大约1000个地方,不用改变代码......有些方法可以实现这个......
答案 0 :(得分:2)
我认为您在询问是否可以在不更改类的情况下更改getLogger(String)
方法的行为。简单的答案是“不,你不能”。
你可以尝试一些技巧:
在当前版本之前的应用程序类路径中将当前版本的不同版本放在当前版本之前。
在加载之前使用BCEL或其他东西来修改类字节码。
但是,这两个都等于改变班级。
我认为您最简单的方法是修改LogManager
类,以便生成具有不同级别的记录器。稍微想一想,您应该能够提出一种不会显着影响代码库其余部分的解决方案。
但是,设置日志记录级别的常规方法是使用配置文件,而不是在应用程序中显式调用setLevel
,这也是值得的。
答案 1 :(得分:1)
是否有可能在运行时对对象进行一些更改
是的,您可以对从方法调用返回的Objects
进行更改。
很难理解你想做什么。如果在返回的记录器上设置调试级别,则应为正在运行的vm中的所有位置设置调试级别,该位置请求具有相同Logger
参数的FQCN
。
答案 2 :(得分:0)
您可以在通话前设置所需的值,然后恢复正常。 Somme日志记录类允许这样做。
I can't be specific here because your didn't say exactly what your Logger class is (Log4j ?).
这个logger类似乎被称为静态方法。 因此,如果您的系统中有任何线程(例如,如果使用Tomcat或使用后台线程),修改级别是不安全的(它将为您修改,但也适用于所有线程)。
但是,问题的通常选项是不更改级别。 如果要显示日志,请执行以下操作:
答案 3 :(得分:0)
可以使用AOP来完成它,但它是相当复杂的。 AOP允许您处理前后方法调用。
我不确定为什么你的单个项目中必须有超过1000个地方的getLogger。你有超过1000个班级吗?通常,您只需要为每个类调用一次。我也会改变代码并重新设计overcalling到这个方法。