我正在编写简单的基于telnetlib的lib,供其他python脚本使用。我也使用日志记录类,因此我有一个问题:是否可能,并且做这样的事情是很好的python练习:
def printd(args):
""" debug on stdout """
sys.stdout.write(time.strftime("%H:%M:%S ") + args.rstrip() + '\n')
def printe(args):
""" error on stderr """
sys.stderr.write(time.strftime("%H:%M:%S ") + args.rstrip() + '\n')
class Connections:
""" Telnet lib connection wrapper """
def __init__(self, host, port, timeout, logger):
""" if external logger is passed - all msgs will be passed to it,
otherwise will use printd and printe functions """
self.timeout = timeout
self.host = host
self.port = port
self.connections = {}
try:
res = isinstance(logger, logging.Logger)
except TypeError:
res = False
except:
res = False
if res == True:
self.log = logger
self.log_debug = self.log.debug
self.log_info = self.log.info
self.log_error = self.log.error
else:
self.log_debug = printd
self.log_error = printe
def connect2(self, helloMsg):
try:
self.c = telnetlib.Telnet(self.host, self.port)
except socekt.error:
self.c = None
self.log_error("Could not connect to %s:%d" % (self.host, self.port))
except IOError:
self.log_error("Could not connect to %s:%d" % (self.host, self.port))
self.c = None
在构造函数中我传递了logger,如果它存在,我想使用它的日志方法来打印消息,如果没有,我想使用printd
和printe
函数。
答案 0 :(得分:3)
是的,原则上这完全没问题,只是isinstance(logger, logging.Logger)
永远不会提出TypeError
。它只会返回一个布尔值。编写
def __init__(self, host, port, timeout, logger=None):
if logger is None:
self.log_debug = printd
self.log_error = printe
else:
# use the logger's methods
然后,您可以传递None
以获取内置日志记录。
答案 1 :(得分:0)
这对我来说似乎很好。主要问题是,如果您没有收到记录器,请保留self.log_info
未定义。
另一种方法是创建一个“合成”记录器对象作为默认的self.log
。