【发布时间】: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 包含在这个类的顶部。那一定是不正确的,或者至少不是最佳实践?这样做的正确方法是什么?
【问题讨论】: