zoukankan      html  css  js  c++  java
  • logging日志文件配置

    Django配置如下

    简洁版:

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {  # 这里是打印console里面的sql语句的日志配置,
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }

    完整版:(我们的程序运行的时候,需要有日志记录运行的过程,每一次的点击交互事件都是程序在运行的过程,每一次都需要记录下来,我们不可能在程序里面加上成千上万的print然后都打印到屏幕里面,那样不便于整理,也不现实,这个时候我们的日志就应运而生了,我们在setting里面把日志配置好,然后根据我们配置的参数,我们的每一次程序运行都打印到一个文件里面,然后这个文件会根据我们设置的大小进行分割,就类似于换行,然后文件不会无限大,达到一定的上限之后就会自动开启另一个文件去保存数据,我们的程序上线之后,需要查bug都是通过日志去检验,看哪里有问题,需要进一步去调整,这就是我们的日志的关键所在)

    
    
    Django项目常用LOGGING配置
    BASE_LOG_DIR = os.path.join(BASE_DIR, "log")
    if not os.path.isdir(BASE_LOG_DIR):
    os.mkdir(BASE_LOG_DIR)

    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False, # 是否禁用已经存在的loggers示例,不禁用
    'formatters': {
    'standard': {
    'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
    '[%(levelname)s][%(message)s]'
    },
    'simple': {
    'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
    },
    'collect': {
    'format': '%(message)s'
    }
    },
    'filters': {
    'require_debug_true': {
    '()': 'django.utils.log.RequireDebugTrue',
    },
    },
    'handlers': {
    'console': {
    'level': 'DEBUG',
    'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
    'class': 'logging.StreamHandler',
    'formatter': 'simple'
    },
    'default': {
    'level': 'DEBUG',
    'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
    'filename': os.path.join(BASE_DIR, "genius20F_info.log"), # 日志文件路径,这里我们不要写绝对路径,就用系统内置的BASE_DIR,然后后面直接写文件名即可
    'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
    'backupCount': 3,
    'formatter': 'standard',
    'encoding': 'utf-8',
    },
         'SF': {
                'level': 'INFO',
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,根据文件大小自动切
                'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"),  # 日志文件
                'maxBytes': 1024 * 1024 * 50,  # 日志大小 50M
                'backupCount': 3,  # 备份数为3  xx.log --> xx.log.1 --> xx.log.2 --> xx.log.3
                'formatter': 'standard',
                'encoding': 'utf-8',
            },
            'TF': {
                'level': 'INFO',
                'class': 'logging.handlers.TimedRotatingFileHandler',  # 保存到文件,根据时间自动切
                'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"),  # 日志文件
                'backupCount': 3,  # 备份数为3  xx.log --> xx.log.2018-08-23_00-00-00 --> xx.log.2018-08-24_00-00-00 --> ...
                'when': 'D',  # 每天一切, 可选值有S/秒 M/分 H/小时 D/天 W0-W6/周(0=周一) midnight/如果没指定时间就默认在午夜
                'formatter': 'standard',
                'encoding': 'utf-8',
            },
            'error': {
    'level': 'ERROR',
    'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
    'filename': os.path.join(BASE_DIR, "genius20F_err.log"), # 日志文件
    'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
    'backupCount': 5,
    'formatter': 'standard',
    'encoding': 'utf-8',
    },
    'collect': {
    'level': 'INFO',
    'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
    'filename': os.path.join(BASE_DIR, "genius20F_collect.log"),
    'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
    'backupCount': 5,
    'formatter': 'collect',
    'encoding': "utf-8"
    }
    },
    'loggers': {
    # 默认的logger应用如下配置
    'django': { # *****这里是五星级提示:一定要写Django,这样系统console控制台输出的信息才会自动写入到文件中去,有的博客说这里写成“”,或者“django.service“都试过,有坑。
    'handlers': ['default', 'TF', 'error', 'console'], # 上线之后可以把'console'移除
    'level': 'DEBUG',
    'propagate': True, # 是否继承父类的log信息
    },
    'django.service': {
    'handlers': ['default', ],
    'propagate': True,
    'level': 'DEBUG', },
    # 名为 'collect'的logger还单独处理
    'collect': {
    'handlers': ['collect', ],
    'level': 'INFO',
    },
    # 自定义logger处理方式,专门为文件genius20F.utils.commons.py单独做处理
    # 'genius20F.utils.commons': {
    # 'handlers': ['error', ],
    # 'level': 'INFO',
    # 'propagate': True,
    # }
    },
    }
     

    配置好之后,程序运行的时候就会自动生成日志文件在项目目录下面。

    在程序中使用log:

    import logging
    def index(arg):
      try:
        if arg>10:
        print("hello")
      except Exception as e:
        logger = logging.getLogger(__name__)
        logger.error(e)
      return arg

    程序走到这里的时候,就会在error的文件夹里面把信息记录下来。

    flask配置如下

    直接在项目根目录下创建logging文件,写入如下代码

    import os
    import logging
    from logging.handlers import RotatingFileHandler
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    class LoggingSet():
        def __init__(self):
            self.path = os.path.join(BASE_DIR, "flask_check_list/flask_logs")
            self.maxBytes = 1024 * 1024 * 100
            self.default_formatter = logging.Formatter(
                '%(levelname)s %(filename)s:%(lineno)d %(message)s')
            self.error_formatter = logging.Formatter(
                '[%(asctime)s] [%(filename)s:%(lineno)d	] [%(levelname)s]  %(message)s '
            )
    
        def debug_log(self, log_level):
            logging.basicConfig(level=log_level)
            file_log_handler = RotatingFileHandler(
                os.path.join(self.path, "flask.log"),
                # maxBytes=1024 * 1024 * 100,
                maxBytes=self.maxBytes,
                backupCount=10
            )
            file_log_handler.setFormatter(self.default_formatter)
            logging.getLogger().addHandler(file_log_handler)
    
        def error_log(self, log_level):
            logging.basicConfig(level=log_level)
            file_error_handler = RotatingFileHandler(
                os.path.join(self.path, 'error.log'),
                maxBytes=self.maxBytes,
                backupCount=5
            )
            file_error_handler.setFormatter(self.error_formatter)
            logging.getLogger().addHandler(file_error_handler)

    在项目根目录的__init__文件中创建app,如下使用logging配置:

    from .loggins import LoggingSet
    
    logger = LoggingSet()

    def create_app(): app = Flask(__name__) connect('test', host='127.0.0.1', port=27017) app.config.from_object("settings.DevelopmentConfig") app.config['MONGODB_SETTINGS'] = { 'db': 'test', 'host': 'localhost', 'port': 27017 } logger.debug_log(logging.DEBUG) logger.error_log(logging.ERROR) db.init_app(app) app.debug = True return app app = create_app()

    这样就可以了,这是自己写的比较简单的类方法,与Django的配置比较起来确实寒酸些。。。。。。

  • 相关阅读:
    缺少一个=出现的问题
    快速排序+归并排序
    ACwing简单题(14)
    浅谈#ifndef
    fstream 使用详解
    _stat函数的使用
    关于文件结构体的使用
    new的使用
    ACwing13题目
    ACwing13题
  • 原文地址:https://www.cnblogs.com/2012-dream/p/8387039.html
Copyright © 2011-2022 走看看