`
lude707
  • 浏览: 81912 次
  • 性别: Icon_minigender_1
  • 来自: 广西柳州
社区版块
存档分类
最新评论

如何记录好日志一

阅读更多
我每天都会抽空逛一下iteye,但发现论坛里很少会讨论到如何写日志的。大家是不是感觉日志这东西,不是软件的功能性代码写忽略了呢?就我从事软件开发的这几年来,如何记录好日志,跟功能性代码一样重要。我不想讨论我的背景(我混得不咋的,5年了,还是低级码农),只想通过一些例子来说明记录好日志的重要性。

当您加班到晚上十一点,拖着困倦的身子回到家。啊,终于可以休息了!这时电话突然响起,领导打过来的,说现网上您做的某某功能了发现问题,很急!很无奈,又得加班了。您得慢慢的分析日志,看看那里出现了问题。但当您用命令tail -f debug.log时,发现现网上日志刷啊刷,根本就不会停下来。想找到自己需要的一段日志根本是不可能的,问题现网上并发量非常大。这时您想到了把日志下载到本地再看,这也许是个好主要,但一个个的查找,再加上每操作一步,下载一次,定位一次,也不轻松。

上面只是一个现网问题,也许出现的机率不大。但多人共用一台服务器进行开发测试,这可是经常存在的,如果快速找到咱们需要的日志,分析功能性代码是否需要要求,就显得非常重要了。

下面我以记录我们每天起床,到公司上班,下班,睡觉的日志为例,引出我对记录日志的看法。我是做java web开发的,日志工具一般是用log4j,我就以java的伪码做例子。

一般情况下,咱们大多数开发的同学都是这么记日志的:
logger.debug("起床了" );
……
logger.debug("到公司了");
……
logger.debug("下班了");
……
logger.debug("休息了');
注:省略号代表功能性代码。
开发的同学一运行代码,发现从起床到睡觉的日志都出来了,功能性代码都OK了。

大伙感觉上面这段代码有没有问题?
这样记录日志,在本地测试,和小型系统中,也许看不出什么问题,但在多人共用一台服务器进行开发测试的情况下,特别是在高并发的现网上,这日志一点意义都没有。这样的日志,您如何查找到那些是您执行的,那些是别人执行的?我认为这段日志里少了identity,没有身份的日志,在现网上是没有意义的。下面我们把它改一下:
logger.debug(userId + "_起床了" );
……
logger.debug(userId + "_到公司了");
……
logger.debug(userId + "_下班了");
……
logger.debug(userId + "_休息了');

这样我们在开发测试,或现网问题定位时,通过命令:grep 'userId_' debug.log(userId是一个具体值哦)就可以一下子定位到您操作的日志了。

大伙认为上面的这个解决方案怎么样,是不是很完美?
我认为上面的这个日志并不完美,它只是解决了具休某一业务的需求,没有升级到系统架构上来解决问题。想想呀,每一个日志里都加userId,这还不算,有些方法里要记录日志,但方法里不一定有userId。这该怎么办呢?在这里,咱们得求助于java的线程变量和日志扩展。在filter中(或者在进入具体业务前的任一地方)将userId放进ThreadLocal中,debug()方法扩展如下:
debug(String message)
{
userId = 从ThreadLocal中取出;
logger.debug(userId + message);
}
通过扩展,在日志中就不需要开发同学自己在日志中加identity,这不但方便了同学,还能杜绝开发同学在日志中忘了加identity的情况。


又十一点半了,明天还要加班。还有好多内容没写,留给明天吧。


分享到:
评论

相关推荐

    QT添加操作日志记录

    QT框架开发,添加操作日志记录,本地生成txt文件记录内容,在需要记录的地方使用qDebug记录

    unix系统日志系统记录的日志

    最好每天,至少每周一次,取决于你的审查政策。/var/adm/utmp:系统记录的日志,跟踪仍然登录的用户,但有时shell被停止或未清除干净,会有问题 理解其他日志文件的内容有助于安全管理员认清系统中正在发生的事情。

    通用日志记录组件

    * 一个派生类,用于指定其实现的日志记录类型,另一个派生类,用于设置日志记录配置信息 * 通用日志记录组件,采用统一的写入接口,在内部根据外部的派生类,实现自动的日志信息分拣 * 由于通用日志记录组件内部...

    Android 本地日志记录

    1.自动记录崩溃信息,设备信息; 2.手动添加想要的Log信息; 3.每天产生一份日志,可以设置保存N天的日志

    记录日志到文件

    支持写日志到文件,支持日志级别和设置日志最大大小,当超过日志最大大小时,会新生成一个以时间命名的文件。 因获取程序名和互斥锁,用了qt类,如果不想包含qt,可以使用另外的程序名和基于windows或者linux或者...

    工作日志记录软件

    需要改进的地方:1、报表的现实功能,目前实现的报表是通过自己设置的,如果日志记录太长,显示不全。2、报表的打印功能,目前报表的打印只能通过判断选择的打印机进行打印,其他的打印的基本调整还没有,需要增加...

    日志记录模块设计和实现

    程序设计开发难免会遇到日志记录,有的采用第三方的开源日志系统,但是比较庞大和笨重,有的只需要简单显示记录文件就可以,所以就需要自己单独来开发实现,本工程即是一个日志记录和显示的简单设计与实现,如有不足...

    CRT 记录日志设置方法(1) - 副本.docx

    CRT 记录日志设置方法

    一个记录程序日志的c#例子,可以按天分文件记录

    一个记录程序日志的c#例子,可以按天分文件记录,并且可以设置日志文件大小。

    Delphi FireDac Delta 记录操作日志 与 Delta转SQL

    FDMemTable 记录操作日志 FDMemTable.Delta 转SQL语句

    Android本地日志记录

    1.自动记录崩溃信息,设备信息; 2.手动添加想要的Log信息; 3.每天产生一份日志,可以设置保存N天的日志

    日志记录器

    一具优秀的且免费的日志记录库,用起来简单,不像log4net还要到处各种设置,虽然功能强大,但是很多时候并根本不需要.当然如果需要玩复杂的请忽略

    Python日志记录

    1. 会在该文件logo.py的父级目录下新建一个log的文件夹,日志文件都会存放在新建的log文件夹下。 2. 日志信息会在控制台打印出来,与使用print效果一样。 3. 在控制台打印出来的同时,日志信息也会写入到本地日志...

    Log4j使用手册 日志记录包

    使用一个专门的日志记录包,可以减轻对成千上万的System.out.println语句的维护成本,因为日志记录可以通过配置脚本在运行时得以控制。log4j维护嵌入在程序代码中的日志记录语句。通过规范日志记录的处理过程,一些...

    C++日志记录类QTClogCodeSource

    QT实现单例日志记录类,采用宏调用形式打印日志,支持日志文件夹最大日志文件个数,支持设置日志记录大小,当文件夹日志数到达最大时主动删除最老日志文件--使用方式,直接包含类文件夹,代码中LOG("UI初始化完成1")...

    记录log日志的工具类

    封装的一个用来记录log日志的工具类,使用方便,可以把日志记录到文件中

    log4pb, pb的日志组件, 后台线程记录日志

    日志是异步记录的(每个记录方式开了个线程在后台负责记录处理),大大提高应用程序性能 // 8. 功能可以通过数据库表选择配置(如,多少种记录方式,各线程工作频率) // 9. 日志的数据库记录方式,可以配置缓区大小,...

    网络稳定性检测工具 自动记录异常日志

    网络稳定性检测工具 可有效检测网络稳定状态 对网络问题排查提供直观的一手...是一款非常实用的好工具 独有日志记录功能 检测中途出现异常被关闭也可以自动保留历史记录 无需人员值守也可以自行完成稳定性检测工作

    Codesys记录日志,获取系统时间,功能块源码

    实现类似于C#上位机那种Log日志功能,即运行一次即可实现记录当前在何种时间做了何种动作,带时间戳和日期功能。可实现每日机器运行日志的功能。同时也方便与上位机或协作方进行查错,带时间戳功能,在哪一毫秒进行...

    Log4j记录日志DEMO

    Log4j记录日志

Global site tag (gtag.js) - Google Analytics