【问题标题】:Logging best practice for classes记录类的最佳实践
【发布时间】:2019-11-29 02:44:21
【问题描述】:

我已经用 Python 实现了一个记录器。基本上,这个想法是有一个带有多个处理程序的记录器。我使用以下 yaml 配置执行此操作

version: 1

formatters:
    simple:
        format: "%(name)s - %(lineno)d -  %(message)s"

    complex:
        format: "%(asctime)s - %(name)s | %(levelname)s | %(module)s : [%(filename)s: %(lineno)d] - %(message)s"

    json:
        class: utils.logger.JsonFormatter
        format: '%(asctime)s %(name)s %(levelname)s %(module)s %(filename)s: %(message)s'


handlers:
    console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: json

    file:
        class: logging.handlers.TimedRotatingFileHandler
        when: midnight
        backupCount: 5
        level: DEBUG
        formatter: complex
        filename : /tgs_workflow/logs/tgs_logs.log

    cloud:
        class: utils.logger.GoogleLogger
        formatter: json
        level: INFO

loggers:

    cloud:
        level: INFO
        handlers: [console,file,cloud]
        propagate: yes

    __main__:
        level: DEBUG
        handlers: [console,file,cloud]
        propagate: yes

在 yaml 中,我创建了一个类 GoogleLogger 和一个类 JsonFormatter,这些是唯一不同寻常的东西。

为了让它工作,我想在任何地方使用我的记录器(实例化):

Instantiator [突出显示的原因我稍后会提到它]

import logging
import logging.config
import yaml

with open('/tgs_workflow/logging.yaml','rt') as f:
        config=yaml.safe_load(f.read())
        f.close()
logging.config.dictConfig(config)
logger = logging.getLogger(__name__)
logger.info("This info")

现在这里有两个问题

第一季度。在我希望使用它的每个类/脚本中实例化它是不好的做法吗?这也意味着有很多冗余代码。 (相同的代码,多个地方)

第二季度。我通常将它放在__main__ 中,但是当我有一个没有主目录但包含日志记录的类时会发生什么?我绝对知道把它放在文件的顶部不是一个好主意。

例如对于 Q2:这是一个非常糟糕的例子,但我只是想强调一个类如何需要一些日志记录

import logging

"""
>>>Insert Instantiator here <<<
"""

class Tools():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def who_am_i(self, name, age):
        try:
            if (self.name == "Adam"):
                return True
                logging.info("This was Adam")
            else:
                return False
                logging.info("This was not Adam")
        except Exception:
            logging.error("There is an error")

我使用记录器的唯一方法是将我的 Instantiator 包含在这个类的顶部。那一定是不正确的,或者至少不是最佳实践?这样做的正确方法是什么?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    方法是要么坚持一个名称,不为每个模块/文件使用不同的记录器,要么使用层次结构。如果您的工具类是由 main 导入的,那么 __main__cloud 将已经配置并且可以使用。您需要做的就是将&gt;&gt;&gt;Insert Instantiator here &lt;&lt;&lt; 替换为logger = logging.getLogger('__main__'),您就可以开始了。如果您不想直接在主记录器上使用,您可以放置​​一个点以使其成为层次结构。 logger = logging.getLogger('__main__.tools')。现在这是一个记录器,它会将其日志传播到__main__ 记录器,但可以拥有自己的级别等。

    【讨论】:

    • 对于未来的读者:我在我的记录器类中创建了一个setup_logging()。记录器是通过 yaml 配置的。在我的代码中,我只是setup_logging(),然后@blues 说logger = logging.getLogger('__main__') 其中__main__ 是我要使用的记录器的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2012-01-10
    • 1970-01-01
    • 2015-12-24
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多