python-两个具有不同级别和输出流的记录器对象
编程语言:Python 3.7 我想设置两个Python logger对象:一个输出到文件,另一个输出到python-两个具有不同级别和输出流的记录器对象,python,python-3.x,logging,Python,Python 3.x,Logging,编程语言:Python 3.7 我想设置两个Python logger对象:一个输出到文件,另一个输出到sys.stdout 这是我的密码: def get_custom_记录器(名称:str,调试:bool,fname:str=None)->日志记录。记录器: 级别=logging.DEBUG if DEBUG else logging.INFO 如果fname不是None: logging.basicConfig(filename=fname,filemode='a+',level=leve
sys.stdout
这是我的密码:
def get_custom_记录器(名称:str,调试:bool,fname:str=None)->日志记录。记录器:
级别=logging.DEBUG if DEBUG else logging.INFO
如果fname不是None:
logging.basicConfig(filename=fname,filemode='a+',level=level)
其他:
logging.basicConfig(level=level,stream=sys.stdout)
返回logging.getLogger(name=name)
def main():
tlog\u info=get\u custom\u logger(name='Test\u info\u Stdout',debug=False)
tlog_info.info('info message')
tlog_info.debug('debug message-将在debug=True'时记录)
打印(日志信息)
#
tlog\u dbg=get\u custom\u logger(name='Test\u Debug\u FileStream',Debug=True,fname='Test.out')
tlog_dbg.info('info message')
tlog_dbg.debug('debug消息-将在debug=True'时记录)
打印(tlog_dbg)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
这不管用。也不是
- 将所有日志消息打印到控制台,无论级别如何(如果第一次实例化
), 或tlog\u info
- 将所有日志消息输出到
,无论级别如何(如果test.out
先实例化)tlog\u debug
handlers
参数来basicConfig
:
loghandler=logging.StreamHandler(sys.stdout),如果fname不是其他logging.FileHandler(fname,mode='a+'))
logging.basicConfig(level=level,stream=sys.stdout,handlers=[loghandler])
但我得到了同样的结果
有什么好处
有没有一种更干净、更像蟒蛇的方法
注意,我想调用
get_custom_logger
,从较大代码的各种函数/类中调用;一些记录器将记录到文件中,其他记录器将记录到控制台中。您应该只调用一次basicConfig
。查看评论
或者,您可以执行以下操作:
def get_custom_logger(name, debug, fname= None):
level = logging.DEBUG if debug else logging.INFO
logger = logging.getLogger(name=name)
if fname is not None:
handler = logging.FileHandler(fname)
else:
handler = logging.StreamHandler(sys.stdout)
logger.setLevel(level)
handler.setLevel(level)
logger.addHandler(handler)
return logger
您应该只调用一次
basicConfig
。查看评论
或者,您可以执行以下操作:
def get_custom_logger(name, debug, fname= None):
level = logging.DEBUG if debug else logging.INFO
logger = logging.getLogger(name=name)
if fname is not None:
handler = logging.FileHandler(fname)
else:
handler = logging.StreamHandler(sys.stdout)
logger.setLevel(level)
handler.setLevel(level)
logger.addHandler(handler)
return logger
一种方法是创建一个根记录器,并在其顶部添加两个记录器。
您有更详细的解释如何做。一种方法是创建一个根记录器,并在其顶部添加两个记录器。
您有更多关于如何执行此操作的解释。来自basicConfig上的python文档:
如果根日志记录器已经为其配置了处理程序,则此函数不会执行任何操作。
只有第一个调用会执行某些操作。对于第二种情况,您需要使用另一种方式来配置记录器。从basicConfig上的python文档中可以看出:如果根记录器已经为其配置了处理程序,则此函数不会执行任何操作。
只有第一个调用会执行某些操作。对于第二种情况,您需要使用另一种方式来配置记录器。建议使用logging.FileHandler(fname)
而不是open。建议使用logging.FileHandler(fname)
而不是open。