# 日志与监控（ELK / Prometheus 示例）

URL: https://caijiao.org/docker/troubleshooting/logging-monitoring
Source: docs/docker/troubleshooting/logging-monitoring.md
Description: 本章节介绍 Docker 容器日志收集与监控方法，包括使用 ELK 堆栈收集日志、Prometheus 监控容器性能指标，并结合 Grafana 可视化，实现容器化应用全方位监控。

在生产环境中，对 Docker 容器的日志和运行指标进行实时监控，能够帮助快速排查问题和优化性能。

## 1. 使用 ELK 堆栈收集日志

- **ELK 组成**：
  - **Elasticsearch**：存储和搜索日志
  - **Logstash**：收集、处理和转发日志
  - **Kibana**：可视化日志数据

- **Docker Compose 示例**：

```yaml
version: "3.9"
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"

  logstash:
    image: docker.elastic.co/logstash/logstash:8.11.0
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    ports:
      - "5000:5000"

  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    ports:
      - "5601:5601"
````

- **应用容器日志收集**：

```yaml
services:
  app:
    image: myapp
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
```

- **Logstash 配置** (`logstash.conf`)：

```txt
input {
  tcp { port => 5000 }
}
output {
  elasticsearch { hosts => ["elasticsearch:9200"] }
}
```

## 2. 使用 Prometheus 监控容器

- **Prometheus**：收集容器指标（CPU、内存、网络等）
- **Docker Compose 示例**：

```yaml
services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
```

- **Prometheus 配置** (`prometheus.yml`)：

```yaml
scrape_configs:
  - job_name: 'docker'
    static_configs:
      - targets: ['app:9100']
```

- **Node Exporter**：在容器中暴露指标

```yaml
  node-exporter:
    image: prom/node-exporter:latest
    ports:
      - "9100:9100"
```

- **Grafana 可视化**：

  - 将 Prometheus 数据源添加到 Grafana
  - 创建仪表盘监控 CPU、内存、磁盘和网络指标

## 3. 最佳实践

- 日志集中管理，避免容器内部日志丢失
- 配置日志轮转和存储限制，避免磁盘占满
- 使用 Prometheus + Grafana 实现实时监控
- 结合告警机制（Alertmanager）快速响应异常
- 对关键服务设置单独监控指标

---

通过 ELK 堆栈收集日志和 Prometheus 监控指标，开发者可以实现 Docker 容器化应用的全面监控，及时发现问题并优化系统性能。
