django 日志配置

 

settings.py

# 日志配置
import logging
LOGGING = {
    'version': 1,  # 版本号 默认 1
    'disable_existing_loggers': False,  # 是否关掉第三方模块的日志功能,默认都是False的
    'formatters': {  # 日志记录的格式,这里写了两种(名字自定义) verbose simple
        'verbose': {  # levelname等级,asctime记录时间,module表示日志发生的文件名称,lineno行号,message错误信息
            'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
        },
    },
    'filters': {  # 过滤器:哪些信息可以被输出 debug_true/debug_false 的都可以被输出
        'require_debug_true': {  # 在debug=True下产生的一些日志信息,要不要记录日志,需要的话就在handlers中加上这个过滤器,不需要就不加
            '()': 'django.utils.log.RequireDebugTrue',
        },
        'require_debug_false': {  # 和上面相反
            '()': 'django.utils.log.RequireDebugFalse',
        },
    },
    'handlers': {  # 日志处往哪里输出 往控制台还是文件上 输出
        'console': {  # 在控制台输出时的实例
            'level': 'DEBUG',  # 日志等级;debug是最低等级,那么只要比它高等级的信息都会被记录
            'filters': ['require_debug_true'],  # 在debug=True下才会打印在控制台
            'class': 'logging.StreamHandler',  # 使用的python的logging模块中的StreamHandler来进行输出(StreamHandler)
            'formatter': 'simple'  # 指定输出的格式
        },
        # 往文件上进行输出
        'file': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # (RotatingFileHandler 文件输出的核心模块)
            # 日志位置,日志文件名,日志保存目录必须手动创建  日志输出到文件的路径,一定要写对,不然会报错
            'filename': os.path.join("D:\\Python3_study\\django04\\monitor01\\logs", "django04_monitor01.log"),  # 注意,你的文件应该有读写权限。
            # 日志文件的最大值,这里我们设置300M
            'maxBytes': 300 * 1024 * 1024,
            # 日志文件的数量,设置最大日志数量为10
            'backupCount': 10,
            # 日志格式:详细格式
            'formatter': 'verbose',
            'encoding': 'utf-8',  # 设置默认编码,否则打印出来汉字乱码
        },
    },
    # 日志对象
    'loggers': {
        'django': {  # 和django结合起来使用,将django中之前的日志输出内容的时候,按照我们的日志配置进行输出,
            'handlers': ['console', 'file'],  # 将来项目上线,把console去掉
            'propagate': True,
            # 冒泡:第三方模块报错,django捕捉到了,是否传递给第三方模块,默认都是True
        },
    }
}

 注意:日志文件生成,需要配置的路径的目录是确实存在的,才能生效.(需要先创建文件夹)

 

参考二:

https://blog.csdn.net/weixin_46371752/article/details/130727218

一、在settings.py中配置

#1、配置日志要保存的文件夹,创建文件夹
import time
BASE_LOG_DIR = os.path.join(BASE_DIR, 'logs')
error_path = os.path.join(BASE_DIR,'error')
if not os.path.exists(error_path):
    #如果logs/error/不存在,递归创建目录
    os.makedirs(error_path)
 
all_path = os.path.join(BASE_LOG_DIR,'all')
if not os.path.exists(all_path):
    #如果logs/all/目录不存在,就递归创建(如果logs目录不存在,也会创建)
    os.makedirs(all_path)
 
#2、相关的日志配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,  # 设置已存在的logger不失效
    'filters': {
    },
    'formatters': {
        'standard': {
            'format': '[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d:%(funcName)s]:%(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        },
        'simple': {
            'format': '[%(asctime)s][%(levelname)s]:%(message)s',
            'datefmt': '%Y-%m-%d %H:%M:%S'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'simple'
        },
        'file': { #按照文件大小分割日志,将所有的日志信息都保存在这里
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(BASE_LOG_DIR,'all', 'debug.log'),
            'maxBytes': 1024 * 1024 * 50,  # 日志大小50M
            'backupCount': 5,
            'formatter': 'standard',
            'encoding': 'utf-8',
        },
        'time_file':{#按照时间分割日志,每周一新增一个日志文件,存error等级以上的日志
              'level': 'INFO',#日志的等级
              'class': 'logging.handlers.TimedRotatingFileHandler',
              'filename': os.path.join(BASE_LOG_DIR,'error',f"{time.strftime('%Y-%m-%d')}.log"),#日志的文件名
              'when': 'D', #时间单位,M,H,D,'W0'(星期1),'W6'(星期天)
              'interval': 1,
              'backupCount': 5, #备份数量
              'formatter': 'standard', #使用的日志格式
              'encoding': 'utf-8',
        }
 
    },
    'loggers': {
        #INFO以上日志,打印在console,也写到以文件大小分割的日志中
        'django': {
            'handlers': ['console','file'],#handlers中存在的配置
            'level': 'INFO',
            'propagate': True
        },
        #error以上的日志写到按时间分割的日志文件中,同时打印在控制台
        'django.request': {
            'handlers': ['console','time_file'],#handlers中存在的配置
            'level': 'ERROR',
            'propagate': True
        },
 
    },
}

注意:日志文件生成,需要配置的路径的目录是确实存在的,才能生效.(需要先创建文件夹)

上面配置的第一步,就是创建日志存放的路径文件夹,如果文件夹不存在,就创建。

按时间分割:要做到每个月作为一个文件夹,里面存放当月的每一天生成的日志。

大致目录结构:logs/all 或log/error/ 会在系统首次运行创建起来。

项目根目录

        --logs

                --all

                        --debug.log

                --error

                        年-月-日.log

二、手动打印日志  

1、在根目录下的util包下创建log.py

#手动写日志
import logging
 
info_logger = logging.getLogger('django') 
#根据loggers配置handlers,将日志写到指定的地方
 
error_logger = logging.getLogger('django.request') 
#根据loggers配置handlers,将日志写到指定的地方

2、在视图中使用

from rest_framework.views import APIView
from rest_framework.response import Response
from utils.log import info_logger,error_logger
 
class Test_log(APIView):
    def get(self,request):
        info_logger.debug(f'{__file__},debug,django')
        info_logger.info(f'{__file__},info,django')
        info_logger.warning(f'{__file__},warning,django')
        info_logger.error(f'{__file__},error,django')
        return NewResponse(msg='测试成功')
    def post(self,request):
        error_logger.debug(f'{__file__}/Test_log,method=post,debug,django.request')
        error_logger.info(f'{__file__}/Test_log,method=post,info,django.request')
        error_logger.warning(f'{__file__}/Test_log,method=post,warning,django.request')
        error_logger.error(f'{__file__}/Test_log,method=post,error,django.request')
        return Response({msg:'测试成功'})

from utils.log import error_logger 

#用这个来手动写日志,会将日志写到按时间分割和按大小分割的文件中的

posted on 2023-03-29 17:49  zhangmingda  阅读(122)  评论(0编辑  收藏  举报

导航