Java中Exception log的使用

本文探讨了Java中异常日志的重要性和正确使用方法。详细介绍了Exception对象的使用,包括Cause和StackTrace属性的作用,以及如何避免日志滥用。适合各阶段Java开发者参考。

 


Java Exception信息的日志输出


http://fly-hyp.iteye.com

这篇文档是用word写的,web格式不完整如需要请看附件



1.概要

这篇文章讲的是Java中异常日志的主题,主要是讲他们在所有软件过程中如何帮助调试错误的。如果您是初级的Java水平,这篇文章会指导您如何使用日志(Log4j)和异常。如果您是资深的Java工程师,和我一样,一定也遇到整个项目团队关于异常日志滥用的行为。您也希望给初级工程师写一个指导,帮助大家用好异常日志,或想使项目中规范使用,这篇文章也是为探讨这些的。

Java中日志(Log )和异常(Exception)是两项基本的功能。来到公司我也看了不少的现有代码,发现大家的使用方式是不太一样的,也存在一些明显的误用。


2.基础


使用例子

因为大家的开发习惯等不一样,所以异常日志的使用方式也会不一样,先和我一起看看典型例子吧。


例如:






3.异常日志在软件开发流程中的位置

 

异常是Java提供的异常的处理流程方式,但发生异常时Exception类的内部信息就是为了显示异常发生的来龙去脉了。所以Exception的各种属性信息一定要好好理解清楚。

Log就是记录日志、使用日志。现在我做的各种项目中用的最多的就是Log4j。日志有很多种用途,记录程序运行的错误肯定是最重要的。

下面我讲一下Log记录错误的原理。

Log中的记录错误可以分为:

非程序原因的错误(网络错误、用户输出入错)

程序原因的错误

已知的

可做简化处理

未知的

应该记录完备,不要丢失有用的信息。



4.Exception对象使用详解

Cause属性:用于存放内部异常对象信息

Throwable

getCause() 

Throwable

initCause(Throwable cause) 


StackTrace属性:用于存放异常对象建立时的运行堆栈信息(可以被修改)

StackTraceElement[]

getStackTrace() 

void setStackTrace(StackTraceElement[] stackTrace) 


强调一点,如果是因为捕获了异常而要抛出新的异常千万不要丢失内部异常信息(因为内部异常对象才是Root Cause)。有两种方式保存内部异常对象。

可以在创建异常对象时传入内部异常对象

Throwable(String message, Throwable cause)

Throwable(Throwable cause)

通过cause记录内部异常的异常打印效果


在创建新的异常后调后setStackTrace设置内部堆栈信息


无论哪种方式,只要内部异常堆栈没有丢失,就非常容易找到发生错误的代码。显示方式只是习惯问题。当然,最好在一个软件项目中可以制定规范,遵从某一种风格。


5.异常日志的输出流程


6.一些技巧

1. 对于已知不是程序内部错误的异常,可以不要打印错误信息。至少不要打印为了定位错误错误的异常堆栈的信息

例如:用户输入错误、已知的网络错误等

2. 对于大型软件(或访问量大)特别要注意日志的量(不要打的太多)。

3. 普通的调试日志还是在适当的时候删掉为好。

4. Log4j,在Dev环境让所有输出都定向到控制台,以方便查看。将下面文件放在类路径下。


 

 

### JavaLog 打印 Exception 的原因及解决方法 在 Java 开发中,日志记录是调试和维护应用程序的重要工具。当程序运行时发生异常(Exception),通过日志打印这些异常可以帮助开发人员快速定位问题并修复错误。以下是关于 Java 日志打印异常的原因及解决方案的详细说明。 #### 1. 异常日志打印的重要性 异常日志打印的主要目的是捕获程序运行过程中发生的错误,并将其记录下来以便后续分析。如果没有正确地记录异常信息,可能会导致问题难以追踪甚至无法复现[^2]。例如,在某些情况下,程序可能因未捕获的异常而崩溃,或者因异常处理不当而导致数据丢失或系统不稳定。 #### 2. 常见的日志框架 Java 中常用的日志框架包括 Log4j、SLF4J 和 Apache Commons Logging 等。这些框架提供了灵活且强大的功能来记录日志信息。以下是一个使用 Log4j 记录异常的示例: ```java import org.apache.log4j.Logger; public class Example { private static final Logger logger = Logger.getLogger(Example.class); public void process() { try { // 模拟可能抛出异常的操作 int result = 10 / 0; } catch (ArithmeticException e) { logger.error("Arithmetic exception occurred", e); } } } ``` 上述代码中,`logger.error` 方法不仅记录了错误消息,还通过传递 `e` 参数将完整的堆栈信息一并记录下来。 #### 3. 异常日志打印的具体原因 异常日志打印失败或不完整通常由以下几种原因引起: - **未正确配置日志级别**:如果日志框架的级别设置为 `INFO` 或更高,那么 `DEBUG` 或 `TRACE` 级别的日志将不会被记录[^1]。 - **缺少异常堆栈信息**:仅记录异常消息而不包含堆栈跟踪会导致调试困难。例如,`logger.error(e.getMessage())` 只会记录错误消息,而不会包含完整的堆栈信息[^2]。 - **日志框架配置错误**:如果日志框架的配置文件(如 `log4j.properties` 或 `logback.xml`)缺失或配置错误,可能导致日志无法正常输出[^1]。 #### 4. 解决方案 针对上述问题,可以采取以下措施: - **确保日志级别正确**:根据需求调整日志框架的级别配置。例如,在开发阶段可以将级别设置为 `DEBUG` 或 `TRACE`,而在生产环境中设置为 `ERROR` 或 `WARN`。 - **完整记录异常信息**:始终在记录异常时传递异常对象本身,而不是仅仅记录其消息。例如,使用 `logger.error("Error message", e)` 而不是 `logger.error(e.getMessage())`[^2]。 - **检查日志框架配置**:确保日志框架的配置文件正确无误,并且路径可访问。例如,Log4j 需要 `log4j.properties` 文件,而 Logback 需要 `logback.xml` 文件。 #### 5. 示例:完整记录异常信息 以下是一个使用 SLF4J 和 Logback 的示例,展示了如何正确记录异常信息: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LoggingExample { private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class); public void execute() { try { // 模拟可能抛出异常的操作 String nullString = null; nullString.length(); } catch (NullPointerException e) { logger.error("Null pointer exception occurred", e); } } } ``` 上述代码中,`logger.error` 方法将异常对象 `e` 作为参数传递,从而确保完整的堆栈信息被记录下来。 #### 6. 避免异常日志滥用 虽然日志记录非常重要,但也需要注意避免过度使用。过多的日志信息可能导致性能下降,并使关键问题难以发现。因此,建议遵循以下原则: - 仅在必要时记录异常信息。 - 使用适当的日志级别记录不同类型的日志信息。 - 定期清理旧的日志文件以节省存储空间[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值