超出原型阶段的每个项目都需要组织日志记录。 正确的日志记录可以解决许多问题,并有助于了解项目的状态。 在最初阶段,登录到适合我的文件直到项目发展并且通过日志进行搜索并没有花费时间。
解决方案是使用日志和搜索的聚集来创建集中式日志存储库。 选择权落在ELK堆栈上。 ELK是三个开源项目的组合:ElasticSearch,Logstash和Kibana。 ELK存储日志,构建图形,并支持带有过滤器的全文本搜索。 本文介绍了设置ELK堆栈以存储Django应用程序日志的过程。
ELK安装
基于docker-elk存储库,将使用Docker安装ELK堆栈。 更改Logstash设置,添加用于匹配nginx日志的GROK模式,并更改输出部分,以便Django应用程序日志和nginx日志存储在不同的ElasticSearch索引中。 结果,logstash.conf如下所示:
input { beats { port => 5000 host => "0.0.0.0" } } filter { if [type] == "nginx" { grok { match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user_name} \[%{HTTPDATE:access_time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" } } } } output { if [type] == "nginx" { elasticsearch { hosts => "elasticsearch:9200" index => "nginx-%{+YYYY.MM.dd}" } } else if [type] == "django" { elasticsearch { hosts => "elasticsearch:9200" index => "django-%{+YYYY.MM.dd}" } } else { elasticsearch { hosts => "elasticsearch:9200" index => "unknown_messages" } } }
进行更改后,运行堆栈:
docker-compose up
启动后,堆栈将在以下端口上侦听:
- 5000:Logstash TCP输入。
- 9200:Elasticsearch HTTP
- 9300:Elasticsearch TCP传输
- 5601:基巴纳
记录架构
考虑Django应用程序的日志记录体系结构。

从图中可以看到,该应用程序由以下服务组成:nginx,django应用程序,celery worker。 每个服务都将日志发送到ELK堆栈。 考虑单独配置每个服务。
将Nginx日志写入ELK
要使用nginx日志,需要附加的Filebeat服务。 Filebeat的安装过程在官方网站上有详细描述。 在Ubuntu服务器上安装Filebeat服务的示例:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.4.0-amd64.deb sudo dpkg -i filebeat-6.4.0-amd64.deb
Filebeat将从文件中读取日志,然后发送到Logstash。 配置示例:
filebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access.log fields: type: nginx fields_under_root: true scan_frequency: 5s output.logstash: hosts: ["logstash:5000"]
我们启动Filebeat服务,并观察Kibana中日志的外观。
在ELK中编写Django日志
为了使Django与Logstash服务进行交互,请安装可选的Python-logstash软件包 。
pip install python-logstash
让我们更改Django应用程序的设置,以便将日志发送到Logstash服务。
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'simple': { 'format': 'velname)s %(message)s' }, }, 'handlers': { 'console': { 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'simple' }, 'logstash': { 'level': 'INFO', 'class': 'logstash.TCPLogstashHandler', 'host': 'logstash', 'port': 5000, 'version': 1, 'message_type': 'django', # 'type' logstash . 'fqdn': False, 'tags': ['django'], # . }, }, 'loggers': { 'django.request': { 'handlers': ['logstash'], 'level': 'INFO', 'propagate': True, }, ... } }
之后,应用程序会将日志发送到Logstash。 用法示例:
import logging logger = logging.getLogger(__name__) def test_view(request, arg1, arg): ... if is_error:
之后,自行配置Kibana以显示必要的信息。 您自己的设置的示例屏幕截图:



该系统收集服务日志,使您可以方便地进行搜索,构建图表和可视化,从而快速检测并解决问题。