menu Chancel's blog
rss_feed
Chancel's blog
有善始者实繁,能克终者盖寡。

logging自动创建日志文件

作者:Chancel Yang, 创建:2021-07-08, 字数:1714, 已阅:77, 最后更新:2021-07-08

这篇文章更新于 1016 天前,文中部分信息可能失效,请自行甄别无效内容。

Python3的Logging模块支持以YAML配置文件形式导入日志配置,logging.yaml文件 内容类似于下面的形式

YAML
version: 1
formatters:
  common:
    format: "%(asctime)s - %(levelname)s - %(threadName)s - %(message)s"
    datefmt: "%Y/%m/%d %H:%M:%S"
  console:
    format: "%(asctime)s - %(levelname)s - %(pathname)s - %(message)s"
    datefmt: "%Y/%m/%d %H:%M:%S"
handlers:
  common:
    class: logging.handlers.TimedRotatingFileHandler
    formatter: common
    level: INFO
    when: D
    interval: 1
    encoding: utf8
    filename: "logs/running.log"
    backupCount: 7
  console:
    class : logging.StreamHandler
    formatter: console
    level   : INFO
    stream  : ext://sys.stdout
loggers:
  main.common:
    level: INFO
    handlers: [common]
root:
  level: DEBUG
  handlers: [console]

在项目入口 main.py文件 中用如下代码导入这个日志配置

Python
import logging
import yaml
from logging import config

with open('logging.yaml', 'r', encoding='utf-8') as f:
    config = yaml.load(f, Loader=yaml.FullLoader)
    logging.config.dictConfig(config)
logger = logging.getLogger('main.common')

这样非常方便我们配置不同环境下的日志配置,生产环境与测试环境打包不同的logging的文件即可以实现不同的日志输出效果

但上面的代码会引发一个问题,即如果handlers中指定的日志文件夹如果不存在就会抛出异常

所以需要在导入之前创建对应的文件夹,这个我遍寻了Logging的官方文档并没有找到,只能以手工方法创建,如果有官方配置方法还请不吝赐教

Python
import logging
import yaml
from logging import config

with open('logging.yaml', 'r', encoding='utf-8') as f:
    config = yaml.load(f, Loader=yaml.FullLoader)
    for key,value in config['handlers'].items():
        if value.get('filename'): 
            if not os.path.exists(os.path.dirname(value.get('filename'))):
                os.mkdir(os.path.dirname(value.get('filename')))
    logging.config.dictConfig(config)
logger = logging.getLogger('main.common')

[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]