django使用python自带的logging日志模块来实现,调试或者生产环境中调试信息的记录。尤其是在生产环境中尤为重要,与调试环境下 日志输出控制台不同,生产环境下需要将日志打印到文件中,方便检查程序运行过程中的相关信息。
官方文档查看地址>>>>>>>>https://docs.python.org/3/library/logging.handlers.html#rotatingfilehandler
测试历程github地址>>>>>>>https://github.com/veujs/djangocelery
1、logging模块
-
日志记录级别
logging模块的重点在于生成和处理日志消息。每条消息由一些文本和指示其严重性的相关级别组成。级别包含符号名称和数字值。级别 值 描述 CRITICAL 50 关键错误/消息 ERROR 40 错误 WARNING 30 警告消息 INFO 20 通知消息 DEBUG 10 调试 NOTSET 0 无级别 -
记录器
记录器负责管理日志消息的默认行为,包括日志记录级别、输出目标位置、消息格式以及其它基本细节参数 描述 filename 将日志消息附加到指定文件名的文件 filemode 指定用于打开文件模式 format 用于生成日志消息的格式字符串 datefmt 用于输出日期和时间的格式字符串 level 设置记录器的级别 stream 提供打开的文件,用于把日志消息发送到文件。 -
日志格式
格式 描述 %(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 记录的消息 -
Handler处理器(具体参数可参考官方使用文档,前三个为常用的)
格式 描述 StreamHandler 发送日志到sys.stdout、sys.stder等 RotatingFileHandler 输出日志到文件中、支持以文件大小回滚切分文件 TimedRotatingFileHandler 输出日志到文件中、支持以时间间隔回滚切分文件 HTTPHandler 使用HTTP的GET或POST方法将日志消息上传到一台HTTP 服务器 SMTPHandler 支持通过SMTP发送消息记录到一个电子邮件地址 ueueHandler 支持发送记录消息到队列中 SocketHandler 送日志输出到网络套接字 DatagramHandler 支持通过UDP套接字发送日志记录消息
2、django中使用logging模块记录日志
注:以下内容为实际验证过的
-
settings.py文件中配置如下:
# 日志文件 BASE_LOG_DIR = os.path.join(os.path.dirname(BASE_DIR), "logs") LOGGING = { 'version': 1, 'disable_existing_loggers': False, # 选择是否使用django默认的logger记录器 'formatters': { # 配置打印日志格式 'standard': { # name:记录器的名称 lineo:执行日志记录调用的行号 module:执行日志记录调用的模块名称 funcName:模块中调用的函数 levelname:日志级别 'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'} }, # 'filters': { # 过滤器 # 控制哪些日志可以从logger流向Handler # 'require_debug_true': { # '()': 'django.utils.log.RequireDebugTrue', # }, # }, 'handlers': { # 用来定义具体处理日志的方式(规定日志输出到哪里),可以定义多种,"default"就是默认方式,"console"就是打印到控制台方式 'default': { 'level': 'warning', # level==warning表示筛选logger传递过来的warning及以上的日志信息,下面配置含义相同 'class': 'logging.handlers.RotatingFileHandler', # 会根据文件大小(5M)自动切分log文件 'filename': os.path.join(BASE_LOG_DIR, "warning.log"), # 日志输出文件名称 'maxBytes': 1024 * 1024 * 5, # 文件大小 'backupCount': 5, # 备份份数 'formatter': 'standard', # 使用哪种formatters日志格式 }, 'error': { 'level': 'ERROR', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_LOG_DIR, "error.log"), 'maxBytes': 1024 * 1024 * 5, 'backupCount': 5, 'formatter': 'standard', }, 'request_handler': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_LOG_DIR, "debug.log"), 'maxBytes': 1024 * 1024 * 5, 'backupCount': 5, 'formatter': 'standard', }, # # 在终端打印 # 'console': { # 'level': 'DEBUG', # 'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志 # 'class': 'logging.StreamHandler', # # 'formatter': 'simple' # }, }, 'loggers': { # LOGGER记录器,配置用那种handlers来处理日志,比如你同时需要输出日志到文件、控制台。----logger传递日志到handler # 以下三个为django基本需要的记录器,尽量不要动 # ‘’ 日志实例对象默认配置(需要'disable_existing_loggers': False才能生效),此时在别的模块中使用logger_default = logging.getLogger(__name__),记录器的名称为该模块的名称,并使用default处理器来处理日志 '': { 'handlers': ['default'], 'level': 'DEBUG', 'propagate': False # 向不向更高级别的logger传递 }, 'django': { # 若将对应的handler中的level等级改为DEBUG,那么会在日志文件中把所有的信息打印出来,包括对数据库的操作(前提是django开启的是DEBUG模式!!) 'handlers': ['default'], 'level': 'DEBUG', 'propagate': False # 向不向更高级别的logger传递 }, 'django.request': { # 这个记录器用于记录django框架里面的所有request请求的记录,名称必须为django.request!!!! 'handlers': ['request_handler'], 'level': 'DEBUG', 'propagate': False, }, # 下面自定义记录器 'views_error': { # 'handlers': ['default', 'error', 'request_handler'], # 会根据三个handler中日志的等级,在其对应的日志文件中进行打印 'level': 'DEBUG', 'propagate': True }, }, } -
view.py文件中设置
# 首先,导入logging模块 import logging # 获取记录器 # logger = logging.getLogger('django.request') # 使用settings模块中设置的django.request记录器 # logger = logging.getLogger('views_error') # 使用settings模块中设置的views_error记录器 logger110 = logging.getLogger(__name__) # 以当前模块名为记录器名称,通过这种方式声明的,其loggers会默认使用上文中定义好的 ‘’ 对应的记录器 def index(request): logger110.info("info: this is a info level") logger110.debug("debug: this is a debug level") logger110.warning("warning: this is a warning level") logger110.error("error: this is a error level") print(logger110.name) return render(request, 'index.html') -
结果展示
运行django项目,访问127.0.0.1:8000
查看error.logwarning.logdebug.log三个文件中的日志打印情况,如下:
可以看到,在warning.log文件中打印了WARNING和ERROR日志信息,而INFO信息则被过滤掉了
3、需要进一步整理的内容如下:
-
django中默认的logger记录器在哪儿定义的
-
filters的使用
-
使用函数配置logger
# 利用函数的方式手动配置单个logger记录器的方法如下: import logging logger = logging.getLogger(__name__) # __name__为当前模块的名称 logger.setLevel(level=logging.INFO) Handler = logging.FileHandler(os.path.join(settings.BASE_LOG_DIR, "tasksystem.log")) formatter = logging.Formatter('%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s') Handler.setFormatter(formatter) logger.addHandler(Handler)