1.Django日志配置

Django的日志配置主要通过settings.pyLOGGING配置来实现,示例如下:

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '[%(asctime)s] [%(levelname)s] [%(pathname)s:%(lineno)d] [%(module)s:%(funcName)s] \n %(message)s'
},

'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
'celery': {
'format': '%(asctime)s-%(name)s-%(levelname)s-%(filename)s-%(message)s'
}
},
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), "logs/api.log"),
'maxBytes': 300 * 1024 * 1024,
'backupCount': 10,
'formatter': 'standard'
},
},
'loggers': {
'main_logger': {
'handlers': ['console', 'file'],
'propagate': True,
'level': 'INFO',
}
}
}
  • formatters

格式化器,这里可以指定我们需要记录在日志中的信息以及呈现在日志中的格式,可用的属性参考python logging模块的文档:
https://docs.python.org/3/library/logging.html#logrecord-attributes

  • filters

过滤器,可以对日志内容进行过滤,通过自定义过滤器,还可以向日志中加入我们想要的字段

class LogFilter(logging.Filter):
"""自定义日志过滤器"""
def filter(self, record: logging.LogRecord) -> int:
record.xxx = xxx
return True
  • handlers

处理器,这里主要定义了日志的输出,可以输出到终端、文件,以及发送到第三方日志处理应用

  • loggers

日志器,通过指定不同的handler,可以根据需要让不同类型的日志输出到不同位置、不同文件等,做到业务或者代码层面的日志区分

2.Django日志发送到ELK

ELK可以作为一个日志存储、分析、查询的工具,我们可以将日志发送到Logstash,然后通过Kibana展示

  • python-logstash包

要将Django日志发送到Logstash,可以使用python-logstash这个包
[https://github.com/vklochan/python-logstash](https://github.com/vklochan/python-logstash)
使用方法十分简单,pip安装完后,在LOGGING配置中加入一个handlers配置:

'logstash': {
'level': 'INFO',
'class': 'logstash.handler_tcp.TCPLogstashHandler',
'host': '172.18.100.93',
'port': 5000,
'version': 1,
'message_type': 'logstash',
'fqdn': False,
'tags': ['tag_name'],
}

然后在loggers配置中加入这个handler即可

  • ELK部署及配置

ELK可以通过Docker来部署: https://github.com/deviantony/docker-elk
部署完成后,还需要配置logstash,在部署根目录下的logstash/config文件夹下新建logstash.conf,配置logstash的输入、输出

input {
beats {
port => 5044
}

tcp {
port => 5000
codec => plain{
charset => "UTF-8"
}
}


}

## Add your filters / logstash plugins configuration here

output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "changeme"
}
}

  • 告警

为了实现错误日志告警,可以安装插件elastalert2,同样可以使用Docker来安装
https://github.com/jertel/elastalert2
elastalert2的告警规则可以在Rules目录下新建yaml文件来定义,一个通过webhook发送告警的示例如下:

# From examples/rules/example_frequency.yaml
es_host: elasticsearch
es_port: 9200
name: Example rule
type: any
index: .ds-logs-generic-default-2022.07.21-000001
num_events: 1
timeframe:
minutes: 10
filter:
#逻辑组合
- bool:
#必须存在
must:
- match:
message: "ERROR"

# 邮件告警
#smtp_host: smtp.qq.com
#smtp_port: 465
#smtp_ssl: true

# SMTP auth
#smtp_auth_file: /opt/elastalert/data/smtp_auth_file.yaml
#email_reply_to: 464521059@qq.com
#from_addr: 464521059@qq.com
#alert:
#- "email"
#email:
#- "464521059@qq.com"

# 通过HTTP POST请求发送告警
alert: post
http_post_url: "http://172.18.100.117:8001/api/cloudhub_robot"
http_post_payload:
content: message
http_post_static_payload:
content: message
http_post_headers:
authorization: Basic xxx

3.Django日志发送到sentry

Sentry也是一个错误监控工具,它为多种语言及框架提供了SDK,可以在程序运行时自动收集错误堆栈及上下文,发送到sentry server,然后通过sentry web来查看。
Sentry可以通过Docker安装,参考[https://www.cnblogs.com/xiaochina/p/12586360.html](https://www.cnblogs.com/xiaochina/p/12586360.html)

  • Django配置

①安装完Sentry,创建一个项目之后,找到它的dsn
微信截图_20220818172332.png
②安装sentry的python SDK
pip install raven
③在settings中加入:

INSTALLED_APPS = (
'raven.contrib.django.raven_compat',
)

RAVEN_CONFIG = {
'dsn': 'http://afe50b021a4049558de19d18d40388d4:866b9b6eeb8d423f890f1a42060d2e76@sentry.vxiaocheng.com/5'
}

④在LOGGING配置中添加sentry handler

'sentry': {
'filters': ['my_filter'],
'level': 'INFO',
'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
'tags': {'project': 'rdip'},
},
  • Sentry告警

打开Sentry web之后,在项目设置–>警报中可以设置日志告警规则以及告警发送渠道
微信截图_20220818181317.png

4.uUWSGI日志格式

uWSGI的日志格式也可以自定义,通过在配置文件uwsgi.ini中添加logformat选项即可,例如:

logformat = [%(ltime)] [%(addr)] [%(method):%(uri) %(status)] [pid:%(pid) wid:%(wid)] => response %(rsize)bytes in %(msecs)ms

可用的变量见官方文档:[https://uwsgi-docs.readthedocs.io/en/latest/LogFormat.html](https://uwsgi-docs.readthedocs.io/en/latest/LogFormat.html)



Python Django

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!