Loki(Minio存储) + Promtail + Grafana

一、Docker部署

1、准备三个文件依次为loki配置文件loki-config.yaml,promtail配置文件promtail-config.yaml,docker-compose.yaml

# vim loki-config.yaml
auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096
  log_level: debug
  grpc_server_max_concurrent_streams: 1000

common:
  instance_addr: 127.0.0.1
  path_prefix: /tmp/loki
    #storage:
    # filesystem:
    #  chunks_directory: /tmp/loki/chunks
    #  rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    kvstore:
      store: inmemory

query_range:
  results_cache:
    cache:
      embedded_cache:
        enabled: true
        max_size_mb: 100

limits_config:
  metric_aggregation_enabled: true

schema_config:
  configs:
    - from: 2020-10-24
      store: tsdb
      object_store: s3 #对象存储配置
      schema: v13
      index:
        prefix: index_
        period: 24h

storage_config:
  tsdb_shipper:
    active_index_directory: /loki/index
    cache_location: /loki/index_cache
    cache_ttl: 24h         # Can be increased
  # minio存储配置
  aws:
    s3: http://172.17.0.1:9000
    endpoint: 172.17.0.1:9000
    access_key_id: minioadmin
    secret_access_key: minioadmin
    bucketnames: loki-data
    insecure: true
    s3forcepathstyle: true
pattern_ingester:
  enabled: true
  metric_aggregation:
    loki_address: localhost:3100

ruler:
  alertmanager_url: http://172.17.0.1:9093

frontend:
  encoding: protobuf

# vim promtail-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push # loki通信地址

scrape_configs:
- job_name: system
  static_configs:
  - targets:
      - localhost
    labels:
      instance: oracle-vps1
      job: varlogs
      __path__: /var/log/*log
  - targets:
      - localhost
    labels:
      instance: oracle-vps1
      job: nginxlogs
      __path__: /var/log/nginx/*log
# vim docker-compose.yaml
version: "3"
networks:
  loki:
services:
  loki:
    image: grafana/loki:3.4.1
    ports:
      - "3100:3100"
    volumes:
      - ./loki-config.yaml:/etc/loki-config.yaml
    command: -config.file=/etc/loki-config.yaml
    networks:
      - loki
  promtail:
    image: grafana/promtail:3.4.1
    volumes:
      - ./promtail-config.yaml:/etc/promtail-config.yml
      - /var/log:/var/log # 挂载宿主机日志目录
      - /var/log/nginx:/var/log/nginx # 挂载宿主机nginx日志目录
    command: -config.file=/etc/promtail-config.yml
    networks:
      - loki
  grafana:
    image: grafana/grafana
    container_name: "grafana"
    ports:
      - "3010:3000"
    restart: always
    volumes:
      - "./grafana_data:/var/lib/grafana"
      - /etc/timezone:/etc/timezone
      - /etc/localtime:/etc/localtime:ro
    

二、Minio作为Loki的存储

image-20250418102552295

三、grafana(借用部署Prometheus时创建的)

此处Loki URL,如docker-compose部署,直接填写 http://loki:3100

image-20250418102318733

监控nginx服务的日志情况

根据https://grafana.com/grafana/dashboards/12559-loki-nginx-service-mesh-json-version/这个模板修改

修改nginx日志格式

log_format main escape=json '{'
        '"remote_addr":"$remote_addr",'
        '"remote_user":"$remote_user",'
        '"time_local":"$time_local",'
        '"request_method": "$request_method",'
        '"request":"$request",'
        '"request_time":"$request_time",'
        '"status":$status,'
        '"body_bytes_sent":$body_bytes_sent,'
        '"http_referer":"$http_referer",'
        '"http_user_agent":"$http_user_agent",'
        '"http_x_forwarded_for":"$http_x_forwarded_for",'
        '"upstream_addr":"$upstream_addr",'
        '"geoip2_country_code":"$geoip2_country_code"'
        '}';
 geoip2 /etc/nginx/GeoLite2-Country.mmdb { # 涉及使用到geoip2模块,需要自行重新编译nginx
        $geoip2_country_code country iso_code;
    }
// 格式化之后的nginx日志
{"remote_addr":"156.221.111.111","remote_user":"","time_local":"18/Apr/2025:10:27:57 +0800","request_method": "GET","request":"GET /minio/ui/ws/objectManager HTTP/1.1","request_time":"30.372","status":101,"body_bytes_sent":4,"http_referer":"","http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36","http_x_forwarded_for":"156.221.111.111","upstream_addr":"127.0.0.1:9001","geoip2_country_code":"SC"}

image-20250418102717317

四、利用nginx保护loki的通信接口

location /loki/ {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        auth_basic "Restricted Access";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://loki;
}
# 修改相应的promtail配置
clients:
  - url: https://xxx.xxx.xxx.xxx/loki/api/v1/push
    basic_auth:
      username: admin
      password: admin123.