Djangologging⽇志模块详解(⽇志记录模板配置)
⼀.Django⽇志
Django使⽤python内建的logging模块打印⽇志,Python的logging配置由四个部分组成:
1>.记录器(Logger)
2>.处理程序(Handler)
3>.过滤器(Filter)
4>.格式化(Formatter)
⼆、Logger 记录器
Logger 是⽇志系统的⼊⼝。每个 logger 都是命名了的 bucket,消息写⼊ bucket 以便进⼀步处理。
Logger 可以配置⽇志级别。⽇志级别描述了由该 logger 处理的消息的严重性。Python 定义了下⾯⼏种⽇志级别:
DEBUG:排查故障时使⽤的低级别系统信息
INFO:⼀般的系统信息
WARNING:描述系统发⽣了⼀些⼩问题的信息
ERROR:描述系统发⽣了⼤问题的信息
CRITICAL:描述系统发⽣严重问题的信息
每⼀条写⼊ logger 的消息都是⼀条⽇志记录。每⼀条⽇志记录也包含⽇志级别,代表对应消息的严重程度。⽇志记录还包含有⽤的元数据,来描述被记录的事件细节,例如堆栈跟踪或者错误码。
当 logger 处理⼀条消息时,会将⾃⼰的⽇志级别和这条消息的⽇志级别做对⽐。如果消息的⽇志级别匹配或者⾼于 logger 的⽇志级别,它就会被进⼀步处理。否则这条消息就会被忽略掉。
当 logger 确定了⼀条消息需要处理之后,会把它传给 Handler。
Django 内置记录器
类类功能描述
django.server 由RunServer命令调⽤的服务器所接收的请求的处理相关的⽇志消息。HTTP 5XX响应被记录为错误消息,4XX响应被记录为警告消息,其他⼀切都被记录为INFO。
django.db.backends 有关代码与数据库交互的消息。例如,请求执⾏的每个应⽤程序级SQL语句都在调试级别记录到此记录器。
三、Handler 处理程序
Handler 是决定如何处理 logger 中每⼀条消息的引擎。它描述特定的⽇志⾏为,⽐如把消息输出到屏幕、⽂件或⽹络 socket。
和 logger ⼀样,handler 也有⽇志级别的概念。如果⼀条⽇志记录的级别不匹配或者低于 handler 的⽇志级别,对应的消息会被 handler 忽略。
⼀个 logger 可以有多个 handler,每⼀个 handler 可以有不同的⽇志级别。这样就可以根据消息的重要性不同,来提供不同格式的输出。例如,你可以添加⼀个 handler 把 ERROR 和 CRITICAL 消息发到寻呼机,再添加另⼀个 handler 把所有的消息(包括 ERROR 和 CRITICAL 消息)保存到⽂件⾥以便⽇后分析。
Logging ⾃⾝携带Handler
logging模块提供了⼀些处理器,可以通过各种⽅式处理⽇志消息。
类名功能描述
logging.StreamHandler 类似与sys.stdout或者sys.stderr的任何⽂件对象(file object)输出信息
logging.FileHandler 将⽇志消息写⼊⽂件filename。
logging.handlers.DatagramHandler(host,port) 发送⽇志消息给位于制定host和port上的UDP服务器。使⽤UDP协议,将⽇志信息发送到⽹络
logging.handlers.HTTPHandler(host, url) 使⽤HTTP的GET或POST⽅法将⽇志消息上传到⼀台HTTP 服务器。
logging.handlers.RotatingFileHandler(filename) 将⽇志消息写⼊⽂件filename。如果⽂件的⼤⼩超出maxBytes制定的值,那么它将被备份为filenamel。
logging.handlers.SocketHandler 使⽤TCP协议,将⽇志信息发送到⽹络。
logging.handlers.SysLogHandler ⽇志输出到syslog
logging.handlers.NTEventLogHandler 远程输出⽇志到Windows NT/2000/XP的事件⽇志
logging.handlers.SMTPHandler 远程输出⽇志到邮件地址
logging.handlers.MemoryHandler ⽇志输出到内存中的制定buffer
注意:由于内置处理器还有很多,如果想更深⼊了解。可以查看官⽅⼿册。
四、Filter过滤器
在⽇志从 logger 传到 handler 的过程中,使⽤ Filter 来做额外的控制。
默认情况下,只要级别匹配,任何⽇志消息都会被处理。不过,也可以通过添加 filter 来给⽇志处理的过程增加额外条件。例如,可以添加
⼀个 filter 只允许某个特定来源的 ERROR 消息输出。
Filter 还被⽤来在⽇志输出之前对⽇志记录做修改。例如,可以写⼀个 filter,当满⾜⼀定条件时,把⽇志记录从 ERROR 降到 WARNING 级别。
Filter 在 logger 和 handler 中都可以添加;多个 filter 可以链接起来使⽤,来做多重过滤操作。
五、Formatters格式化器
⽇志记录最终是需要以⽂本来呈现的。Formatter 描述了⽂本的格式。⼀个 formatter 通常由包含 LogRecord attributes 的 Python 格式化字符串组成,不过你也可以为特定的格式来配置⾃定义的 formatter。
格式描述
%(name)s 记录器 logger 的名字
%(levelno)s 数据形式的⽇志记录级别
%(levelname)s ⽂本形式的⽇志记录级别
%(filename)s 执⾏⽇志记录调⽤的源⽂件的⽂件名
%(pathname)s 执⾏⽇志记录调⽤的源⽂件的全路径+⽂件名
%(funcName)s 执⾏⽇志记录调⽤的函数名称
%(module)s 调⽤的模块名称,django是 app 的名称
%(lineno)d 记录调⽤的⾏号
%(created)s 执⾏⽇志记录的时间
%(asctime)s ⽇期时间
%(msecs)s 毫秒部分
%(thread)s 线程ID
%(threadName)s 线程名称
%(process)d 进程ID
%(message)s 记录的消息,⾃定义内容
时间格式参数:
格式描述
'S' Seconds
'M' Minutes
'H' Hours
'D' Days
'W0' - 'W6' Weekday (0=Monday)
'midnight' Roll over at midnight
六:Django 集成⽇志logginger 模块
1、在项⽬setting.py ⽂件中,配置logginger ⽇志, 核⼼代码如下:
# ⽇志配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
'style': '{',
},
'simple': {
'format': '{levelname} {message}',
'style': '{',
},
"default": {
"format": '%(asctime)s %(name)s %(pathname)s:%(lineno)d %(module)s:%(funcName)s '
'%(levelname)s- %(message)s',
"datefmt": "%Y-%m-%d %H:%M:%S"
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'default'
},
'file': {
'level': 'DEBUG',
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': os.path.join(BASE_DIR, 'logs/debug.log'),
'when': "D",
'interval': 1,
'formatter': 'default'
},
"request": {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/request.log'),
'formatter': 'default'
},
"server": {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/server.log'),
'formatter': 'default'
},
"root": {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/root.log'),
'formatter': 'default'
},
"db_backends": {
'level': 'DEBUG',
'class': 'logging.FileHandler',
博客模板大全'filename': os.path.join(BASE_DIR, 'logs/db_backends.log'), 'formatter': 'default'
},
"autoreload": {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, 'logs/autoreload.log'), 'formatter': 'default'
}
},
'loggers': {
# 应⽤中⾃定义⽇志记录器
'mylogger': {
'level': 'DEBUG',
'handlers': ['console', 'file'],
'propagate': True,
},
"django": {
"level": "DEBUG",
"handlers": ["console", "file"],
'propagate': False,
},
"quest": {
"level": "DEBUG",
"handlers": ["request"],
'propagate': False,
},
"django.server": {
"level": "DEBUG",
"handlers": ["server"],
'propagate': False,
},
"django.db.backends": {
"level": "DEBUG",
"handlers": ["db_backends"],
'propagate': False,
},
"django.utils.autoreload": {
"level": "INFO",
"handlers": ["autoreload"],
'propagate': False,
}
},
'root': {
"level": "DEBUG",
"handlers": ["root"],
}
}
2、应⽤中添加logginger ⽇志记录
1、在应⽤的views.py ⽂件中添加logging 模块依赖,并在相关⽅法中输出相关⽇志记录
import logging
# ⽇志输出常量定义
logger = Logger('mylogger')
# json 数据提交,并转换为实体,执⾏⼊库操作
def insertJSON(request):
logger.info("post request body 请求数据提交")
json_str = request.body
json_str = json_str.decode() # python3.6及以上不⽤这⼀句代码
dict_data = json.loads(json_str) # loads把str转换为dict,dumps把dict转换为str
item = Book()
<_obj(item, **dict_data)
print("名称: {}, 价格: {}, 作者: {}".format(item.name, item.price, item.author))
# 执⾏数据库插⼊
item.save()
return response_success(message="数据⼊库成功")
注意:在logginer 配置⽂件中,定义⾃定义记录器mylogger 对应实例化对象就是views.py ⽂件中实例的logging对象。
3、⽇志记录结果展⽰:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论