我是新登录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
方法?
答案 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
请让我知道您的想法