程序员的修养 -- 如何写日志(logging)

 

在程序中写日志是一件非常重要,但是很容易被开发人员忽视的地方。写好程序的日志可以帮助我们大大减轻后期维护压力。

在实际的工作中,开发人员往往迫于的巨大时间压力,而写日志又是一个非常繁琐的事情,往往没有引起足够的重视。

如果我们的开发人员在一开始就养成一个良好的习惯将非常有帮助。并且在实际的工作中也应当为写日志预留足够的时间。

 

我们为什要写日志呢?

一般来讲,我们在程序中记录日志出自下面几个方面的需求。

 

* 记录用户操作的审计日志,甚至有的时候就是监管部门的要求。

* 快速定位问题的根源,

* 追踪程序执行的过程

* 追踪数据的变化

* 数据统计和性能分析

* 采集运行环境数据

 

多数情况下,在我们的程序上线(Go Live)之后,一旦发生异常,我们要做的第一件事就是要弄清楚当时倒底发生了什么,

例如:用户当时做了什么操作,环境有无异常,数据有什么变化,是不是反复发生,等等。

然后再进一步的确定大致是哪个方面的问题。 确定是程序的问题之后再交由开发人员去重现,研究,提出解决方案。

 

这个时候日志就给我们提供了第一手的资料。

 

在生产环境和测试环境分开的情况下,在开发人员拿到日志的时候离问题发生已经过去很长时间。

所以清晰详尽的日志信息对于我们迅速定位问题根源就显得非常重要。它既是我们找寻原因的地图,也是最直接的证据。

对于稍大一点的系统来讲,做维护的人员和开发者通常都不是同一组人,这个过程所花费的时间和人力要远远超过开发本身数倍甚至数十倍。

 

都有哪些人要看日志?

正如前面所讲,产品支持,运维人员,开发人员,测试人员都需要查看日志。当然自己也是要看的。

 

写日志有些什么要求?

上面需求对我们在程序中记录日志提出了一定的要求:

 

* 日志的可读性

日志是给人读的,不仅仅是让自己明白同时也要让没有接触过我们源代码的其他程序员也能够一目了然。

我常常见到很多同事在日志中打印特殊的标识符号,例如 “+++++++++++”,“--------------”和“==============”,这些符号往往让人眼花缭乱。他们的本意也仅仅是在自己调试的时候能一眼就发现这是自己的日志。既然如此,把自己名字写入日志中岂不是更明确?

把日志分类输出到不同的文件中也有利于我们排除干扰,迅速找到我们需要的信息。

 

* 日志的性能

无论我们把日志写到文件还是数据库,都需要消耗IO资源。适当的控制日志的输出也有利于提高程序的性能。例如:

尽量避免在在大的循环中打印意义不大的日志内容。

输出日志之前最好能判断日志的级别(例如. debug前先调用isDebugEnabled()作出判断)。

* 占用的磁盘空间

通常,我们都是把日志写入磁盘上的日志文件中。适当的使用滚动日志并且定时清除旧文件是有好处的。

我见过这样一个例子,程序运行几次后就跑不起来了,前几次都是正常的。怎么都想不明白程序有什么问题,最后才发现居然是日志文件占满了磁盘空间。

在实际的应用中出现上G的日志文件也往往不少见。要在这样规模的日志文件中找出对解决问题有用的信息也是一大挑战。

 

* 日志的时效性

有的时候我们并不能及时的发现问题。需要追溯之前的日志。所以我们是需要保留一段时间以内的日志便于追溯。

 

* 日志的级别

通常我们在产品环境中日志的级别都在INFO以上,所以我们必须保证在这样的情况下程序仍然能够输出足够我们作出判断的信息。

 

* 日志的内容

我们在写日志的时候,需要注意输出适当的内容。

首先,尽量使用业务相关的描述。我们的程序是实现某种业务的,那么就最好能描述清楚这个时候走到了业务过程的哪一步。

其次,避免在日志中输出一些敏感信息,例如用户名和密码。

以及,要保持编码的一致。如果不能保证就尽量使用英文而不是中文。这样当我们拿到日志之后就不会因为看到一堆乱码而不知所云了。

怎么样写出好的日志来?

其实写好日志并不难,只要我们能在写代码的时候能体会到后面的维护工作的压力和艰辛,多点关注和理解就一定能做好这件事。

时间: 2024-10-12 20:50:57

程序员的修养 -- 如何写日志(logging)的相关文章

程序员简历应该怎么写?

作者:ThoughtWorks中国链接:https://www.zhihu.com/question/25002833/answer/158108028来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 大家伙让一让,这个问题让老司机先答!作为一个潜入IT圈五年之久.看过数万份简历的HR,在这个问题上还是有点发言权的.HR在筛选简历时主要从公司需求出发,重点不一,不过还是有很多"通用"的套路,为了在30秒内判断出这份简历是否值得跟进,我认为程序员写简历的正确

不要相信程序员在加班时间写的代码

不要相信一个程序员在加班时间写出来的代码. (软件工程的学说表明,连正常时间好好写的代码,也不要太相信.不过这不是本文的重点,略过不提.) (不懂代码的人,看到本文中的Java代码可以略过,不影响理解.) 创造力的时限 写代码,与写文章.绘画.思考复杂问题,并没有本质上的区别,都是创造性的活动. 每个人的创造力,都会随着身体状态而波动.广为人知的是,一个人年老体衰后,相比年富力强时,创造力会急剧下降.其实,人每天的状态起伏,也同样会剧烈影响这一点. 如果是拧螺丝,那么在精疲力尽.拧不动以前,身体

当程序员说“这代码写的可真烂”,他们的意思是“这烂代码不是我写的”。而当他们说这段代码有些“小问题”时,很可能这代码是他们自己写的

英文原文:What Programmers Say vs. What They Mean 你是否听到过同事说“这段代码不言自明”?你的同事的这句话的实际意思是这段代码不需要写注释. 你也许注意到了,很多时候,程序员所说的话的字面意思和其真实的意思是完全不同的.不用惊异,下面你将很快知道这些暧昧的短语和其深层次的意思都是什么. 最近 Imgur 上出现了一张图片,里面列举的程序员的一些专业术语和其含义,它能很好的帮助你理解这些话的真实意思.这里是对其中的精华进行的总结. 典型的程序员之间的对话 当

(转)程序员简历该怎么写

* 没有必要撒谎 写简历最差的策略就是撒谎了.这种欺骗本身就自相矛盾.你到底希望和聪明人共事呢,还是笨人呢?大多数人希望和聪明人共事,但是聪明人你骗得了么, 或者说被你骗了的算是你认为的聪明人么?你要和想找好工作, 基本假设就是大家都是明白人不好骗的.看简历的人也上过学,也写过简历,更清楚其中的注水手段,以为自己能吹牛过关,大部分都是自取其辱.即便你过了简历 筛选一关,也没那么容易,面试时候肯定会问你那些你写的东西,你答不上来,面试官还会觉得你 人品有问题.有的同学说多参加几次面试不好么,好,但

程序员级别鉴定书 ----会写代码级别

线程跟进程 一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程,使得多线程程序的并发性高. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率. 线程在执行过程中跟进程有区别 线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制 进程具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.

千万不要相信程序员在加班时间写的代码!

其中最重要的就是这条:不要相信一个程序员在加班时间写出来的代码. (软件工程的学说表明,连正常时间好好写的代码,也不要太相信.不过这不是本文的重点,略过不提.) (不懂代码的人,看到本文中的Java代码可以略过,不影响理解.) 创造力的时限 写代码,与写文章.绘画.思考复杂问题,并没有本质上的区别,都是创造性的活动. 每个人的创造力,都会随着身体状态而波动.广为人知的是,一个人年老体衰后,相比年富力强时,创造力会急剧下降.其实,人每天的状态起伏,也同样会剧烈影响这一点. 如果是拧螺丝,那么在精疲

每个 Python 程序员都要知道的日志实践

在现实生活中,记录日志非常重要.银行转账时会有转账记录:飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切.如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么. 对于系统开发.调试以及运行,记录日志都是同样的重要.如果没有日志记录,程序崩溃时你几乎就没办法弄明白到底发生了什么事情.举个例子,当你在写一个服务器程序时,记录日志是非常有必要的.下面展示的就是 EZComet.com 服务器的日志文件截图. 服务崩溃后,如果没有日志,我几乎没办法知道到底发生了错误.日志不仅对

[转载] 每个 Python 程序员都要知道的日志实践

原文: http://python.jobbole.com/81666/ 在现实生活中,记录日志非常重要.银行转账时会有转账记录:飞机飞行过程中,会有黑盒子(飞行数据记录器)记录飞行过程中的一切.如果有出现什么问题,人们可以通过日志数据来搞清楚到底发生了什么. 对于系统开发.调试以及运行,记录日志都是同样的重要.如果没有日志记录,程序崩溃时你几乎就没办法弄明白到底发生了什么事情.举个例子,当你在写一个服务器程序时,记录日志是非常有必要的.下面展示的就是 EZComet.com 服务器的日志文件截

[非凡程序员]UIKit 手写控件转换大小写

// //  ViewController.m //  手写转换大小写 // //  Created by 非凡程序员 on 15/11/11. //  Copyright (c) 2015年 Querida. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [