Django的日志操作,记录一下自己的使用

日志使用的流程:

1.先要在settings.py 中加入日志的配置

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # 是否禁用已经存在的日至实例(diango自带的报错),一般不禁用
    'formatters': {  # 定义输出日志的格式
        'standard': {  # 格式名字可以随意定义
            'format': '[%(levelname)s][%(asctime)s][%(filename)s][%(funcName)s][%(lineno)d] > %(message)s'  # 定义信息格式,自己随便定义,都有什么内容查看下边内容
        },
        'simple': {
            'format': '[%(levelname)s]> %(message)s'
        },
    },
    'filters': {
        'require_debug_true': {  # 只有在settings中的debug=True的时候才会生效
            '()': 'django.utils.log.RequireDebugTrue',  # 指定过滤器但是不知道是干什么的没研究明白
        },
    },
    'handlers': {  # 都叫这个为控制器,控制是什么样的记录方式等的一些参数
        'default': {
            'level': 'DEBUG',  # 日志级别
            'class': 'logging.handlers.RotatingFileHandler',  # 定义日志的切分格式,以及输出方式
            'filename': os.path.join(LOGS_DIR, 'django.log'),  # 日志文件,请确保修改'filename'路径为运行Django应用的用户有权限写入的一个位置
            'maxBytes': 1024 * 1024 * 5,  # 5 MB 文件大小
            'backupCount': 60,  # 备份份数
            'formatter': 'standard',  # 使用哪种日志格式
        },
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler', # 输出到控制台,这个类指定的不同输出方式不一样,下边是这个地方指定的类所需要的参数
            'formatter': 'simple'
        },
        'file': {
           'level': 'DEBUG',
           'class': 'logging.handlers.TimedRotatingFileHandler',
           # TimedRotatingFileHandler的参数, 其他博客上说这个类可以按照日期分割日志,但是我没试出来
           # 参照https://docs.python.org/3/library/logging.handlers.html#timedrotatingfilehandler
           # 目前设定每天一个日志文件
           'filename': os.path.join(LOGS_DIR, 'django.log'),
           'when': 'midnight',
           'interval': 1,
           'backupCount': 60,
           'formatter': 'standard'
          },
        # 'file_handler': {
        #      'level': 'INFO',
        #      'class': 'logging.handlers.TimedRotatingFileHandler',
        #      'filename': os.path.join(LOGS_DIR, 'django.log'),
        #      'formatter': 'standard'
        # },  # 用于文件输出
    },
    'loggers': {  # 都叫这个容器,配置上容器内使用什么控制器记录日志,后边实例化时getLogger内写的就是这个里面的某个容器名
        'django': {
            'handlers': ['default', 'console'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'django.everyday': {
            'handlers': ['file', 'console'],
            'level': 'DEBUG',
            'propagate': True,
        },
        # 'django.request': {
        #     'handlers': ['mail_admins'],
        #     'level': 'ERROR',
        #     'propagate': False,
        # },
    }
}

 上边提到的信息输出格式都有以下内容:

格式 描述
%(name)s 记录器的名称
%(levelno)s 数字形式的日志记录级别
%(levelname)s 日志记录级别的文本名称
%(filename)s 执行日志记录调用的源文件的文件名称
%(pathname)s 执行日志记录调用的源文件的路径名称
%(funcName)s 执行日志记录调用的函数名称
%(module)s 执行日志记录调用的模块名称
%(lineno)s

执行日志记录调用的行号

%(created)s 执行日志记录的时间
%(asctime)s 日期和时间
%(msecs)s 毫秒部分
%(thread)d 线程ID
%(threadName)s 线程名称
%(process)d 进程ID
%(message)s 记录的消息

2.去视图中实例化一个日志记录的对象

logger = logging.getLogger("django.everyday")

实例化时传入的参数应该是配置文件内loggers容器内声明好的容器

3.实例化对象后在需要输出日志的地方写上输出语句

logger.info(msg)
logger.error(e)

logger有不同的信息,调用不同方法写入不同的类型的信息

一般info是正常信息,warning是警告信息,error是错误信息,常用的就这些

注:

如果想要django自动记录一些内容需要在loggers中配置上名字叫django的容器,这样django才会自动将规定等级以上的信息写入日志