Logging

Logging #

Server yang tidak bisa diinvestigasi saat terjadi masalah adalah server yang tidak bisa dikelola. Log adalah sumber informasi paling mendasar untuk memahami apa yang terjadi di sistem — tapi log yang tersebar di puluhan server tanpa agregasi terpusat hampir sama tidak bergunanya dengan tidak ada log sama sekali. Mengotomasi setup infrastruktur logging dengan Ansible memastikan setiap server mengirimkan log ke tempat yang tepat dengan format yang konsisten, sejak pertama kali server dibuat.

Setup Filebeat sebagai Log Shipper #

Filebeat adalah agen ringan yang membaca file log dan mengirimkannya ke backend seperti Elasticsearch atau Logstash:

# roles/filebeat/tasks/main.yml
---
- name: Tambahkan Elastic GPG key
  apt_key:
    url: https://artifacts.elastic.co/GPG-KEY-elasticsearch
    state: present

- name: Tambahkan repository Elastic
  apt_repository:
    repo: "deb https://artifacts.elastic.co/packages/8.x/apt stable main"
    state: present

- name: Install Filebeat
  apt:
    name: "filebeat={{ filebeat_version }}"
    state: present
    update_cache: true

- name: Deploy konfigurasi Filebeat
  template:
    src: filebeat.yml.j2
    dest: /etc/filebeat/filebeat.yml
    owner: root
    group: root
    mode: '0644'
  notify: Restart Filebeat

- name: Aktifkan dan jalankan Filebeat
  systemd:
    name: filebeat
    state: started
    enabled: true
{# roles/filebeat/templates/filebeat.yml.j2 #}
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/*.log
      - /var/log/syslog
    fields:
      host: {{ inventory_hostname }}
      environment: {{ env }}
    fields_under_root: true

  - type: log
    enabled: true
    paths:
      - /var/log/app/*.log
    fields:
      service: {{ app_name }}
      host: {{ inventory_hostname }}
      environment: {{ env }}
    fields_under_root: true
    json.keys_under_root: true   # Parse JSON log secara otomatis

processors:
  - add_host_metadata:
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~

output.elasticsearch:
  hosts: {{ elasticsearch_hosts | to_json }}
  index: "logs-{{ '{{' }} fields.service {{ '}}' }}-%{+yyyy.MM.dd}"
  username: "{{ elasticsearch_username }}"
  password: "{{ vault_elasticsearch_password }}"
  ssl.certificate_authorities: ["/etc/filebeat/ca.crt"]

Manajemen Log Rotation #

Log yang tidak di-rotate akan memenuhi disk. Setup logrotate untuk semua log penting:

# roles/logrotate/tasks/main.yml
---
- name: Deploy konfigurasi logrotate untuk aplikasi
  template:
    src: app-logrotate.j2
    dest: "/etc/logrotate.d/{{ app_name }}"
    owner: root
    group: root
    mode: '0644'
{# roles/logrotate/templates/app-logrotate.j2 #}
{{ app_log_dir }}/*.log {
    daily
    rotate {{ log_rotate_days | default(14) }}
    compress
    delaycompress
    missingok
    notifempty
    sharedscripts
    postrotate
        systemctl reload {{ app_name }} > /dev/null 2>&1 || true
    endscript
}

Setup Loki sebagai Backend Logging Ringan #

Untuk tim yang tidak ingin mengelola Elasticsearch, Grafana Loki adalah alternatif yang jauh lebih ringan:

# roles/loki/tasks/main.yml
---
- name: Buat user loki
  user:
    name: loki
    system: true
    shell: /usr/sbin/nologin
    home: /opt/loki
    create_home: true

- name: Download Loki binary
  get_url:
    url: "https://github.com/grafana/loki/releases/download/v{{ loki_version }}/loki-linux-amd64.zip"
    dest: /tmp/loki.zip
    mode: '0644'

- name: Extract Loki
  unarchive:
    src: /tmp/loki.zip
    dest: /usr/local/bin/
    remote_src: true
    creates: /usr/local/bin/loki-linux-amd64

- name: Deploy konfigurasi Loki
  template:
    src: loki-config.yml.j2
    dest: /etc/loki/config.yml
    owner: loki
    mode: '0640'
  notify: Restart Loki

- name: Deploy systemd unit file Loki
  template:
    src: loki.service.j2
    dest: /etc/systemd/system/loki.service
  notify:
    - Reload systemd
    - Restart Loki

Promtail: Log Shipper untuk Loki #

Promtail adalah agen yang mengirimkan log ke Loki — lebih ringan dari Filebeat untuk use case yang tidak butuh fitur Elastic:

# roles/promtail/tasks/main.yml
---
- name: Download dan install Promtail
  get_url:
    url: "https://github.com/grafana/loki/releases/download/v{{ promtail_version }}/promtail-linux-amd64.zip"
    dest: /tmp/promtail.zip

- name: Deploy konfigurasi Promtail
  template:
    src: promtail-config.yml.j2
    dest: /etc/promtail/config.yml
  notify: Restart Promtail
{# templates/promtail-config.yml.j2 #}
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://{{ loki_host }}:3100/loki/api/v1/push

scrape_configs:
  - job_name: system
    static_configs:
      - targets:
          - localhost
        labels:
          job: varlogs
          host: {{ inventory_hostname }}
          env: {{ env }}
          __path__: /var/log/*log

  - job_name: {{ app_name }}
    static_configs:
      - targets:
          - localhost
        labels:
          job: {{ app_name }}
          host: {{ inventory_hostname }}
          env: {{ env }}
          __path__: {{ app_log_dir }}/*.log
    pipeline_stages:
      - json:
          expressions:
            level: level
            message: message
      - labels:
          level:

Ringkasan #

  • Filebeat untuk ekosistem Elastic (Elasticsearch/Logstash); Promtail untuk ekosistem Grafana (Loki) — pilih berdasarkan stack monitoring yang sudah ada.
  • Selalu tambahkan fields di konfigurasi log shipper: host, environment, service — memudahkan filtering dan search di backend.
  • logrotate wajib di-setup untuk semua log aplikasi — log tanpa rotation akan menghabiskan disk dalam hitungan minggu di server produksi.
  • Untuk log dalam format JSON, aktifkan json.keys_under_root: true (Filebeat) atau pipeline stages JSON (Promtail) agar field log bisa di-search secara individual.
  • Gunakan Ansible Vault untuk menyimpan credential Elasticsearch — password tidak boleh plaintext di file konfigurasi Filebeat.
  • Pin versi Filebeat/Promtail di defaults/main.yml — pastikan versi yang sama di semua server untuk menghindari inkonsistensi format log.

← Sebelumnya: Testing   Berikutnya: Monitoring →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact