如何记录好日志一

我每天都会抽空逛一下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的情况。


又十一点半了,明天还要加班。还有好多内容没写,留给明天吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值