Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-两个具有不同级别和输出流的记录器对象_Python_Python 3.x_Logging - Fatal编程技术网

python-两个具有不同级别和输出流的记录器对象

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

编程语言: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=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。