我想在logging的帮助下收集信息。
这个想法很简单。我有一些数据的hash_value,我想写入日志。所以,我以这种方式设置我的日志记录:
import logging
logger.setLevel(logging.DEBUG)
logging.basicConfig(format='%(asctime)s :%(message)s', level=logging.INFO)
正如您所看到的,现在计时和一些消息将自动写入日志文件,例如我可以像这样使用它:
logger.info('Initial data: {}'.format(data))
但是如果我想自动编写数据的hash_value怎么办?就像现在正在发生的那样。 我查看了文档并发现没什么用处。模块日志记录中没有变量属性。
所以我被迫做错了。像这样:
hash_value = hash(data)
logger.info('Initial data: {} {}'.format(hash_value, data))
我期望从这段代码:
logging.basicConfig(format='%(asctime)s: %(variable)s :%(message)s', level=logging.INFO)
和
logger.info('Initial data: {}'.format(hash_value, data))
完成这项工作。但它不起作用(它基本上不应该),我没有在文档中找到解决方案。 那么,如何避免这种错误代码:
logger.info('Initial data: {} {}'.format(hash_value, data))
我现在有哪些?
答案 0 :(得分:1)
import logging
import sys
MY_PARAMS = ("variable1", "var2", )
class ExtraFilter(logging.Filter):
def filter(self, record):
# this one used for second, simplier handler
# to avoid duplicate of logging entries if "extra" keyword was passed.
# Check all of your custom params:
# if all of them are present - record should be filtered
# * all because if any of them is missing - there would be silent exception and record wont be logged at all
# bellow is just an example how to check.
# You can use something like this:
# if all(hasattr(record, param) for param in MY_PARAMS): return False
if hasattr(record, "variable1"):
return False
return True
# init logging
log = logging.getLogger()
# init handlers and formatters
h1 = logging.StreamHandler(sys.stdout)
f1 = logging.Formatter('%(asctime)s: %(variable1)s: %(var2)s: %(message)s')
h2 = logging.StreamHandler(sys.stdout)
f2 = logging.Formatter('%(asctime)s: %(message)s')
h1.setFormatter(f1)
h2.setFormatter(f2)
h2.addFilter(ExtraFilter())
log.addHandler(h1)
log.addHandler(h2)
# example of data:
extra = {"variable1": "test1", "var2": "test2"}
log.setLevel(logging.DEBUG)
log.debug("debug message", extra=extra)
log.info("info message")
上面的代码将产生以下输出:
2017-11-04 09:16:36,787: test1: test2: debug message
2017-11-04 09:16:36,787: info message
答案 1 :(得分:-1)
这不是错误的代码,你想要添加两个信息,因此你必须传递两个参数来格式化或连接字符串更多"手动" 你可以选择
Logging.info("initial data " + hash_value + " " + data)
或者您可以更改"数据"对象所以它的" str "或者 repr 方法自己添加哈希(在这种情况下最好是 repr )
Class Data():
....
def __repr__(self):
Return self.hash() + " " self.data
在这种情况下,将打印参数数据的哈希值和字符串版本(或者只是想要显示为字符串的任何内容),只传递字符串格式的一个参数。
无论如何,你可以使形成字符串更漂亮......
Logging.info("Initial data {hash} {data}".format(hash=hash_value, data=data))
顺便说一句,在C ++和Java中,你还需要声明两个"条目"对于那两个属性。在java中会是这样的:
LOGGING.info("Initial data {} {}", hash, data);