开发Java项目时如何捕获、抛出异常并打印日志?
作者:Java3y
1.Java日志记录基础知识
以前自学的时候,我只写了下面的代码来解决问题:
try {
// doSomething
} catch (Exception e) {
e.printStackTrace();
}
----------
// 查看某个数据的值时:
System.out.println(xxxx);
,去公司的时候我发现上面的代码全部消失了,只剩下:
LOGGER.info("begin to run Java3y:{}", id);
----
LOGGER.error("excepiton occurs when run Java3y {}, exception{}", id, e.toString());
如果使用e.printStackTrace();
,不方便分析控件中打印的信息:
并且我们记录下信息在服务器磁盘上调整至 级别和时间
。如果出现问题,可以根据对应的信息找到相关的日志(这样排查问题非常方便):
我们再看一下一般的日志是什么样的:
例如:现在有人来宣布某个用户显然无法接收短信,并给出发送时间和用户ID,在日志中我们可以找到该用户在我们系统中的发送状态(例如:status:81图中我们认为发送成功状态)
那么问题来了,我们在哪里注册?答案其实已经给了《手册》:
认真记录日记。生产环境中禁用调试日志输出;有选择地打印信息日志;如果首次运行时使用
使用警告记录交易行为信息,一定要注意日志的输出量,避免消耗服务器磁盘
爆炸 ,不要忘记这些观察日志及时删除。
输出大量无效日志无助于提高系统性能或快速找到错误点。写日记的时候请想:这些
日记真的有人看吗?查看此日志后您可以做什么?它可以提供故障排除的好处吗? 1.1 什么是 RBI?
最常见的登录方式是在程序启动时打印相关信息,用于快速排除故障。我一开始是这样理解的,但其实还可以扩展。
在我现在正在开发的系统中,我们还使用协议在系统的启动链接上点。例如,现在我想发送一条通知消息。通知消息其实是这样的:
流程是这样的:
- 首先别人调用我的RPC提供的接口(或者我调用自己的接口),发现这是一条通知消息。于是我编译了相应的任务,异步放入消息队列中
- 另外一个系统把任务从消息队列中拿出来,做了该任务的业务处理(比如晚上是否阻塞,或者强制发送,等等..),然后调用HTTP接口会把这个任务传递给下游
- 其实下游做的事情有很多,整个链路很长(比如你需要调用SDK库,Android和IOS做不同的处理)

并且希望之后能够统计一些指标(曝光度、点击率、转化率)等等推送完成。因此,有必要在一些关键位置进行记录(专业点称为点)
打开整个链接后,将这些点放在实时流媒体上用于清理/过滤的处理平台(storm /flink)。如果实时需要,就放在Redis中,如果离线需要,就放在Hive中。 ? API采用协议框架门面模式,有助于维护性和统一各个类的协议处理方式。
Facade 模式 我也已经写了一篇笔记:三分钟学会 Facade 模式!
其实说白了,我希望将API层抽象出来,这样在切换特定日志框架时就不需要做大量的改动。
学习 JDBC 时我们就明白这一点:
无论我连接到 MySQL、Oracle 还是 SQL Server,我的接口始终是相同的。当我切换数据库时,我不需要更改我的 Java API。
看了一下公司的项目,发现他们使用SLF4J+Logback
2.2调用RPC接口,使用Throwable类来捕获调用
【必填】相关RPC包或者动态生成的类时捕获异常,必须使用 Throwable
类来捕获它们。
之前排错的时候,有一个问题解决不了,而且调试的时候从来没有进入过catch模块。后来我长辈说:“为什么不改成Throwable呢?
try {
} catch (Throwable e) {
}
我很疑惑,说:“为什么要改成Throwable呢?难道我们不能使用异常来捕获所有异常吗? Exception 是 Throwable 的子类,但是 Exception 已经包含了 Java 的所有异常。”
众所周知,Throwable 有两个子类:
- Error(一般我们会忽略它...通常情况下,如果发生错误,程序不会启动)
- Exception
Throwable 类是 Java 中所有错误和异常的超类
也可在 《手册》上面的规则说明:❙❀描述:Ἴ方法通过自反机制。如果找不到该方法,则会引发 NoSuchMethodException。什么情况下会引发
NoSuchMethodError? 当双方的包与类冲突时,仲裁机制可能会引入意外的版本,导致类方法签名不匹配
,或者字节码修改框架(如ASM)导致相应的方法签名发生变化)动态创建或修改类。 ?当使用方形包或动态生成的类时,可以直接抛出错误,但无法捕获catchException。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。