Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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 记录conf并将其导出到其他模块_Python_Logging - Fatal编程技术网

Python 记录conf并将其导出到其他模块

Python 记录conf并将其导出到其他模块,python,logging,Python,Logging,为了提高我的devOps技能,我将日志放在我想要/需要的地方。 捕获一个env变量,如果我想在标准输出上使用DEBUG/INFO log(dev)或在文件上使用WARNING及更高版本(prod),我可以设置该变量 但是在python中,我没有发现如何设置一次logger conf(在主文件中?)并将其用于整个项目,而不必重写所有内容或到处传输日志对象。我很确定我错过了什么 编辑:我制作了一个log.py文件,看起来像这样 import os import logging from dotenv

为了提高我的devOps技能,我将日志放在我想要/需要的地方。 捕获一个env变量,如果我想在标准输出上使用DEBUG/INFO log(dev)或在文件上使用WARNING及更高版本(prod),我可以设置该变量

但是在python中,我没有发现如何设置一次logger conf(在主文件中?)并将其用于整个项目,而不必重写所有内容或到处传输日志对象。我很确定我错过了什么

编辑:我制作了一个log.py文件,看起来像这样

import os
import logging
from dotenv import load_dotenv
from utils import get_timestamp


def get_logger():
    load_dotenv(".env")
    env_dev = os.getenv('ENV_DEV', "development")

    logger = logging.getLogger(__name__)
    log_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

    if env_dev == "prod":
        handler = logging.FileHandler(f'log/{get_timestamp("%Y%m%d")}_app.log')
        handler.setLevel(logging.WARNING)
        handler.setFormatter(log_format)
        logger.addHandler(handler)
    else:  # DEV
        handler = logging.StreamHandler()
        handler.setLevel(logging.DEBUG)
        handler.setFormatter(log_format)
        logger.addHandler(handler)

    return logger
我使用它就像:

from log.logging import get_logger
# On Dev env
logger = get_logger()
logger.info("Do stuff")
...

但是我没有错误,也没有登录我的术语。

您不需要传输日志对象。当您配置或命名一个全局可用的记录器时。因此,您可以在主文件中设置记录器,并在所有其他位置使用它

主文件
导入日志
logger=logging.getLogger('mylog')
如果调试:
mylog.setLevel(logging.DEBUG)
mylog.addHandler(…)
#完成所有设置
logger.log(“记录该日志”)#使用记录器
其他文件
导入日志
logger=logging.getLogger('mylog')
logger.log(“记录此”)#使用记录器,它已配置

您检查了吗?您还需要在记录器上设置液位。默认为警告,信息在警告之下
logger.setLevel(logging.DEBUG)
然后返回我读取的id以使用
logging.getLogger(\uu name\uu)
获取当前模块。因此,我尝试创建一个日志模块,并将其导入到任何需要的地方。但是现在终端上没有写入任何内容,或者创建了文件,但没有在内部登录。只有当您希望每个模块都有单独的记录器时,才需要这样做。它仍然可以只配置一次。只需将不使用参数得到的所有处理程序添加到根记录器
root=logging.getLogger()
。所有其他记录器都会传播到此记录器,您可以在那里配置处理程序的级别。但您的意思是我在
main.py
中进行的配置仍将用于其他文件吗?为什么?它将在main使用的每个文件中工作<代码>日志记录创建对日志记录者的全局引用,这样每个模块的根日志记录者都是相同的。我用刚才尝试的示例编辑了我的问题。