前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python日志动态收集

python日志动态收集

作者头像
流川疯
发布2021-12-06 16:30:52
4020
发布2021-12-06 16:30:52
举报
文章被收录于专栏:流川疯编写程序的艺术

文章大纲

简介

项目进行时遇到了一个问题,需要将生成的日志按照项目类别输出到不同的目录下,具体解决方案如下:

1. 日志各式

日志的格式选择标准字典,default的级别设置为DEBUG,warn为WARN,error为ERROR。写文件的handler类为’class’: ‘logging.handlers.RotatingFileHandler’。

2. 继承类

写一个继承logging.logger的类,实例化时输入需要创建的目录名称即可。

解决方案

3. 代码与配置

代码语言:javascript
复制
class MyLogger(logging.Logger):
    _is_initialize = False
    def __new__(cls, app_name):
        if not cls._is_initialize:
            base_dir = os.path.dirname(os.path.abspath(__file__))
            base_log_dir = os.path.join(base_dir, "../logs/{}".format(app_name))
LOGGING = {
                'version': 1,  # 保留的参数,默认是1
                'disable_existing_loggers': False,  # 是否禁用已经存在的logger实例
                # 日志输出格式的定义
                'formatters': {
                    'standard': {  # 标准的日志格式化
                        'format': '%(levelname)s %(asctime)s %(module)s %(message)s'
                    },
                    'error': {  # 错误日志输出格式
                        'format': '%(levelname)s %(asctime)s %(pathname)s %(module)s %(message)s'
                    },
                    'simple': {
                        'format': '%(levelname)s %(asctime)s %(message)s'
                    },
                    'collect': {
                        'format': '%(message)s'
                    }
                },
                # 过滤器
                'filters': {
                    'require_debug_true': {
                        '()': 'django.utils.log.RequireDebugTrue',
                    },  # 针对 DEBUG = True 的情况
                },
                # 处理器:需要处理什么级别的日志及如何处理
                'handlers': {
                    # 将日志打印到终端
                    'console': {
                        'level': 'DEBUG',  # 日志级别
                        'class': 'logging.StreamHandler',  # 使用什么类去处理日志流
                        'formatter': 'simple'  # 指定上面定义过的一种日志输出格式
                    },
                    # 默认日志处理器
                    'default': {
                        'level': 'DEBUG',
                        'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
                        'filename': os.path.join(base_log_dir, "default.log"),  # 日志文件路径
                        'maxBytes': 1024 * 1024 * 100,  # 日志大小 100M
                        'backupCount': 5,  # 日志文件备份的数量
                        'formatter': 'standard',  # 日志输出格式
                        'encoding': 'utf-8',
                    },
                    # 日志处理级别warn
                    'warn': {
                        'level': 'WARN',
                        'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
                        'filename': os.path.join(base_log_dir, "warn.log"),  # 日志文件路径
                        'maxBytes': 1024 * 1024 * 100,  # 日志大小 100M
                        'backupCount': 5,  # 日志文件备份的数量
                        'formatter': 'standard',  # 日志格式
                        'encoding': 'utf-8',
                    },
                    # 日志级别error
                    'error': {
                        'level': 'ERROR',
                        'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
                        'filename': os.path.join(base_log_dir, "error.log"),  # 日志文件路径
                        'maxBytes': 1024 * 1024 * 100,  # 日志大小 100M
                        'backupCount': 5,
                        'formatter': 'error',  # 日志格式
                        'encoding': 'utf-8',
                    },
                    'request_handler': {
                        'level': 'DEBUG',
                        'class': 'logging.handlers.RotatingFileHandler',
                        'filename': os.path.join(base_log_dir, "request.log"),
                        'maxBytes': 1024 * 1024 * 5,
                        'backupCount': 5,
                        'formatter': 'standard',
                    },
                    'scripts_handler': {
                        'level': 'DEBUG',
                        'class': 'logging.handlers.RotatingFileHandler',
                        'filename': os.path.join(base_log_dir, "script.log"),
                        'maxBytes': 1024 * 1024 * 5,
                        'backupCount': 5,
                        'formatter': 'standard',
                    }
                },

                'loggers': {
                    # 默认的logger应用如下配置
                    'default': {
                        'handlers': ['default', 'warn', 'error'],
                        'level': 'DEBUG',
                        'propagate': True,  # 如果有父级的logger示例,表示不要向上传递日志流
                    },
                    'collect': {
                        'handlers': ['console', 'default', 'warn', 'error'],
                        'level': 'INFO',
                    },
                    'django': {
                        'handlers': ['console'],
                        'level': 'INFO',
                        'propagate': False
                    },
                    'django.request': {
                        'handlers': ['request_handler'],
                        'level': 'INFO',
                        'propagate': False,
                    },
                    'scripts': {
                        'handlers': ['scripts_handler'],
                        'level': 'INFO',
                        'propagate': False
                    },
                    'django.db.backends': {
                        'handlers': ['console'],
                        'propagate': True,
                        'level': 'DEBUG',
                    },

                },
            }

            if not os.path.exists(base_log_dir):
                os.makedirs(base_log_dir)

            logging.config.dictConfig(LOGGING )
            cls._is_initialize = True
        return logging.getLogger('collect')

4.选择__new__方法而不是__init__方法

如果选择__init__初始化的方式,每调用一次就初始化一次,会浪费一些资源,积少成多将会造成大量浪费。

5.如果文件不存在则创建,否则不创建:

代码语言:javascript
复制
if not os.path.exists(base_log_dir):
    os.makedirs(base_log_dir)

6.加载logging的字典

代码语言:javascript
复制
logging.config.dictConfig(LOGGING )
    cls._is_initialize = True

7.使用方式

需要用的地方加入下面代码:

代码语言:javascript
复制
import logging
logger = logging.getLogger('django')
def  test():
	logger.info('info occured ')
	logger.error('error occured')
	logger.warning('warning occured')

djanjo 使用:https://docs.djangoproject.com/zh-hans/3.0/topics/logging/

python logging 模块简介:https://cloud.tencent.com/developer/article/1354396

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章大纲
  • 简介
    • 1. 日志各式
      • 2. 继承类
      • 解决方案
        • 3. 代码与配置
          • 4.选择__new__方法而不是__init__方法
            • 5.如果文件不存在则创建,否则不创建:
              • 6.加载logging的字典
                • 7.使用方式
                相关产品与服务
                日志服务
                日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档