技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
configure-log-aggregation【数据与研究】Set up centralized log aggregation with Loki and Promtail (or ELK stack), including log parsing, label extraction, retention policies, and integration with metrics for correlation. Use when consolidating logs from multiple services into a searchable system, replacing local log files with centralized queryable storage, correlating logs with metrics an…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
以 Loki/Promtail 或 ELK 實行集中式日誌收集、解析、查詢以得運作可見性。
見 Extended Examples 取完整配置檔與模板。
據需求於 Loki(Prometheus 式)與 ELK(Elasticsearch 式)之間擇。
Loki 之利:
ELK 之利:
本指南專注於 Loki + Promtail(多數現代設之推薦)。
抉擇標準:
Use Loki if:
- You want label-based queries similar to Prometheus
- Storage costs are a concern (Loki indexes only labels)
- You already use Grafana for metrics
- Kubernetes/container-native deployment
Use ELK if:
- You need full-text search across all log content
- You have complex log parsing and enrichment requirements
- You require advanced analytics and aggregations
- Legacy systems with existing Logstash pipelines
預期: 據需求作明擇,團隊下載適合之裝產物。
失敗時:
裝並配 Loki 含合適貯後端。
Docker Compose 部署(docker-compose.yml):
version: '3.8'
services:
loki:
image: grafana/loki:2.9.0
ports:
- "3100:3100"
volumes:
- ./loki-config.yml:/etc/loki/local-config.yaml
- loki-data:/loki
command: -config.file=/etc/loki/local-config.yaml
restart: unless-stopped
promtail:
image: grafana/promtail:2.9.0
volumes:
- ./promtail-config.yml:/etc/promtail/config.yml
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
command: -config.file=/etc/promtail/config.yml
restart: unless-stopped
depends_on:
- loki
volumes:
loki-data:
Loki 配置(loki-config.yml):
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
# ... (see EXAMPLES.md for complete configuration)
生產含 S3 貯:
storage_config:
aws:
s3: s3://us-east-1/my-loki-bucket
s3forcepathstyle: true
boltdb_shipper:
active_index_directory: /loki/index
cache_location: /loki/cache
shared_store: s3
預期: Loki 成功啟,http://localhost:3100/ready 健康檢查通過,日誌依保留策貯。
失敗時:
docker logs lokidocker run grafana/loki:2.9.0 -config.file=/etc/loki/local-config.yaml -verify-config設 Promtail 以爬日誌並轉至 Loki 含標籤抽取。
Promtail 配置(promtail-config.yml):
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
# ... (see EXAMPLES.md for complete configuration)
Promtail 關鍵概念:
預期: Promtail 爬已配日誌檔,標正確施,日誌經 LogQL 查詢見於 Loki。
失敗時:
docker logs promtaildocker exec promtail ls /var/logcurl http://localhost:9080/metrics | grep promtailcat /tmp/positions.yaml學 LogQL 語法以篩與聚合日誌。
基本查詢:
# All logs from a job
{job="app"}
# Logs with specific label values
{job="app", level="error"}
# Regex filter on log line content
{job="app"} |~ "authentication failed"
# Case-insensitive regex
{job="app"} |~ "(?i)error"
# Line filter (doesn't parse, just includes/excludes)
{job="app"} |= "user" # Contains "user"
{job="app"} != "debug" # Doesn't contain "debug"
解析與篩:
# JSON parsing
{job="app"} | json | level="error"
# Regex parsing with named groups
{job="app"} | regexp "user_id=(?P<user_id>\\d+)" | user_id="12345"
# Logfmt parsing (key=value format)
{job="app"} | logfmt | level="error", service="auth"
# Pattern parsing
{job="nginx"} | pattern `<ip> - <user> [<timestamp>] "<method> <path> <protocol>" <status> <size>` | status >= 500
聚合(自日誌生指標):
# Count log lines per level
sum by (level) (count_over_time({job="app"}[5m]))
# Rate of error logs
rate({job="app", level="error"}[5m])
# Bytes processed per service
sum by (service) (bytes_over_time({job="app"}[1h]))
# Average request duration from logs
avg_over_time({job="app"} | json | unwrap duration [5m])
# Top 10 error messages
topk(10, sum by (message) (count_over_time({level="error"} [1h])))
以抽取欄位篩:
# Find specific trace in logs
{job="app"} | json | trace_id="abc123def456"
# HTTP 5xx errors from nginx
{job="nginx"} | pattern `<_> "<_> <_> <_>" <status> <_>` | status >= 500
# Failed authentication attempts
{job="app"} | json | message=~"authentication failed" | user_id != ""
以此模式建 Grafana 探索查詢或儀表板面板。
預期: 查詢返預期日誌行,篩正確運,聚合自日誌生指標。
失敗時:
curl http://localhost:3100/loki/api/v1/labelscurl http://localhost:3100/loki/api/v1/label/{label_name}/values以關聯日誌與 Prometheus 指標與分布追蹤得統一可觀測性。
加追蹤 ID 於日誌(應用埋點):
# Python with OpenTelemetry
import logging
from opentelemetry import trace
logger = logging.getLogger(__name__)
def handle_request():
span = trace.get_current_span()
trace_id = span.get_span_context().trace_id
logger.info(
"Processing request",
extra={"trace_id": format(trace_id, "032x")}
)
// Go with OpenTelemetry
import (
"go.opentelemetry.io/otel/trace"
"go.uber.org/zap"
)
func handleRequest(ctx context.Context) {
span := trace.SpanFromContext(ctx)
traceID := span.SpanContext().TraceID().String()
logger.Info("Processing request",
zap.String("trace_id", traceID),
)
}
配 Grafana 數據連結自指標至日誌:
Prometheus 面板欄位配置中:
{
"fieldConfig": {
"defaults": {
"links": [
{
"title": "View Logs",
"url": "/explore?left={\"datasource\":\"Loki\",\"queries\":[{\"refId\":\"A\",\"expr\":\"{job=\\\"app\\\",instance=\\\"${__field.labels.instance}\\\"} |= `${__field.labels.trace_id}`\"}],\"range\":{\"from\":\"${__from}\",\"to\":\"${__to}\"}}",
"targetBlank": false
}
]
}
}
}
配 Grafana 數據連結自日誌至追蹤:
Loki 數據源配置中:
datasources:
- name: Loki
type: loki
url: http://loki:3100
jsonData:
derivedFields:
- datasourceName: Tempo
matcherRegex: "trace_id=(\\w+)"
name: TraceID
url: "${__value.raw}"
於 Grafana Explore 關聯日誌:
預期: 點指標開相關日誌,日誌中追蹤 ID 連追蹤檢視器,指標/日誌/追蹤於單一視窗導航。
失敗時:
配保留策與壓縮以管貯成本。
按流保留(Loki 配置中):
limits_config:
retention_period: 720h # Global default: 30 days
# Per-tenant retention (requires multi-tenancy enabled)
per_tenant_override_config: /etc/loki/overrides.yaml
# overrides.yaml
overrides:
production:
retention_period: 2160h # 90 days for production
staging:
retention_period: 360h # 15 days for staging
development:
retention_period: 168h # 7 days for dev
按流標籤保留(需 compactor):
compactor:
working_directory: /loki/compactor
shared_store: filesystem
compaction_interval: 10m
retention_enabled: true
retention_delete_delay: 2h
# ... (see EXAMPLES.md for complete configuration)
優先決定多匹配時施何規則(低數=高優先)。
壓縮設:
chunk_store_config:
chunk_cache_config:
enable_fifocache: true
fifocache:
max_size_bytes: 1GB
ttl: 24h
# ... (see EXAMPLES.md for complete configuration)
監保留:
# Check chunk stats
curl http://localhost:3100/loki/api/v1/status/chunks | jq
# Check compactor metrics
curl http://localhost:3100/metrics | grep loki_compactor
# Verify deleted chunks
curl http://localhost:3100/metrics | grep loki_boltdb_shipper_retention_deleted
預期: 舊日誌依保留策自刪,貯用穩,壓縮減索引大小。
失敗時:
docker logs loki | grep compactordu -sh /loki/curl http://localhost:3100/readyretention_enabled: true 且 retention_deletes_enabled: trueingestion_rate_mb 與 ingestion_burst_size_mbcorrelate-observability-signals - 以追蹤 ID 跨指標、日誌、追蹤之統一調試build-grafana-dashboards - 視覺化日誌衍生指標並於儀表板建日誌面板setup-prometheus-monitoring - 指標供事件中何時查日誌之脈絡instrument-distributed-tracing - 加追蹤 ID 於日誌以關聯分布追蹤