日志记录的丑陋——Python示例

日志记录的丑陋——Python示例,python,python-2.7,logging,Python,Python 2.7,Logging,所以我正在做一个有一些日志设置的项目。我们设计了一种日志记录方式,以便在发生异常时记录该点的所有信息。这与一些传统方法不同,在这些方法中,不管过程中的结果如何,都会记录事情。我编写了下面的示例来简单地解释我们正在使用的模式。简而言之,创建了一个全局字典,用于在程序运行时存储信息。这本字典在程序中的不同点被清除和初始化(我不喜欢,但这是一个“不必要的邪恶”)。需要清除字典,因为循环操作只更新某些信息。无论如何,下面的例子已经够多了: import logging import sys import

所以我正在做一个有一些日志设置的项目。我们设计了一种日志记录方式,以便在发生异常时记录该点的所有信息。这与一些传统方法不同,在这些方法中,不管过程中的结果如何,都会记录事情。我编写了下面的示例来简单地解释我们正在使用的模式。简而言之,创建了一个全局字典,用于在程序运行时存储信息。这本字典在程序中的不同点被清除和初始化(我不喜欢,但这是一个“不必要的邪恶”)。需要清除字典,因为循环操作只更新某些信息。无论如何,下面的例子已经够多了:

import logging
import sys
import logmatic

l = logging.getLogger(__name__)
l.setLevel(logging.DEBUG)
sh = logging.StreamHandler(sys.stdout)
sh.setFormatter(logmatic.JsonFormatter())
l.addHandler(sh)

logging_dict = {}


def some_method(default_logging):
    some_loopable_data_structure = [1, 2, 3]
    for loop in some_loopable_data_structure:
        default_logging.clear()
        logging_dict.update(default_logging)
        logging_dict.update({'loop_count': loop})
        if loop == 2:
            logging_dict.update({'some_condition_triggered': 'stores a value which we need to clear each loop'})
        l.info('current logged message, loop {}'.format(loop), extra=logging_dict)


def main():
    default_logging = {'first_var': 'some initial var', 'second_var': 'another initial var'}

    some_method(default_logging)


main()
示例输出:

{
  "asctime" : "2018-02-06T13:47:38ZE. Australia Standard Time",
   "name" : "__main__",
   "processName" : "MainProcess",
   "filename" : "ugly_logging.py",
   "funcName" : "some_method",
   "levelname" : "INFO",
   "lineno" : 20,
   "module" : "ugly_logging",
   "threadName" : "MainThread",
   "message" : "current logged message, loop 3",
   "loop_count" : 3,
   "timestamp" : "2018-02-06T13:47:38ZE. Australia Standard Time"
}
如果我删除

default_logging.clear()
输出(包含来自循环2的日志记录&这是不正确的):

在这个小例子中,解决方案似乎并不坏。随着python模块的规模和复杂性的增加,我现在将“默认日志记录”的dict传递给各种方法,以便在我清除它的某些地方初始化日志记录&这一切都开始变得混乱起来。我不喜欢这种方法的一些地方

  • 将dict传递给具有“默认日志记录”信息的所有方法
  • 每次我循环都要查字典
  • 以上内容似乎容易出错,而且扩展性不好
有人对更好的方法有什么建议吗?这种方法仍然坚持我们的日志哲学,即“只在某些点记录相关信息”,而不是“记录所有内容”的传统方法

{
   "asctime" : "2018-02-06T13:58:50ZE. Australia Standard Time",
   "name" : "__main__",
   "processName" : "MainProcess",
   "filename" : "ugly_logging.py",
   "funcName" : "some_method",
   "levelname" : "INFO",
   "lineno" : 22,
   "module" : "ugly_logging",
   "threadName" : "MainThread",
   "message" : "current logged message, loop 3",
   "some_condition_triggered" : "stores a value which we need to clear each loop",
   "second_var" : "another initial var",
   "first_var" : "some initial var",
   "loop_count" : 3,
   "timestamp" : "2018-02-06T13:58:50ZE. Australia Standard Time"
}