log4j 输出完整 e.printStackTrace() 同等异常信息

本文介绍了一种将异常信息转换为字符串并使用log.error()输出到log4j日志文件的方法,包括异常捕获、字符串转换和日志记录流程。
部署运行你感兴趣的模型镜像

public void erroStackTrace(Object obj) {
		if (obj instanceof Exception) {
			Exception eObj = (Exception) obj;
			StringWriter sw = null;
			PrintWriter pw = null;
			try {
				sw = new StringWriter();
				pw = new PrintWriter(sw);
				String exceptionStack = "";
				eObj.printStackTrace(pw);
				exceptionStack = sw.toString();
				logger.error(exceptionStack);
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					pw.close();
					sw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		} else {
			logger.error(obj);
		}
	}

 将异常信息转换成String 再通过 log.error(); 输出到 log4j 的日志文件

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

Java 中,`e.printStackTrace()` 默认会将异常信息输出到控制台,而无法直接写入日志文件。如果希望将 `e.printStackTrace()` 的输出记录到日志文件中,可以通过将异常信息捕获为字符串,再使用日志框架(如 Log4j、Logback 或 `java.util.logging`)写入日志文件。 ### 使用 ByteArrayOutputStream 捕获异常信息 一种常见的方式是利用 `ByteArrayOutputStream` `PrintStream` 来捕获 `e.printStackTrace()` 的输出内容,并将其转换为字符串,然后通过日志记录器写入日志文件: ```java import java.io.ByteArrayOutputStream; import java.io.PrintStream; public class ExceptionLogger { public static void logException(Exception e) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); e.printStackTrace(new PrintStream(baos)); String exceptionMessage = baos.toString(); // 假设使用 java.util.logging java.util.logging.Logger logger = java.util.logging.Logger.getLogger(ExceptionLogger.class.getName()); logger.severe(exceptionMessage); // 将异常信息记录到日志中 } } ``` 该方法能够获取完整的异常堆栈信息,包括异常类型、消息调用堆栈,适用于需要将完整异常信息写入日志的场景 [^1]。 ### 使用日志框架直接记录异常对象 如果使用的是 Log4j、Logback 等日志框架,可以直接将异常对象作为参数传入日志记录方法中,框架会自动处理堆栈信息: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Example { private static final Logger logger = LoggerFactory.getLogger(Example.class); public static void main(String[] args) { try { // 模拟异常 String str = null; System.out.println(str.length()); } catch (NullPointerException e) { logger.error("发生异常", e); // 直接传入异常对象,日志框架自动记录堆栈信息 } } } ``` 这种方式更为简洁,且能够保证日志格式统一,适用于大多数日志系统 [^2]。 ### 自定义工具类提取异常信息 在某些项目中,可能会封装一个工具类来提取异常信息,例如 `ExceptionUtil.getMessage(e)`,以便在日志中输出更结构化的信息: ```java import java.io.PrintWriter; import java.io.StringWriter; public class ExceptionUtil { public static String getMessage(Exception e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); return sw.toString(); } } ``` 之后可以在日志中使用该方法: ```java log.error(ExceptionUtil.getMessage(e)); ``` 这种方法适用于需要对异常信息进行预处理或格式化后再记录的场景 [^3]。 ### 与 e.printStackTrace() 的区别 `e.printStackTrace()` 会直接将异常信息输出到标准错误流(通常是控制台),而日志记录方法(如 `log.error()`)会将信息写入日志文件或发送到其他日志收集系统。此外,日志记录方法支持日志级别控制、格式化输出、异步写入等功能,更适合生产环境使用 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值