内置的logger在django项目运行中会自动记录日志,与我们手动创建的logger的执行没有关系,除非我们也创建相同的logger
django框架调用的地方在:django.core.servers.basehttp中(如WSGIRequestHandler)
django:django框架中所有消息的记录器,一般使用它的子记录器,而不是它发布消息,因为默认情况下子记录器的日志会传播到根记录器django,除非设置 'propagate': False
django.request:记录与请求处理相关的消息。5XX响应作为ERROR消息; 4XX响应作为WARNING消息引发。记录到django.security记录器的请求不会记录到django.request中
发送给此记录器的消息具有以下额外上下文:
status_code:与请求关联的HTTP响应代码
request:生成日志消息的请求对象。
django.server:记录与runserver命令调用的服务器接收的请求的处理相关的消息。5XX响应记录为ERROR 消息,4XX响应记录为WARNING消息,其他所有响应记录为INFO。
发送给此记录器的消息具有以下额外上下文:
status_code:与请求关联的HTTP响应代码
request:生成日志消息的请求对象。
django.template:记录与模板呈现相关的消息
django.db.backends:记录代码和数据库交互相关的消息
django.security.*:记录任何SuspiciousOperation和其他安全相关错误(django.security.csrf )的消息
django.db.backends.schema:记录数据库迁移过程中的日志,但是不记录执行的查询SQL语句等,发送给此记录器的消息具有以下额外上下文:
sql:已执行的SQL语句。
params:SQL调用中使用的参数
实战案例
如果你对以上的介绍觉得写得很乱又复杂,没关系,下面直接教你在项目中如何使用,基本就3种用法
通过文件分割日志
通过时间分割日志
通过邮箱发送日志
首先配置settings.py中的logging,代码如下
BASE_LOG_DIR = os.path.join(BASE_DIR, 'log') 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' }, 'default': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_LOG_DIR, 'debug.log'), 'maxBytes': 1024 * 1024 * 50, # 日志大小50M 'backupCount': 5, 'formatter': 'standard', 'encoding': 'utf-8', }, }, 'loggers': { 'django': { 'handlers': ['console', 'default'], 'level': 'INFO', 'propagate': True }, }, }接下来在views.py和urls.py函数中写入函数,代码如下
# urls.py urlpatterns = [ path('', views.index,), ] # views.py logger = logging.getLogger('django') def index(request): logger.debug('debug 测试') logger.info('info 测试') logger.warning('warning 测试') logger.error('error 测试') return HttpResponse('success')然后我们访问127.0.0.1/logging/,我们可以看到控制台的代码
Starting development server at :8000/ Quit the server with CONTROL-C. [2021-05-30 15:03:09][INFO]:info 测试 [2021-05-30 15:03:09][WARNING]:warning 测试 [2021-05-30 15:03:09][ERROR]:error 测试 [2021-05-30 15:03:09][INFO]:"GET /logging/ HTTP/1.1" 200 7这是因为我们在django记录器中配置了console控制器,格式要求也是符合我们所写的,接着查看项目的log目录下会新增了一个debug.log这样一个日志文件,文件内容如下
[2021-05-30 15:03:04][INFO][autoreload.py:578:run_with_reloader]:Watching for file changes with StatReloader [2021-05-30 15:03:09][INFO][views.py:12:index]:info 测试 [2021-05-30 15:03:09][WARNING][views.py:13:index]:warning 测试 [2021-05-30 15:03:09][ERROR][views.py:14:index]:error 测试 [2021-05-30 15:03:09][INFO][basehttp.py:154:log_message]:"GET /logging/ HTTP/1.1" 200 7debug.log日志输出格式更加详细,这是因为我们在default控制器中,使用的standard格式器。
总结:以上就是我们最常用的一种日志配置---文件日志,当中的细节例如格式啊等等的可以自己更改