除了执行CTRL+H 并找到所有e.printStackTrace(); 并替换它们之外,您还可以通过创建记录器工厂来采取另一种策略。
public class LoggingFactory {
private static LoggingFactory instance;
private Map<Class, Logger> loggers;
public static synchronized LoggingFactory getInstance() {
if(instance == null) {
instance = new LoggingFactory();
}
return instance;
}
public static Logger getLogger(Class clazz) {
synchronized (clazz) {
if(getInstance().loggers.get(clazz) == null) {
getInstance().loggers.put(clazz, Logger.getLogger(clazz.getName()));
}
return getInstance().loggers.get(clazz);
}
}
}
使用这个类,您可以对一些正则表达式进行全局搜索和替换,例如
([\w\d]+)\.printStackTrace\(\);
替换成
LoggingFactory.getLogger(this.getClass()).error($1);
执行此操作时,请确保仔细查看弹出窗口提供的选项并选中正则表达式复选框!
结果将是这样的
e2.printStackTrace(); 变为 LoggingFactory.getLogger(this.getClass()).error(e2);
现在这仍然会在已替换静态方法的地方留下一些错误,但您可以返回并手动修复这些错误。
编辑
我觉得这里有点愚蠢,但在再次查看这个问题后我意识到大多数日志 API 已经建立在工厂设计之上。如果您使用自定义 Logger 或者他们获取/创建 logger 的方法不足以进行正则表达式替换,上述答案仍然有效,并且可能会使您受益。
因此,如果您使用的是 log4j,您可以简单地用这个正则表达式代替而不使用 LoggingFactory:
org.apache.log4j.Logger.getLogger(this.getClass()).error($1);