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
fieldsdi konfigurasi log shipper:host,environment,service— memudahkan filtering dan search di backend.logrotatewajib 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.