django log を elasticsearch に入れる python-logstash 使い方

これも英語の文献があまりなかったので書いてみた
本家も記述が不親切だった

# 本家 python-logstash
https://pypi.org/project/python-logstash/



# django を用意する

```ruby
mkdir django-logstash
cd django-logstash/
python -m venv venv
. venv/bin/activate
python -m pip install Django
django-admin startproject mysite
cd mysite
python manage.py runserver
ctrl + c
pip install python-logstash
vim mysite/settings.py
python manage.py runserver
```

settings.pyがハマりポイントです。ネットの拾い物、なかなか動かなかった。
django.request だと飛んでこず、django.serverでやっときた。

message_type: django も大事ぽい

**1行目の version:1 が必須です。**

```py:mysite/settings.py
LOGGING = {
  'version': 1,
  'handlers': {
      'logstash': {
          'level': 'DEBUG',
          'class': 'logstash.TCPLogstashHandler',
          'host': 'xx.xx.xx.xx',
          'port': 9600, # Default value: 5959
          'version': 1, # Version of logstash event schema. Default value: 0 (for backward compatibility of the library)
          'message_type': 'django',  # 'type' field in logstash message. Default value: 'logstash'.
          'fqdn': False, # Fully qualified domain name. Default value: false.
          'tags': ['django.request'],# list of tags. Default: None.
      },
  },
  'loggers': {
      'django.server': {
          'handlers': ['logstash'],
          'level': 'DEBUG',
      },
  },
}
```


Thank you: 

https://qiita.com/sakamossan/items/a98b949738028ad39a6b


ブラウザで見えればok
http://localhost:8000/


# logstashを用意する

configを先に作る

```
mkdir config 
```

```ruby:config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: https://your.elasticsearch.example.com:port
xpack.monitoring.elasticsearch.username: xx
xpack.monitoring.elasticsearch.password: xx
xpack.monitoring.enabled: true
log.level: trace
```


vim config/logstash-django.conf

```ruby:config/logstash-django.conf
input {
  tcp {
    port => 9600
    codec => json
  }
}
output {
    elasticsearch {
      hosts => ["https://your.elasticsearch.com"]
      user => ["xx"]
      password => ["xx"]
      index => "djangotest"
      document_type => "%{type}"
    }
   stdout {
      codec => rubydebug {metadata => true }
  }
}
```

起動する。1minくらいかかるから気長にね。sucessfully opened port 9600 みたいのが出ればokなはず。djangoからのrequestが無事飛んでくれば、consoleが動きます。

```yml:docker-compose.yml
version: '3'

services:
  logstash:
    restart: always
    container_name: logstash
    image: docker.elastic.co/logstash/logstash:6.8.6
    ports:
      - 9600:9600
    volumes:
      - ./config:/config
    logging:
      driver: "json-file"
      options:
        max-size: "3M"
        max-file: "1"

    command: logstash -r -f /config/*.conf
```    

docker image manual
https://www.elastic.co/guide/en/logstash/6.3/docker-config.html



# elasticsearch / kibana は適当に用意してください。

これとか参考になるかも
  https://qiita.com/uturned0/items/584686262be1aa8a336c



# 実行

django に適当にアクセスしてみる
http://localhost:8000/
http://localhost:8000/unknwon-path








esにデータが入ればok. ↓はkibanaでデータを見た図。

unknown-pathへのアクセスが status 404 で入ってます。





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/4dc51b12-6f06-4bd3-53cd-ff3e331305bf.png)


# django その他のログ

ここにいろいろありそう。（試してない）

https://docs.djangoproject.com/en/3.1/topics/logging/