Django日志输出到log文件的重要性

发布时间丨2022-11-01 11:07:38作者丨zhaomeng浏览丨37


Django开发web系统,以前自己做些小工具的时候对日志不够重视,但是当我们将做的系统工具给别人用的时候,一切都正常还好,一但存在数上传或者客户说上传了数据但是后台却没有对该数据的处理的数据,这时候我们想排查错误的时候就会变得非常的困难,甚至没有任何的办法拿出证明程序没有问题的情况,这个时候就需要日志作为我们排查问题的工具了,本片博文记录Django为每个app自定义日志的输出文件.

直接上干货,配置我们的日志文件,我的web系统中存在两个app,一个chmdata,bduserless,进入项目的settings.py

LOG_DIR = os.path.dirname(os.path.abspath(__file__))
# 日志文件配置
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'
        },

        'chemdata': {  # 专门定义一个收集特定信息的日志
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
            'filename': os.path.join(BASE_DIR + '/logs/', "crontask.log"),
            'maxBytes': 1024 * 1024 * 50,  # 日志大小 50M
            'backupCount': 5,
            'formatter': 'verbose',
            'encoding': "utf-8"
        },
        'bduseless': {  # 专门定义一个收集特定信息的日志
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件,自动切
            'filename': os.path.join(BASE_DIR + '/logs/', "analysis.log"),
            'maxBytes': 1024 * 1024 * 50,  # 日志大小 50M
            'backupCount': 5,
            'formatter': 'verbose',
            'encoding': "utf-8"
        },

    },
    'loggers': {  # 日志器
        "django": {  # 默认的logger应用以下配置
            "handlers": ["info", "console"],
            "propagate": True,
            "level": "INFO"
        },
        'chemdata_log': {  # 名为 'chemdata'的logger还单独处理
            'handlers': ['chemdata'],
            "propagate": True,
            'level': 'INFO',
        },
        'bduseless_log': {  # 名为 'bduseless'的logger还单独处理
            'handlers': ['bduseless'],
            "propagate": True,
            'level': 'INFO',
        },
    }
}

formatters:日志信息显示的格式,能够定义多种格式,上面定义了'verbose'和'simple'两种格式:
'verbose'的格式为'%(levelname)s %(asctime)s %(module)s %(lineno)s %(message)s'
在log文件打印的例子就会是这样:INFO 2022-10-28 14:11:05,239 views 15 数据统计页面请求成功!

打印出来了!!!
handlers:日志处理方法,能够定义多种方法,通常每增长一个Django子应用就新增一个,上面的'chemdata'和'bduseless'是子应用。
loggers:日志器,我习惯和handlers一一对应编写。
handlers与loggers都存在level,二者不一样:
一、loggers中的level表示能够接受的错误级别,就是说loggers接受level或者比level更高级别的错误,由propagate决定:propagate为True, 则向上传播;
二、handlers的level表示日志级别
注:要在项目根目录新建logs目录,用于存放log日志文件,日志文件不须要手动新建,项目运行的时候会自行新建

进入设置的app的views.py文件的编辑如下:

# 在chemdata/views.py
import logging
logger_chemdata = logging.getLogger('chemdata_log')
# 或则
logger = logging.getLogger('chemdata_log')
# 在bduseless/views.py
import logging
logger_bduseless = logging.getLogger('bduseless_log')
# 或者
logger= logging.getLogger('bduseless_log')

输出日志的格式:

logger.info("数据统计页面请求成功!")
logger.error("数据统计页面请求成功!")
logger_chemdata.info("chemdata页面请求成功!")
logger_chemdata.error("chemdata页面请求成功!")
logger_bduseless.info("bduseless页面请求成功!")
logger_bduseless.error("bduseless页面请求成功!")

默认的数据的加载报错日志会存储到info.log日志中!

本篇博客分享完成,你学会了吗?

推荐文章:Django日志输出到log文件的重要性