マイクロサービスのログ管理とモニタリング

マイクロサービスアーキテクチャにおいて、各サービスのログ管理とモニタリングは、システムの可観測性を高めるために重要です。今回は、マイクロサービスのログ管理とモニタリングについて記述します。

### 目次

1. ログ管理の基本
2. ログ集約と解析ツールの導入
3. モニタリングツールの設定
4. 実践プロジェクトの例

### 1. ログ管理の基本

### ログの標準化

各マイクロサービスのログ形式を標準化することで、ログの解析とモニタリングを容易にします。LaravelではMonologを使用してログを管理します。

`config/logging.php`

```php
return [
    'default' => env('LOG_CHANNEL', 'stack'),

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily', 'stderr'],
        ],

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
        ],
    ],
];
```

### 2. ログ集約と解析ツールの導入

### Elasticsearch, Logstash, Kibana (ELK Stack)

ELKスタックを使用して、ログの集約と解析を行います。

### Elasticsearchの設定

Dockerを使用してElasticsearchを設定します。

```yaml
version: '3.7'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
```

### Logstashの設定

Logstashを使用してログを収集します。

```yaml
logstash:
  image: docker.elastic.co/logstash/logstash:7.10.1
  container_name: logstash
  volumes:
    - ./logstash-pipeline:/usr/share/logstash/pipeline
  ports:
    - "5000:5000"
```

`logstash-pipeline/logstash.conf`

```
input {
  beats {
    port => 5000
  }
}

output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "logs-%{+YYYY.MM.dd}"
  }
}
```

### Kibanaの設定

Kibanaを使用してログを可視化します。

```yaml
kibana:
  image: docker.elastic.co/kibana/kibana:7.10.1
  container_name: kibana
  ports:
    - "5601:5601"
  environment:
    ELASTICSEARCH_URL: http://elasticsearch:9200
```

### Filebeatの設定

Filebeatを使用してLaravelのログをLogstashに送信します。

```yaml
filebeat:
  image: docker.elastic.co/beats/filebeat:7.10.1
  container_name: filebeat
  volumes:
    - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
    - /var/log/laravel:/usr/share/filebeat/logs
```

`filebeat.yml`

```yaml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/logs/*.log

output.logstash:
  hosts: ["logstash:5000"]
```

### 3. モニタリングツールの設定

### PrometheusとGrafana

PrometheusとGrafanaを使用して、システムメトリクスを収集・可視化します。

### Prometheusの設定

Dockerを使用してPrometheusを設定します。

`prometheus.yml`

```yaml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'my-service'
    static_configs:
      - targets: ['my-service:8080']
```

Docker ComposeでPrometheusを起動します。

```yaml
version: '3.7'
services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
```

### Grafanaの設定

Grafanaを使用してPrometheusデータを可視化します。

```yaml
version: '3.7'
services:
  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=secret
    volumes:
      - grafana-storage:/var/lib/grafana
```

GrafanaでPrometheusをデータソースとして追加し、ダッシュボードを作成します。

### 4. 実践プロジェクトの例

### プロジェクト：ログ管理とモニタリング

1. ELKスタックを使用してログの集約と解析を実現
2. Filebeatを使用してLaravelのログをLogstashに送信
3. PrometheusとGrafanaを使用してシステムメトリクスを収集・可視化

### まとめ

この記事では、マイクロサービスのログ管理とモニタリングについて記述しました。ELKスタックを使用してログを集約し、PrometheusとGrafanaを使用してシステムメトリクスを可視化する方法を学びました。これらの手法を駆使して、システムの可観測性を高め、迅速なトラブルシューティングとパフォーマンスの最適化を目指します。