(转)http://www.infoq.com/cn/articles/why-and-how-log
程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态。好的日志记录方式可以提供我们足够多定位问题的依据。日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事情。这里列举下面三个方面的内容,辅以代码示例,总结如何写好日志,希望对他人有所启发和帮助:
- 怎样记日志可以方便Troubleshooting
- 程序运行状态可以记哪些
- 应该避免怎样的日志方式
怎样记日志可以方便Troubleshooting?
1. 对外部的调用封装
程序中对外部系统与模块的依赖调用前后都记下日志,方便接口调试。出问题时也可以很快理清是哪块的问题
1. LOG.debug("Calling external system:" + parameters);
2. Object result = null;
3. try {
4. result = callRemoteSystem(params);
5. LOG.debug("Called successfully. result is " + result);
6. } catch (Exception e) {
7. LOG.warn("Failed at calling xxx system . exception : " + e);
8. }
2.状态变化
程序中重要的状态信息的变化应该记录下来,方便查问题时还原现场,推断程序运行过程
1. boolean isRunning;
2.
3. isRunning = true;
4. LOG.info("System is running");
5.
6. //...
7.
8. isRunning = false;
9. LOG.info("System was interrupted by " + Thread.currentThread().getName());
3.系统入口与出口:
这个粒度可以是重要方法级或模块级。记录它的输入与输出,方便定位
1. void execute(Object input) {
2. LOG.debug("Invoke parames : " + input);
3. Object result = null;
4.
5. //business logic
6.
7. LOG.debug("Method result : " + result);
8. }
4.业务异常:
任何业务异常都应该记下来:
1. try {
2. //business logical
3. } catch (IOException e) {
4. LOG.warn("Description xxx" , e);
5. } catch (BusinessException e) {
6. LOG.warn("Let me know anything");
7. } catch (Exception e) {
8. LOG.error("Description xxx", e);
9. }
10.
5.非预期执行:
为程序在“有可能”执行到的地方打印日志。如果我想删除一个文件,结果返回成功。但事实上,那个文件在你想删除之前就不存在了。最终结果是一致的,但程序得让我们知道这种情况,要查清为什么文件在删除之前就已经不存在
1. int myValue = xxxx;
2. int absResult = Math.abs(myValue);
3. if (absResult < 0) {
4. LOG.info("Original int " + myValue + "has nagetive abs " + absResult);
5. }
6.很少出现的else情况:
else可能吞掉你的请求,或是赋予难以理解的最终结果
1. Object result = null;
2. if (running) {
3. result = xxx;
4. } else {
5. result = yyy;
6. LOG.debug("System does not running, we change the final result");
7. }
程序运行状态可以记哪些?
程序在运行时就像一个机器人,我们可以从它的日志看出它正在做什么,是不是按预期的设计在做,所以这些正常的运行状态是要有的。
1. 程序运行时间:
1. long startTime = System.currentTime();
2.
3. // business logical
4.
5. LOG.info("execution cost : " + (System.currentTime() - startTime) + "ms");
2. 大批量数据的执行进度:
1. LOG.debug("current progress: " + (currentPos * 100 / totalAmount) + "%");
3.关键变量及正在做哪些重要的事情:
执行关键的逻辑,做IO操作等等
1. String getJVMPid() {
2. String pid = "";
3. // Obtains JVM process ID
4. LOG.info("JVM pid is " + pid);
5. return pid;
6. }
7.
8. void invokeRemoteMethod(Object params) {
9. LOG.info("Calling remote method : " + params);
10. //Calling remote server
11. }
应该避免怎样的日志方式?
1. 混淆信息的Log
日志应该是清晰准确的: 当看到日志的时候,你知道是因为连接池取不到连接导致的问题么?
1. Connection connection = ConnectionFactory.getConnection();
2. if (connection == null) {
3. LOG.warn("System initialized unsuccessfully");
4. }
2. 记错位置
产品代码中,使用console记录日志,导致没有找到日志。
1. } catch (ConfigurationException e) {
2. e.printStackTrace();
3. }
3. 记错级别
记错级别常常发生,常见的如:混淆代码错误和用户错误,如登录系统中,如果恶意登录,那系统内部会出现太多WARN,从而让管理员误以为是代码错误。可以反馈用户以错误,但是不要记录用户错误的行为,除非想达到控制的目的。
1. LOG.warn("Failed to login by "+username+");
4. 遗漏信息
这里可能包含两种情况:(1)用户自己少写了信息,导致毫无参考价值;(2)用户调用log的方式导致丢失信息,如下例,没有stack trace.
1. } catch (Exception ex) {
2. log.error(ex);
3. }
总结:
日志记录在程序员日常编程实践中必须面对的事情,本文针对这个话题谈了下自己的体会,希望读者能有所收益。多有不足,请多包涵。
参考文献
http://www.infoq.com/cn/articles/10-java-questions-easy-to-ignore
分享到:
相关推荐
目前记录日志的方法存在两大缺点:速度慢和程序崩溃时容易丢失信息。本文从这两点着手,使用内存映射文件API,设计出一套更快速、更稳定的日志生成方法。实验结果表明,该方法记录日志的最低耗时,仅是执行四字节...
日志记录: 日志记录在程序设计开发过程中,是非常重要的,可以供调试和记录数据,虽然说有开源的强大日志管理系统,比如apache的Log4Net,功能可谓强悍,但是有时候,不需要这么大的日志,只需要显示和文件记录就...
log4j提供分级方法在程序中嵌入日志记录语句。日志信息具有多种输出格式和多个输出级别。 使用一个专门的日志记录包,可以减轻对成千上万的System.out.println语句的维护成本,因为日志记录可以通过配置脚本在运行时...
这个代码实现了一个简单的应用程序,并使用了Logback日志框架来记录程序的运行日志。首先,我们通过调用...这个例子展示了如何使用Java的日志框架来实现应用程序的日志记录功能,可以提高程序的可维护性和可追踪性。
两个方法的作用一样,主要区别在于,AppFileLog()用于记录程序运行过程中的日志,ConfigFileLog()用于记录读取配置文件时的日志。其使用是在其构造函数中给定路径,在方法的参数中直接给定信息。
小程序名称为心邮,这是一款发布日志和心情的小程序。用来倾诉烦恼、分享快乐。 使用步骤: 第一步:创建项目,记得填入你自己的AppId(必须填入AppId,不然无法调用wx.login())。 第二步:下载该demo。 第三步:在...
需要改进的地方:1、报表的现实功能,目前实现的报表是通过自己设置的,如果日志记录太长,显示不全。2、报表的打印功能,目前报表的打印只能通过判断选择的打印机进行打印,其他的打印的基本调整还没有,需要增加...
Android Gps日志记录程序源码
操作系统和许多程序会产生各种错误信息、警告信息和其他的提示信息,这种信息会记录到日志里面。系统日志里面有很多东西可以被我们进行分析,所以我们需要对产生的日志进行分析。本次的任务是统计出apache访问日志中...
labview操作logger,日志记录
用户可以输入指定的日志块序号,程序从指定的日志块往下浏览,可以快速定位需要查看的日志记录 . 2:\ 从日志恢复误删除的数据。在对应的日志记录上右键,弹出菜单,点 <浏览数据> .可以查看事务删除的数据.
Delphi编写的日志记录组件源代码,从中可以学习自定义组件的一些技巧,如注册到组件面板、添加自定义图标等。 日志组件具有以下属性及方法: public { Public declarations } procedure AddLog(p_Info: string); /...
本人最近由于要管理很多终端,有时候终端死机,网络不通,于是乎写了一个监控程序,c#+xml多线程测试Ip是否ping通,然后记录日志,查询状态,增、删、改、查Ip和对应位置信息,可以最小化到托盘,回车添加记录,要想...
事件记录:日志文件用于记录应用程序的关键事件和操作,如启动、关闭、用户登录、数据操作等。这些事件记录对于追踪应用程序的运行状态和行为非常有用。 错误和异常信息:日志文件用于记录应用程序的错误和异常情况...
Android Gps日志记录程序源码,真实有效的不错源码,本人不要积分但求好评,谢谢大家!希望多关注。
Android 基础开发 Gps日志记录程序源码 个人觉得还是比较完善的
微信小程序获取用户在小程序内的操作日志,已经独立封装在此js文件。可以直接使用,不影响原来的项目架构。把这个功能封装成了一个独立的js工具。使用方法详见博客:...
安卓开发中常见的日志功能,有时候需要记录方法的调用和记录错误的发生,必不可少的要将log写入到设备本地,此文件就是为了方便写日志。通过封装好的工具类,在开发者需要记录日志的地方,一行代码即可写日志到设备...
AndroidGps日志记录程序源码.zip
用户可以输入指定的日志块序号,程序从指定的日志块往下浏览,可以快速定位需要查看的日志记录 . 2:\ 从日志恢复误删除的数据。在对应的日志记录上右键,弹出菜单,点 <浏览数据> .可以查看事务删除的数据.