`
chelsea
  • 浏览: 117780 次
  • 来自: ...
社区版块
存档分类
最新评论

Log 问题域

    博客分类:
 
阅读更多

 

  • 如何不带来额外的效率损失
  • 如何在程序运行出错时记录尽可能多的信息
  • 如何方便查找特定条件的错误
  • 如何横切的添加通用信息

 

如何不带来额外的效率损失


在之前接触的一个大型产品中见过散布着如下代码:

if (Log.Level > DEBUG) {
logger.write(some_method_to_build_the_log_string());
}

问为什么不在logger.write()里面判断日志级别, 这样外面写起来就很清爽

logger.write(some_method_to_build_the_log_string());

答曰效率问题, 后面一种写法会导致无论日志最终有没有被写入, some_method_to_build_the_log_string()都会先行被调用求值, 而这可能很耗时...

一个解决办法是额外的中间层: 能够延时求值的东东, 比如函数指针, 函数对象, 总而言之能够保存当前上下文而在将来某个时刻能够回调的东西, 诸如 C# 里的 Func<string>

这样logger.write()的签名就从 void write(string info) 变成 void write(Func<string> getInfo);

带来的一个问题是啥时真正写入, 一般可以是用户事务结束的时候. 其实当并发用户量大时, 表面上延时求值可以不阻碍当前请求的处理速度, 但当求值发生时, 可能会阻碍其它请求的处理. 所以Func<string>代替string效率上的优势并不明显, 更多的是代码上的简洁

 

(Func<string>的另一个好处是把IO操作推迟了, 当时没有IO操作,所有IO操作都被推到完成用户请求之后再进行,尤其是如果因为其它原因需要把Log存到数据库的时候. 当然不用Func<string>, 直接用string也可以实现推迟IO操作, 只需要把string都缓存起来, 找个时机再写出来即可)


然而Func<string>更大的意义是解决第二个问题:

如何在程序运行出错时记录尽可能多的信息


通常最终写到日志里的信息, 都是根据配置的级别决定的, 比如配置了日志级别是INFO, 那么无论出不出错, DEBUG级别的信息都不会被写到日志里. 然而现实情况是, 一旦出错, 我们可能需要DEBUG信息来定位问题. 于是我们不得不把日志级别设置成DEBUG,然后重新运行应用,企图复现. 但运行环境的差异使得复现像撞大运, 可遇不可得. 于是在案发第一现场就记录所有线索变得极具效率

对日志即时求值和写入是很难实现这个目的的, 而延时求值, 回调, 这层额外的间接则将其变得轻而易举.

我们要做的就是保存所有写日志的回调, 直到写入的那一刻, 根据某种规则, 从中挑选部分回调真正去执行; 规则可以是正常情况下根据日志级别设置, 出错的时候则全部写入, 等等

 

(这里的目的就是避免日志过于简略或者繁琐, 鼓励大家多写日志而不必担心运行时效率)

如何方便查找特定条件的错误


查找是数据库的强项, 把日志结构化, 存到数据库里即可. 这会带来事务的问题: 写日志是否和用户正常的业务放在一个事务里?

如何横切的添加通用信息


如果把log建模为一个对象, 可以应用builder模式, pipeline等, 让log对象依次通过一堆builder组成的pipeline, 每个builder负责给log增砖添瓦, 最后出来的就是一个包含了各种彼此独立的信息的对象

分享到:
评论

相关推荐

    log4net demo

    **log4net** 是一个广泛使用的开源日志记录框架,为.NET开发人员提供了一种灵活且可扩展的方式来记录应用程序中的事件...通过理解和熟练运用log4net,开发者可以更好地监控和调试他们的应用程序,提高问题排查的效率。

    常用log4j的配置详解

    ### 常用log4j配置详解 #### log4j简介 Log4j是一个开源的日志框架,由Apache Software Foundation开发。它允许开发者通过简单的配置文件来定义日志的输出等级、输出目的地以及日志信息的格式等。这极大地提高了...

    android中Log的实现机制

    #### 三、Java域输出Log 在Java层,Android应用主要通过`android.util.Log`类来输出日志信息。`Log`类提供了多种静态方法来适应不同的日志级别需求: - `Log.v()`:用于输出verbose级别的日志。 - `Log.d()`:用于...

    log4j常用配置详解

    这里将`unmi.log`这个日志域的日志级别设置为`debug`。这种方式可以更精细地控制特定类别的日志输出级别,提高日志管理的灵活性。 ### 总结 ### 通过对log4j两种常见配置方式的学习,我们可以发现,无论是通过`....

    DLL-log4net

    在log4net中,通常每个应用程序域有一个仓库,但也可以根据需要创建多个。仓库允许开发者配置和管理整个应用的日志行为。 3. **Appender(附着器)**:附着器负责将日志信息输出到特定的目标,如控制台、文件、...

    log-gabor-filter

    2. **Log-Gabor滤波器**:Log-Gabor滤波器是对Gabor滤波器的改进,通过在频率域引入对数尺度,使得滤波器在低频部分更加敏感,这有助于增强图像的细节信息,并且降低了计算复杂度。 3. **滤波器形状**:Log-Gabor...

    BIEE11.1.1.9.0AD域配置问题

    此外,检查OBIEE的诊断日志(bi_server1-diagnostic.log),以获取更详细的错误信息,这有助于定位问题并进行调试。 总之,OBIEE 11.1.1.9.0版本中AD域配置问题的关键在于补丁21895214,它包含了修复虚拟化身份验证...

    Linux加入Windows域之完整操作步骤

    ### Linux加入Windows域之完整操作步骤详解 在企业级网络环境中,Windows域控(Domain Controller)扮演着核心角色,负责管理用户、权限、资源等。然而,在多平台共存的场景下,Linux系统如何顺利地融入Windows域...

    LOG日志学习 log4net.dll资源文件

    然后,可以创建一个log4net实例,通常在应用程序的全局作用域中初始化,如Global.asax.cs文件的Application_Start方法内。初始化过程包括获取配置信息并设置日志级别。 例如: ```csharp using log4net; using log...

    深入理解变量作用域

    ### 深入理解变量作用域 #### 一、引言 在JavaScript编程语言中,作用域是一个核心概念,它决定了变量的可见性和生命...掌握这些知识点有助于开发者更好地管理变量的作用范围,避免潜在的问题,提高代码的质量和性能。

    函数定义域求法.pdf

    根据上述给定文件中的部分内容,我们可以看到一些涉及对数函数、二次函数等的定义域问题。 在函数定义域求法中,我们需要遵循一些基本原则和技巧: 1. 对于分式函数f(x) = g(x)/h(x),其中g(x)和h(x)是x的多项式或...

    有限域运算表

    有限域GF(2^N)是数学中的一个重要概念,...通过理解有限域GF(2^N)的运算规则,我们可以更好地利用这些工具解决实际问题,尤其是在需要高效计算和安全性保证的领域。有限域的理论和实践是现代信息技术不可或缺的一部分。

    深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx

    深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...

    AD域提升为域控服务器报ADPrep执行失败处理.docx

    在IT领域,尤其是在Windows Server环境下,提升AD域控制器(Domain Controller,简称DC)是一项关键任务,但有时可能会遇到各种问题,比如在将Windows Server 2012 R2提升为Server 2008 R2域环境的域控时,ADPrep...

    USBTRACE LogFile Decoder V1.0.7.rar

    加密狗数据解码工具,支持龙脉NOX\NOX2\NOX5\NOX定制狗\DAM精简型\DAM2+网络狗、R2\R4SMART\R4ND、域天简单型\密码型\F2K\易用专业型、坚石ET99、精灵狗UGA、精锐E\精锐IV、磐石NT77\NT88\NT199、SuperPro\ULTRAPRO...

    LOG4J电子书下载

    因此,引入像Log4j这样的日志框架能有效解决上述问题,并带来以下好处: - **减少代码量**:避免了在代码中加入大量的打印语句。 - **提高代码可读性**:将日志行为抽象出来,提高了代码的整洁性和可读性。 - **...

    Linux加入Windows域之完整操作步骤.doc

    Linux 加入 Windows 域之完整操作步骤 Linux 加入 Windows 域是指将 Linux 服务器加入到 Windows 域中,以便实现跨平台的身份验证和资源共享。本文将详细介绍 Linux 加入 Windows 域的完整操作步骤。 一、准备工作...

Global site tag (gtag.js) - Google Analytics