自动记录java异常
我编写了一个巨大的Web应用程序,但“忘记”了包含日志记录(我只使用标准的e.printStackTrace()方法打印错误) 我的问题是,是否有任何方法可以自动记录(getLogger.log(severy,“…”)任何抛出的异常? 也许有一个定制的例外工厂,比如在 我想用我的记录器记录每个抛出的异常,例如,在程序进入catch块之前,必须已经记录异常:自动记录java异常,java,exception,logging,Java,Exception,Logging,我编写了一个巨大的Web应用程序,但“忘记”了包含日志记录(我只使用标准的e.printStackTrace()方法打印错误) 我的问题是,是否有任何方法可以自动记录(getLogger.log(severy,“…”)任何抛出的异常? 也许有一个定制的例外工厂,比如在 我想用我的记录器记录每个抛出的异常,例如,在程序进入catch块之前,必须已经记录异常: try{ ... } catch(Exception1 e){ //Exception must have been already l
try{
...
} catch(Exception1 e){
//Exception must have been already logged here (without adding getLogger().LOG(...) every time)
System.out.println(e.printStackTrace());
} catch(Exception2 e){
//Exception must have been already logged here (without adding getLogger().LOG(...) every time)
System.out.println(e.printStackTrace());
}
您可以为主线程和使用方法创建的每个其他线程设置未捕获的异常处理程序,并在那里执行所有必需的日志记录。看看哪些异常处理程序可以在运行时为您喜爱的日志记录框架插入日志记录代码。JDK包含一个包,它可以在类加载期间插入字节码来执行日志记录 否则,您可以安装一个servlet作为调用链中最顶层的过滤器,它将捕获大多数异常
public class LogFilter implements javax.servlet.Filter {
private static final String CLASS_NAME = LogFilter.class.getName();
private static final Logger logger = Logger.getLogger(CLASS_NAME);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
logger.entering(CLASS_NAME, "doFilter", new Object[]{request, response});
try {
chain.doFilter(request, response);
} catch (IOException | ServletException | RuntimeException | Error ioe) {
logger.log(Level.SEVERE, "", ioe);
throw ioe; //Keep forwarding.
} catch (Throwable t) {
logger.log(Level.SEVERE, "", t);
throw new ServletException(t);
}
logger.exiting(CLASS_NAME, "doFilter");
}
@Override
public void destroy() {
}
}我现在也在面对新的更大的项目,并且对消除不必要的代码感兴趣。首先,我想记录方法的每个入口和出口,包括输入和输出数据。在我的事件驱动架构的例子中,我将这些数据推到弹性和连续分析方法处理超时,这是大量的代码行。所以我用AspectJ处理了这个问题。下面是一个很好的例子: 这同样适用于自动错误记录,下面是一个虚拟示例,我将扩展该示例以使用slf4j,但以下是详细信息:
public aspect ExceptionLoggingAspect {
private Log log = LogFactory.getLog(this.getClass());
private Map loggedThrowables = new WeakHashMap();
public pointcut scope(): within(nl.boplicity..*);
after() throwing(Throwable t): scope() {
logThrowable(t, thisJoinPointStaticPart,
thisEnclosingJoinPointStaticPart);
}
before (Throwable t): handler(Exception+) && args(t) && scope() {
logThrowable(t, thisJoinPointStaticPart,
thisEnclosingJoinPointStaticPart);
}
protected synchronized void logThrowable(Throwable t, StaticPart location,
StaticPart enclosing) {
if (!loggedThrowables.containsKey(t)) {
loggedThrowables.put(t, null);
Signature signature = location.getSignature();
String source = signature.getDeclaringTypeName() + ":" +
(enclosing.getSourceLocation().getLine());
log.error("(a) " + source + " - " + t.toString(), t);
}
}
}
我很高兴听到锅炉板代码减少的其他好例子。我当然用的是卢姆博克,它能完成更出色的任务
注意:不要重新发明轮子,因此请查看其他人收集的有用AOP,以便在您的项目中立即重用:-)开源是一个伟大的社区:您能提供一些配置的详细信息吗?你使用spring吗?嗨,没有spring,只是一个好的ol'Logger及其日志级别。所有本地运行的java应用程序(不是web应用程序)都有同样的问题。我非常依赖system.out,当我有一个类似于:public void doSomething()抛出异常{…}的方法时,它在大多数情况下都不可用。如何自动记录异常?我认为这不起作用,因为我已经“捕获”了所有的异常。我只想在抛出任何异常时发送一封电子邮件,告知我我不确定您试图实现的目标是否合理。如果您“忘记”在真正需要的地方包含日志记录,那么这是一个设计缺陷,应该在真正存在问题的地方修复,而不是使用变通方法。请注意,在除最简单的应用程序之外的任何应用程序中,异常在正常的执行流程中都会发生,包括使用的标准库和任何其他库。如果您以这种方式配置应用程序,您的邮箱将充满垃圾邮件。这就是为什么有未捕获的异常处理程序,但没有简单的方法来处理所有异常。所以没有方法拦截扩展?如何在大型web项目中完成ecxeption日志记录?在每个catch子句中只包含Logger.log(…)?异常并不总是意味着应用程序中的错误情况。有些是预期的和完全可恢复的可能控制流的一部分。我不从事web项目(通常),但我认为过程基本相同,将问题记录在那些catch子句中,从应用程序的角度来看,这是有意义的。毕竟,如果你发现了一个异常,那么假设你对此负责是有道理的。未捕获异常处理程序主要用于运行时异常以及程序员故意跳过的那些由
抛出的声明。嗨,我需要一个钩住所有异常的解决方案(我希望在应用程序抛出任何ecxeption时得到通知)。。。你还有其他想法吗?查一下“面向方面编程”。嗨,我想问的是大玩家(如facebook)如何记录他们运行系统的故障?他们是不是每隔一行就放一个Logger.Log(..)呢?@Niko这听起来像是stackoverflow的新问题。