Django日志——输出到log文件

我们都知道在项目中日志是非常重要的,因为项目在服务器中运行出现了Bug没有日志去记录,我们可能根本就不知道存在这个Bug。以前在学校自己搞搞开发没觉得,现在想想日志真的不可或缺。

首先了解日志的5个等级:

  1. debug:出于调试目的的低层次系统信息
  2. info:普通的系统信息列表内容
  3. warning:描述已经发生的小问题
  4. error:描述已经发生的主要问题
  5. critical:描述已经发生的严重问题

第一步:配置Django中的setting.py文件

    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False if DEBUG else True,  # 是否禁用已经存在的日志器
    'formatters': {  # 日志信息显示的格式
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)s %(message)s'
            # "class": "pythonjsonlogger.jsonlogger.JsonFormatter"
        },
        'simple': {
            'format': '%(levelname)s %(asctime)s %(module)s %(funcName)s %(lineno)d %(message)s'
            # "class": "pythonjsonlogger.jsonlogger.JsonFormatter"
        },  # 日志记录级别+时间日期+模块名称+函数名称+行号+记录消息
    },
    'filters': {  # 对日志进行过滤
        'require_debug_true': {  # django在debug模式下才输出日志
            '()': 'django.utils.log.RequireDebugTrue',
        },
    },
    'handlers': {  # 日志处理方法
        'console': {  # 向终端中输出日志
            'level': 'DEBUG' if DEBUG else 'INFO',
            'filters': ['require_debug_true'],  # debug为true才会输出
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
        'info': {  # 向文件中输出日志
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_DIR+'/logs/', "info.log"),  # 日志文件的位置
            'maxBytes': 300 * 1024 * 1024,  # 300M大小
            'backupCount': 10,
            'formatter': 'verbose',
            'encoding': 'utf-8'
        },
        'demo': {   # 专门定义一个收集特定信息的日志
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
            'filename': os.path.join(BASE_DIR+'/logs/', "demo.log"),
            'maxBytes': 1024 * 1024 * 50,  # 日志大小 50M
            'backupCount': 5,
            'formatter': 'verbose',
            'encoding': "utf-8"
        },
        'city': {   # 专门定义一个收集特定信息的日志
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
            'filename': os.path.join(BASE_DIR+'/logs/', "city.log"),
            'maxBytes': 1024 * 1024 * 50,  # 日志大小 50M
            'backupCount': 5,
            'formatter': 'verbose',
            'encoding': "utf-8"
        },

    },
    'loggers': {  # 日志器
        "django": {        # 默认的logger应用如下配置
            "handlers": ["info", "console"],
            "propagate": True,
            "level": "INFO"
        },
        'demo_log': {      # 名为 'demo'的logger还单独处理
            'handlers': ['demo'],
            "propagate": True,
            'level': 'INFO',
        },
        'city_log': {      # 名为 'city'的logger还单独处理
            'handlers': ['city'],
            "propagate": True,
            'level': 'INFO',
        },
    }
    }

formatters:日志信息显示的格式,可以定义多种格式,上面定义了'verbose'和'simple'两种格式:
例如'verbose'的格式为'%(levelname)s %(asctime)s %(module)s %(lineno)s %(message)s'
在log文件打印的例子就会是这样:INFO 2019-12-05 09:04:28,707 views 234 打印出来了!!!
handlers:日志处理方法,可以定义多种方法,一般我习惯每增加一个Django子应用就新增一个,上面的'demo'和'city'是子应用。
loggers:日志器,我习惯和handlers一一对应编写。
handlers与loggers都存在level,两者不同:
1、loggers中的level表示可以接受的错误级别,就是说loggers接受level或者比level更高级别的错误,由propagate决定:propagate为True, 则向上传播;
2、handlers的level表示日志级别
注:要在项目根目录新建logs目录,用于存放log日志文件,日志文件不需要手动新建,项目运行的时候会自行新建。

第二步:新增exceptions.py文件封装日志

import logging
logger = logging.getLogger('django')
logger_demo = logging.getLogger('demo_log')
logger_city = logging.getLogger('city_log')

第三步:打印日志

logger.info("我打印在控制台上也打印在info.log上")
logger.error("我打印在控制台上也打印在info.log上")
logger_demo.info("我打印在demo.log上")
logger_demo.error("我打印在demo.log上")
logger_city.info("我打印在city.log上")
logger_city.error("我打印在city.log上")

这样就完成了,是不是很简单很easy!!!

你可能感兴趣的:(python,python-django,日志)