Python日志记录:如何在日志文件中保存类属性值

时间:2017-10-24 14:31:03

标签: python logging

我是新登录python的,除了日志文件中的长管道的结果之外,我还想保存管道中创建的某些实例的参数/类属性。 / p>

理想情况下,这不应该过多地污染实现类的代码。

如果解决方案仅考虑类的实例并将其属性写入日志文件而不触及所有类实现,则更好。

有任何建议或上帝的实践建议吗?

---编辑:

一个未经抛光和简化版本的初始尝试(在注释中提到)是我能想到的最明显的,并且包括添加一个方法,该方法在调用方法时返回的字符串中查询类的属性:

在包含2个模块string value = System.Web.HttpUtility.UrlDecode("%u0633%u0644%u0627%u0645"); // value is: سلام main.py的python包中,如下所示:

a_class.py

>> cat main.py

import logging
from a_class import MyClass


logging.basicConfig(filename='example.log',level=logging.DEBUG)

logging.warning('Print this to the console and save it to the log')
logging.info('Print this to the console')

o = MyClass()
o.attribute_1 = 1
o.attribute_2 = 3
o.attribute_3 = 'Spam'

logging.info(o.print_attributes())

example.log包含我想要的内容,即:

>> cat a_class.py

class MyClass():
    def __init__(self):
        self.attribute_1 = 0
        self.attribute_2 = 0
        self.attribute_3 = 0

    def print_attributes(self):
        msg = '\nclass.attribute_1 {}\n'.format(self.attribute_1)
        msg += 'class.attribute_2 {}\n'.format(self.attribute_2)
        msg += 'class.attribute_3 {}\n'.format(self.attribute_3)
        return msg

在重新设计问题时,有没有办法对类的属性进行相同的查询并将其发送到日志而不在类本身中添加任何类型的WARNING:root:Print this to the console and save it to the log INFO:root:Print this to the console INFO:root: class.attribute_1 1 class.attribute_2 3 class.attribute_3 Spam 方法?

3 个答案:

答案 0 :(得分:2)

我建议implement __str__ or __repr__ for your class,以便很好地显示所有显着的属性值。

然后,您可以将实例记录为简单值:log.info("Now foo is %s", foo_instance).

一个完整的例子:

class Donut(object):
    def __init__(self, filling, icing):
        self.filling = filling
        self.icing = icing

    def __repr__(self):
        return 'Donut(filling=%r, icing=%r)' % (self.filling, self.icing)


donut = Donut('jelly', 'glaze')


import logging

logging.basicConfig()

logging.getLogger().warn('Carbs overload: one %s too much', donut)

输出:

2017-10-25 10:59:05,302 9265 WARNING Carbs overload: one Donut(filling='jelly', icing='glaze') too much

答案 1 :(得分:2)

使用内置的__dict__

class MyClass():
    def __init__(self):
        self.attribute_1 = 0
        self.attribute_2 = 0
        self.attribute_3 = 0

o = MyClass()
print o.__dict__

输出:

{'attribute_2': 0, 'attribute_3': 0, 'attribute_1': 0}

根据需要在日志记录中使用它。

答案 2 :(得分:2)

我同意@Iguananaut的说法,没有神奇的方法可以做到这一点。但是,以下可能会成功。它比你写的print_attributes方法更好,IMO。

import logging

logging.basicConfig()
logger = logging.getLogger('ddd')

logger.setLevel(logging.DEBUG)

class A(object):
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def __str__(self):
        return "\n".join(["{} is {}".format(k, v) 
                         for k, v in self.__dict__.iteritems()])


a = A(1, 2, 3)

logger.debug(a)

结果如下所示 -

{12:43}~ ➭ python logging_attrib.py
DEBUG:ddd:a is 1
c is 3
b is 2

请让我知道您的想法