# 首先了解一下日志的基础知识:
我们使用的是python自带的logging模块进行的。
重点在于生成和处理日志消息。每条消息由一些文本和指示其严重性的相关级别组成。级别包含符号名称和数字值。
=>日志等级
级别 | 值 | 描述 |
CRITICAL | 50 | 关键错误/消息 |
ERROR | 40 | 错误 |
WARNING | 30 | 警告消息 |
INFO | 20 | 通知消息 |
DEBUG | 10 | 调试 |
NOTSET | 0 | 无级别,只要是信息都会写入,这样日志将会很大,没必要 |
=> 内置处理器
logging模块提供了一些处理器,可以通过各种方式处理日志消息。使用addHandler()方法将这些处理器添加给Logger对象。另外还可以为每个处理器配置它自己的筛选和级别。
handlers.DatagramHandler(host,port):发送日志消息给位于制定host和port上的UDP服务器。
handlers.FileHandler(filename):将日志消息写入文件filename。
handlers.HTTPHandler(host, url):使用HTTP的GET或POST方法将日志消息上传到一台HTTP 服务器。
handlers.RotatingFileHandler(filename):将日志消息写入文件filename。如果文件的大小超出maxBytes制定的值,那么它将被备份为filename1。
由于内置处理器还有很多,如果想更深入了解。可以查看官方手册。
# 在django中的基础使用
首先在setting文件里面设置:
#导入模块
import logging
import django.utils.log
import logging.handlers
#logging_setting
# 为了将日志文件按天保存,
rq = time.strftime('%Y%m%d', time.localtime(time.time()))
# 日志文件路径
BASE_LOG_DIR = os.path.join(BASE_DIR, "logs")
# 日志logging的基础配置,分四步走,第一步格式化日志内容
LOGGING = {
'version': 1, # 保留字
'disable_existing_loggers': False, # 禁用已经存在的logger实例
# 日志文件的格式
'formatters': {
# 详细的日志格式
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]''[%(levelname)s][%(message)s]'
},
# 简单的日志格式
'simple': {
'format': '[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d]%(message)s'
},
},
# 第二步:过滤器
'filters': {
},
# 第三步 自定义处理器
'handlers': {
# 日志等级CRITICAL > ERROR > WARNING > INFO > DEBUG
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler', #原生的sql语句会打印至日志,会导致文件很大。所以最好注释掉
'stream' : 'ext://sys.stdout',
# 文件重定向的配置,将打印到控制台的信息都重定向出去 python manage.py runserver >> /home/aea/log/test.log
'formatter': 'standard'
# 制定输出的格式,注意 在上面的formatters配置里面选择一个,否则会报错
},
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_LOG_DIR, f"{rq}_info.log"),
#这是将普通日志写入到日志文件中的方法,
'formatter': 'standard' },
# 默认的
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, f"{rq}_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 3, # 最多备份几个
'formatter': 'standard',
'encoding': 'utf-8',
},
# 专门用来记错误日志
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, f"{rq}_err.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
},
# 注册日志的处理器
'loggers': {
'django': {
'handlers': ['console', 'file'],
# 这里直接输出到控制台只是请求的路由等系统console,当使用重定向之后会把所有内容输出到log日志
'level': 'INFO', 'propagate': True, },
'django.request ': {
'handlers': ['console', 'file'],
'level': 'INFO',
# 配合上面的将警告log写入到另外一个文件 'propagate': True,
},
# 默认的logger
'': {
'handlers': ['default', 'error'],
'level': 'INFO',
'propagate': True, # 向不向更高级别的logger传递
},
'Server.web.views': {
'handlers': ['default', 'error'],
'level': 'INFO',
'propagate': True
},
},
}
以上是基本设置,注册了这个之后,开起来就好了,自定义的时候只需要在目标页面创建一个logger 就好了。
自定义: logger = logging.getLogger('Server.web.views') 里面的是注册的然后使用就好了。
上面的level后面的必须是大写,否则会报错。无法识别的等级。