记录

时间:2017-11-04 07:08:00

标签: python logging

我想在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))
我现在有哪些?

2 个答案:

答案 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);