`
lude707
  • 浏览: 82166 次
  • 性别: 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的情况。


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


分享到:
评论

相关推荐

    在MVC中记录操作日志类

    - **自定义ActionFilter**:创建一个实现了`IActionFilter`接口的类,重写`OnActionExecuting`和`OnActionExecuted`方法,分别在Action执行前和执行后记录日志信息。 - **使用AOP(面向切面编程)**:通过如Unity...

    VC实现的日志记录类,可方便地记录日志

    这可以通过枚举类型定义不同的日志级别,并在记录日志时进行过滤。 4. **格式化输出**:日志记录类应能按照预设的格式输出,如时间戳、线程ID、日志级别标识和日志内容等。这样有助于快速识别和分析问题。 5. **可...

    Android 本地日志记录

    在Android应用开发中,日志记录是一个至关重要的环节,它帮助开发者追踪应用程序的运行状态,定位和解决问题。本文将深入探讨如何实现Android本地日志记录,包括自动记录崩溃信息、设备信息,以及手动添加Log信息,...

    Kettle运行日志记录

    学习这些日志记录知识可以帮助我们更好地管理和优化Kettle的工作流程,及时发现并解决问题。通过分析日志,我们可以了解Job和Transformation的执行顺序、耗时以及错误发生的位置,从而提高ETL流程的稳定性和效率。 ...

    QT添加操作日志记录

    本文将详细讲解如何在QT项目中实现这一功能,以本地生成TXT文件的形式记录日志内容。 首先,我们需要理解QT中的日志输出机制。QT库提供了一个方便的调试工具——`qDebug()`,它是`QDebug`类的一个静态函数,用于...

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

    1. **/var/adm/lastlog**:记录了每个用户最后一次成功登录的时间及登录方式。这对于监控用户活动非常有用,尤其是当需要了解用户何时最后访问系统时。 2. **/var/adm/sulog**:记录了用户通过 `su` 命令切换身份的...

    MFC 记录操作日志,使用Edit控件

    在需要记录日志的地方,调用`AppendToLog`函数即可。例如,在一个成员函数中: ```cpp void CMyDialog::OnSomeEvent() { // 处理事件... // 记录日志 CString logMessage = _T("发生了某个事件..."); ...

    记录显示登录日志实例_记录显示登录日志实例_

    以下是一个简单的登录日志记录实例: ```python import logging # 创建一个logger logger = logging.getLogger('login_logger') logger.setLevel(logging.INFO) # 创建一个handler,用于写入日志文件 fh = ...

    VB编写日志记录,简单的

    1. **创建日志文件**:在VB中,我们可以通过`My.Computer.FileSystem.WriteAllText`方法来创建一个新的文本文件,这个文件将用于存储日志信息。我们需要指定文件路径和初始内容,如"开始记录",以标识日志的起点。 ...

    labview操作logger,日志记录

    1. **自定义日志VI**:你可以创建一个VI,用于接收输入数据(如字符串、数值等),并将这些数据写入文件或数据库。VI通常包括输入端口、处理逻辑和输出端口。处理逻辑可以包含时间戳的添加、数据格式化以及存储操作...

    LabVIEW日志记录实时更新模块.zip

    3. **日志记录**:日志记录是软件工程中一个关键的实践,特别是在生产和测试环境中。通过日志,我们可以追踪系统的行为,捕获错误信息,进行调试和故障排查。LabVIEW中的日志记录通常涉及到文件I/O操作,例如创建、...

    基于切面的日志记录SSMdemo

    例如,我们可能会有一个名为`@LogBefore`的注解,用于标记需要在执行前记录日志的方法。然后,在切面类中,我们可以编写一个`@Before`通知,该通知会在匹配的切入点方法执行前被调用,执行日志记录的操作。 文件名...

    C++ 多线程日志记录

    这些文件可能定义了一个日志类,其中包含记录日志的方法,以及线程安全的数据结构(如队列)和同步原语(如信号量和互斥锁)。`readme.txt`文件则可能提供了关于如何使用这些类和函数的说明,例如如何初始化日志系统...

    log组件_labview日志组件_LOGO日志记录_

    1. **数据记录**:通过日志组件,开发者可以记录程序运行时的各种变量值、系统状态或者用户交互信息。这些数据可以是实时的,也可以是周期性的,有助于理解程序在不同阶段的行为。 2. **事件记录**:除了数值数据,...

    c++记录日志到文件里面

    在C++编程中,记录日志到文件是一个重要的任务,特别是在开发复杂系统或者进行调试时。日志系统可以帮助我们追踪程序运行过程中的错误、异常和关键事件,以便于后期分析和解决问题。本篇将深入探讨如何在C++中实现...

    系统启动记录日志例子

    在IT行业中,日志记录是系统管理和故障排查的重要环节,特别是在系统启动时,记录日志信息可以帮助我们了解启动过程中的每一个细节,及时发现并解决可能出现的问题。本文将深入探讨“系统启动记录日志”这一主题,...

    自己实现的Qt日志记录系统

    本文将详细介绍如何自己实现一个Qt日志记录系统,以满足这些需求。 首先,我们要理解`qDebug()`等宏的工作原理。它们实际上是Qt的宏定义,用于格式化输出,并且可以方便地与预处理器条件语句结合使用,以便在调试...

    日志记录器

    ZHN.LogLib是一个优秀的、免费的日志记录库,它的出现为开发者提供了更加便捷的解决方案,尤其对于那些对复杂配置不感兴趣,但又希望实现高效日志管理的用户来说,无疑是一大福音。 首先,ZHN.LogLib以其简洁易用的...

    思科设备--记录配置变更日志

    在IT管理领域,尤其是网络设备运维中,记录配置变更日志是一项至关重要的任务。这有助于追踪设备的修改历史,确保网络稳定性,及时发现并解决潜在问题。本文将详细讲解如何在思科网络设备上启用和查看配置变更日志。...

    qt实现txt日志记录功能

    4. **关闭日志**: 当不再需要记录日志时,提供一个`close()`方法来关闭文件,释放资源。 5. **异常处理**: 在写入日志过程中,应处理可能出现的错误,如文件无法打开或写入失败。这些错误可以通过捕获QFile::Error...

Global site tag (gtag.js) - Google Analytics