python——日志

python中提供的logging模块是线程安全的,多进程运行时会有问题

一、日志

1.logging主要由四个部分组成:

  • Loggers: 提供直接调用的接口
  • Handlers: 设置日志最终输出的地方
  • Filters: 提供过滤的功能
  • Formatters: 设置输出日志的格式

2.示例:以字典格式作为配置参数

import logging.config
import os

LOGGING = {
    "version": 1,
    "formatters": {
        "basic_formatter": {
            "format": "[%(asctime)s] %(module)s %(process)d [%(levelname)s] %(message)s"
        }
    },
    "handlers": {
        # 调试的时候可以用,输出到终端
        "console_handler": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "basic_formatter",
            "stream": "ext://sys.stdout"
        },
        "file_handler": {
            # 文件备份方式,支持按大小和日期备份,多进程下有坑
            "class": "logging.handlers.RotatingFileHandler",
            "level": "DEBUG",
            "formatter": "basic_formatter",
            "filename": os.path.join(os.getcwd(), "log.txt"),
            "mode": "a+",
            "maxBytes": 524288000,
            "backupCount": 5,
            "encoding": "utf8"
        }
    },
    "loggers": {
        # getLogger时根据名字自动取用
        "debug": {
            "level": "DEBUG",
            "handlers": ["console_handler", "file_handler"]
        },
        "online": {
            "level": "INFO",
            "handlers": ["file_handler"]
        },
    }
}

if __name__ == "__main__":
    logging.config.dictConfig(LOGGING)
    LOG = logging.getLogger('online')

    LOG.info("123")
    LOG.error("error ... ... ")
    LOG.info("info ... ... ")
    LOG.warning("warning ... ... ")
    LOG.debug("debug ... ... ")

二、django中的使用

1.settings.py
按时间备份日志,但由于logging模块是线程安全的,所以实际环境中会有问题

LOGGING = {
    'version': 1,  # 指明dictConnfig的版本,目前就只有一个版本
    'disable_existing_loggers': False,  # 表示是否禁用django默认的日志配置,默认就是False
    'formatters': {
        'basic': {  # 格式器的名字
            # 时间 模块 进程号 级别 日志内容
            'format': '[%(asctime)s] %(module)s %(process)d [%(levelname)s] %(message)s'
        },
    },
    'handlers': {    # 定义处理日志的方式
        'file': {
            'level': 'DEBUG',
            # 'class': 'logging.FileHandler',
            'class': 'logging.handlers.TimedRotatingFileHandler',  # 按时间分割日志
            'when': 'midnight',    
            'interval': 1,    # 时间间隔1天
            'backupCount': 5,  # 保留5个备份日志
            'filename': '/var/log/kzzf/OfferHelp/django.log',
            'formatter': 'basic',
        },
    },
    'loggers': {    # log记录器,配置之后就会对应的输出日志
        'web': {    # django是默认的记录器,会记录请求的url,可以换个名字
            'handlers': ['file'],
            'level': 'INFO',
        },
    },
}

2.使用

import logging

LOG = logging.getLogger('web')    # 这里的web对应了loggers中的web

LOG.info("visit the finance")
LOG.error("this is a error msg")

3.linxu下多进程的解决方案
这个模块仅支持按日志大小分割,不利于定位问题,但将就用用把

pip install ConcurrentLogHandler
    'handlers': {    # 定义处理日志的方式
        'file': {
            'level': 'DEBUG',
            # 'class': 'logging.FileHandler',
            'class': 'cloghandler.ConcurrentRotatingFileHandler',  # linxu下多进程的解决方案
            'maxBytes': 1024000,
            'backupCount': 5,  # 保留5个备份日志
            'filename': '/var/log/kzzf/OfferHelp/django.log',
            'formatter': 'basic',
        },
发布了106 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43667990/article/details/105152785