跨多个模块进行烧瓶记录

时间:2018-08-15 04:33:05

标签: python logging flask

我在Flask中具有以下目录结构,并且尝试向该系统添加日志记录。我的API在main.py中定义,backend.py为API提供了一些后端逻辑。

├── README.md
├── __init__.py
├── main.py
├── module
│   ├── __init__.py
│   └── backend.py

我的API在main.py中定义,并且在文件中记录相关组件如下:

from logging.config import dictConfig
import logging
from module import backend

log_level = "DEBUG"
LOGFILENAME = "flask.log"
dictConfig({
    'version': 1,
    'formatters': {'default': {
        'format': '[%(asctime)s] {%(pathname)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
    }},
    'handlers': {'default': {
                'level': 'DEBUG',
                'formatter': 'default',
                'class': 'logging.handlers.RotatingFileHandler',
                'filename': LOGFILENAME,
                'maxBytes': 5000000,
                'backupCount': 10
            }},
    'root': {
        'level': log_level,
        'handlers': ['default']
    }
})

app = Flask(__name__)
logger = logging.getLogger(__name__)

@app.route('/')
def hello():
    logger.debug("DEBUG: Inside the home function")
    logger.info("INFO: Inside the home function")
    backend.test()
    return "Welcome"

日志按预期在main.py中工作。根据{{​​1}},日志会写入log_level

当我尝试通过backend.py内部的以下步骤启用日志记录时,会出现问题。

LOGFILENAME

我没有看到import logging logger = logging.getLogger(__name__) def test(): logger.info("info test") logger.debug("debug test") 的任何日志都写入了backend.py。我感觉我想念一些东西,但不明白。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

您的库确实有一个不同的记录器名称。两者都需要使用相同的记录器名称。例如,请参见the logging cookbook

最佳实践是您创建自己的日志记录层次结构,例如在main.py(logger = logging.getLogger("myapp"))中创建“ myapp”,并使用例如myapp.backend({{ 1}}。

在以下位置找到main.py和backend.py的略微修改版本。我已经删除了烧瓶部分。我想这不会影响测井技术。

main.py

logger = logging.getLogger(".".join("myapp", __name__))

backend.py

import logging.config

from module import backend

dict_config = {
    'version': 1,
    'formatters': {
        'default': {
            'format': '[%(asctime)s] {%(pathname)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
        }
    },
    'handlers': {'default': {
        'level': 'DEBUG',
        'formatter': 'default',
        'class': 'logging.handlers.RotatingFileHandler',
        'filename': "test.log",
        'maxBytes': 5000000,
        'backupCount': 10
    },
        'console': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',
            'formatter': 'default',
        },
    },
    'loggers': {
        'myapp': {
            'handlers': ["default"],
            'level': 'DEBUG',
        },
    },
    'root': {
        'handlers': ["console"],
        'level': 'DEBUG',
    },
}

print(__name__)
logger = logging.getLogger("myapp")
logging.config.dictConfig(dict_config)


def hello():
    logger.debug("DEBUG: Inside the home function")
    logger.info("INFO: Inside the home function")
    backend.test()
    return "Welcome"


print(hello())

答案 1 :(得分:0)

我认为我找到了解决问题的方法。下面给出的是我更新的main.pybackend.py,并确认能正常工作

main.py

import logging
from module import backend

log_level = "DEBUG"
LOGFILENAME = "flask.log"
class LoggerConfig:
    dictConfig = {
        'version': 1,
        'formatters': {'default': {
            'format': '[%(asctime)s] {%(pathname)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',
        }},
        'handlers': {'default': {
                    'level': 'DEBUG',
                    'formatter': 'default',
                    'class': 'logging.handlers.RotatingFileHandler',
                    'filename': LOGFILENAME,
                    'maxBytes': 5000000,
                    'backupCount': 10
                }},
        'root': {
            'level': log_level,
            'handlers': ['default']
        },
    }

app = Flask(__name__)

logging.config.dictConfig(LoggerConfig.dictConfig)

@app.route('/')
def hello():
    app.logger.debug("DEBUG: Inside the home function")
    app.logger.info("INFO: Inside the home function")
    backend.test()
    return "Welcome"

backend.py

import logging
logger = logging.getLogger()

def test():
    logger.info("info test")
    logger.debug("debug test")

如果您注意到,backend.py的第二行基本上是logging.getLogger(),没有名称。这在backend side上起到了作用。

此外,API方面(app.logger方面的main.py也有帮助。

总体而言,我能够同时将main.pybackend.py写入dictConfig中给定的相同文件中。