四个组件
- Loggers:日志记录的处理类/对象,一个 Logger 可以有多个 Handlers
- Handlers:对于每一条日志消息如何处理,记录到 文件,控制台,还是网络
- Filters: 定义过滤器,用于 Logger/Handler 之上
- Formmaters: 定义日志文本记录的格式
四个日志级别
- DEBUG: 调试
- INFO: 常用的系统信息
- WARNING: 小的告警,不影响主要功能
- ERROR: 系统出现不可忽视的错误
- CRITICAL: 非常严重的错误
wangdalei_dj/wangdalei/settings.py
LOGGING = {
'version': 1,
# 是否禁用已经存在的loggers
'disable_existing_loggers': False,
# 日志的格式
'formatters': {
'simple': { # exact format is not important, this is the minimum information
'format': '%(asctime)s %(name)-12s %(lineno)d %(levelname)-8s %(message)s',
},
},
# 日志的处理器
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'simple',
}
},
'loggers': {
"django_python3_ldap": {
"handlers": ["console",],
"level": "DEBUG",
}
},
}
控制台输出符合格式的日志
新增处理器
- 日志输出到文件
- 发送邮件
mkdir -p /data/logs/recruitment/
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LOG_DIR = "/data/logs/recruitment/"
LOGGING = {
'version': 1,
# 是否禁用已经存在的loggers
'disable_existing_loggers': False,
# 日志的格式
'formatters': {
'simple': { # exact format is not important, this is the minimum information
'format': '%(asctime)s %(name)-12s %(lineno)d %(levelname)-8s %(message)s',
},
},
# 日志的处理器
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'mail_admins': { # Add Handler for mail_admins for `warning` and above
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
},
'file': {
# 'level': 'INFO',
'class': 'logging.FileHandler',
'formatter': 'simple',
'filename': os.path.join(LOG_DIR, 'recruitment.admin.log'),
},
},
'root': {
'handlers': ['console', 'file'],
'level': 'INFO',
},
'loggers': {
"django_python3_ldap": {
"handlers": ["console", "file"],
"level": "DEBUG",
}
},
}
自定义输出日志
wangdalei_dj/interview/admin.py
import logging
logger = logging.getLogger(__name__)
# 导出文件功能
def export_model_as_csv(modeladmin, request, queryset):
response = HttpResponse(content_type='text/csv')
field_list = exportable_fields
time_1 = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
response['Content-Disposition'] = 'attachment; filename=recruitment-candidates-list-%s.csv' % (time_1)
# 写入表头
writer = csv.writer(response)
writer.writerow(
[queryset.model._meta.get_field(f).verbose_name.title() for f in field_list],
)
for obj in queryset:
## 单行 的记录(各个字段的值), 根据字段对象,从当前实例 (obj) 中获取字段值
csv_line_values = []
for field in field_list:
field_object = queryset.model._meta.get_field(field)
field_value = field_object.value_from_object(obj)
csv_line_values.append(field_value)
writer.writerow(csv_line_values)
logger.info(" %s has exported %s candidate records" % (request.user.username, len(queryset)))
return response
导出文件时 会输出info级别的日志