18.配置日志系统, 方便排查问题、自定义日志输出

23 阅读2分钟

四个组件

  • 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",
        }
    },
}

控制台输出符合格式的日志 image.png

新增处理器

  • 日志输出到文件
  • 发送邮件
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",
        }
    },
}

image.png

自定义输出日志

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级别的日志 image.png