1.Django日志配置
Django的日志配置主要通过settings.py
中LOGGING
配置来实现,示例如下:
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', } } }
|
格式化器,这里可以指定我们需要记录在日志中的信息以及呈现在日志中的格式,可用的属性参考python logging模块的文档:
https://docs.python.org/3/library/logging.html#logrecord-attributes
过滤器,可以对日志内容进行过滤,通过自定义过滤器,还可以向日志中加入我们想要的字段
class LogFilter(logging.Filter): """自定义日志过滤器""" def filter(self, record: logging.LogRecord) -> int: record.xxx = xxx return True
|
处理器,这里主要定义了日志的输出,可以输出到终端、文件,以及发送到第三方日志处理应用
日志器,通过指定不同的handler
,可以根据需要让不同类型的日志输出到不同位置、不同文件等,做到业务或者代码层面的日志区分
2.Django日志发送到ELK
ELK可以作为一个日志存储、分析、查询的工具,我们可以将日志发送到Logstash
,然后通过Kibana
展示
要将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可以通过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" } }
}
output { elasticsearch { hosts => "elasticsearch:9200" user => "elastic" password => "changeme" } }
|
为了实现错误日志告警,可以安装插件elastalert2
,同样可以使用Docker来安装
https://github.com/jertel/elastalert2
elastalert2
的告警规则可以在Rules
目录下新建yaml文件来定义,一个通过webhook发送告警的示例如下:
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"
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)
①安装完Sentry,创建一个项目之后,找到它的dsn
②安装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 web之后,在项目设置–>警报中可以设置日志告警规则以及告警发送渠道
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)