בחירת מעביר היומנים הנכון
סוכן העברת היומנים הוא החוליה הראשונה והקריטית ביותר בצינור רישום היומנים. כאן לרוב אובדים אירועים: Filebeat מפספס רוטציה של קובץ — אתה מאבד 2000 שורות. Promtail קורס על צומת — הוא שוכח את המיקום שלו. Fluent Bit צורך 100% מעבד בניתוח מחסניות שגיאה מרובות שורות ב-Java. בהתבסס על הנתונים שלנו, עד 5% מהיומנים אובדים עקב הגדרת סוכן שגויה. הגדרה נכונה אינה "הגדר ושכח" אלא ביקורת שוטפת והתאמה לתשתית.
עם ניסיון של 10+ שנים ב-DevOps ו-50+ פרויקטי רישום יומנים שהושלמו, אנו מספקים צינורות יומנים אמינים מאז 2016. מקרה אחד: הגדרת Fluent Bit עבור אשכול של 50 צמתים הפחיתה את צריכת המשאבים ב-40% וקיצצה את עלויות אחסון היומנים בחצי — חיסכון של 3,000 דולר בחודש. עלות הביקורת הטיפוסית שלנו נעה בין 1,500 ל-5,000 דולר בהתאם לגודל האשכול.
איזה סוכן לבחור עבור התשתית שלך?
כל שלושת הכלים עושים את אותו הדבר — קוראים יומנים ושולחים אותם למערכת אחסון. ההבדל טמון במשאבים, בביצועים ובאינטגרציות. טבלת סיכום:
| פרמטר | Filebeat | Promtail | Fluent Bit |
|---|---|---|---|
| שימוש בזיכרון | ~30 MB | ~25 MB | מ-650 KB |
| שפה | Go | Go | C |
| מערכות יעד ברירת מחדל | Elasticsearch, Logstash | Loki, Grafana | Loki, Elastic, S3, Kafka |
| ריבוי שורות | כן (regex) | כן (regex, pipeline) | כן (regex, parsers) |
| אינטגרציית Kubernetes | באמצעות add_kubernetes_metadata | טבעית (metadata מה-API) | באמצעות kubernetes filter |
| גודל קובץ בינארי | ~120 MB | ~50 MB | ~5 MB |
Filebeat הוא הבחירה עבור Elastic Stack. יש לו מודולים (nginx, mysql) עם מפענחים מובנים מראש. Promtail אופטימלי עבור Loki — הוא מעשיר אוטומטית יומנים עם metadata של פודים ומשתמש ב-30% פחות זיכרון מ-Filebeat. Fluent Bit הוא הקל ביותר, קל פי 20 מ-Filebeat בזיכרון, אידיאלי עבור קצה, IoT ו-Kubernetes מוגבל במשאבים.
הגדרת Filebeat תוך התחשבות במקרי קצה
הגדרה בסיסית היא פשוטה, אבל השטן נמצא בפרטים — במיוחד בטיפול בריבוי שורות וברוטציה:
---
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/app/*.log
multiline.type: pattern
multiline.pattern: '^\d{4}-\d{2}-\d{2}'
multiline.negate: true
multiline.match: after
multiline.max_lines: 500
multiline.timeout: 5s
fields:
app: myapp
env: production
fields_under_root: true
scan_frequency: 10s
close_inactive: 5m
ignore_older: 24h
- type: container
paths:
- /var/lib/docker/containers/*/*.log
processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/lib/docker/containers/"
processors:
- drop_fields:
fields: ["agent", "ecs", "host.os"]
ignore_missing: true
output.logstash:
hosts: ["logstash:5044"]
loadbalance: true
ttl: 30s
compression_level: 3
queue.mem:
events: 4096
flush.min_events: 512
flush.timeout: 5s
logging.level: warning
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 3
# /etc/filebeat/filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/app/*.log multiline.type: pattern multiline.pattern: '^\d{4}-\d{2}-\d{2}' multiline.negate: true multiline.match: after multiline.max_lines: 500 multiline.timeout: 5s fields: app: myapp env: production fields_under_root: true scan_frequency: 10s close_inactive: 5m ignore_older: 24h - type: container paths: - /var/lib/docker/containers/*/*.log processors: - add_kubernetes_metadata: host: ${NODE_NAME} matchers: - logs_path: logs_path: "/var/lib/docker/containers/" processors: - drop_fields: fields: ["agent", "ecs", "host.os"] ignore_missing: true output.logstash: hosts: ["logstash:5044"] loadbalance: true ttl: 30s compression_level: 3 queue.mem: events: 4096 flush.min_events: 512 flush.timeout: 5s logging.level: warning logging.to_files: true logging.files: path: /var/log/filebeat name: filebeat keepfiles: 3 הוא הגורם הנפוץ ביותר ליומנים שבורים. מחסנית שגיאה ב-Java משתרעת על עשרות שורות, וללא תבנית נכונה כל שורה עפה כאירוע נפרד. התבנית multiline פירושה: אירוע חדש מתחיל בשורה המכילה תאריך, כל השאר הוא המשך של האירוע הקודם. ^\d{4}-\d{2}-\d{2} סוגר את ה-file descriptor אם הקובץ לא עודכן במשך 5 דקות. ללא זה, Filebeat מחזיק מאות descriptors פתוחים על שרת פעיל.
מדוע הגדרת ריבוי שורות נכונה היא קריטית?
מקרה אחרון: לקוח התלונן על יומנים כפולים ב-Elasticsearch. Filebeat תפס כל שורה של מחסנית שגיאה כאירוע נפרד, וכתוצאה מכך היו פי 10 יותר יומנים מהרגיל. הפתרון היה להגדיר close_inactive: 5m עם הביטוי הנכון. לאחר מכן, גודל האינדקס ירד מ-200 GB ל-30 GB בחודש — חיסכון של 85% בשטח דיסק.
Fluent Bit ב-Kubernetes: הגדרה מוכנה לייצור
Fluent Bit מופץ כ-Helm chart ונפרס כ-DaemonSet. הגדרה באמצעות ConfigMap:
---
# values.yaml для helm chart fluent-bit
config:
inputs: |
[INPUT]
Name tail
Path /var/log/containers/*.log
multiline.parser docker, cri
Tag kube.*
Mem_Buf_Limit 64MB
Skip_Long_Lines On
Refresh_Interval 10
filters: |
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
Merge_Log On
Keep_Log Off
K8S-Logging.Parser On
K8S-Logging.Exclude On
[FILTER]
Name grep
Match kube.*
Exclude $kubernetes['labels']['skip-logging'] true
outputs: |
[OUTPUT]
Name loki
Match kube.*
Host loki.logging.svc.cluster.local
Port 3100
Labels job=fluentbit, namespace=$kubernetes['namespace_name'], pod=$kubernetes['pod_name'], app=$kubernetes['labels']['app']
Label_Keys $level,$trace_id
Batch_Size 1048576
Batch_Wait 1s
Line_Format json
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
Fluent Bit GitHub מאפשר ל-pods להשבית רישום באמצעות ה-annotation multiline.type: pattern — שימושי עבור כלי דיבוג שמייצרים כמויות עצומות של זבל.
Promtail: מיקומים ואמינות מסירה
Promtail מאחסן מיקומי קריאה ב-# values.yaml для helm chart fluent-bit config: inputs: | [INPUT] Name tail Path /var/log/containers/*.log multiline.parser docker, cri Tag kube.* Mem_Buf_Limit 64MB Skip_Long_Lines On Refresh_Interval 10 filters: | [FILTER] Name kubernetes Match kube.* Kube_URL https://kubernetes.default.svc:443 Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token Merge_Log On Keep_Log Off K8S-Logging.Parser On K8S-Logging.Exclude On [FILTER] Name grep Match kube.* Exclude $kubernetes['labels']['skip-logging'] true outputs: | [OUTPUT] Name loki Match kube.* Host loki.logging.svc.cluster.local Port 3100 Labels job=fluentbit, namespace=$kubernetes['namespace_name'], pod=$kubernetes['pod_name'], app=$kubernetes['labels']['app'] Label_Keys $level,$trace_id Batch_Size 1048576 Batch_Wait 1s Line_Format json tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule - key: node-role.kubernetes.io/control-plane operator: Exists effect: NoSchedule . אם קובץ זה אינו מתמיד (למשל, בקונטיינר ארעי), לאחר אתחול מחדש הסוכן יתחיל לקרוא מההתחלה וישכפל את כל היומנים. עבור DaemonSet, הקפד לעגן hostPath:
---
# promtail DaemonSet snippet
volumes:
- name: positions
hostPath:
path: /var/log/promtail-positions
type: DirectoryOrCreate
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
volumeMounts:
- name: positions
mountPath: /run/promtail
- name: varlog
mountPath: /var/log
readOnly: true
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
Promtail מאבד מיקומים ב-100% מהמקרים אם hostPath לא מעוגן. הבטח את בטיחות positions.yaml.
בעיות נפוצות ופתרונותיהן
| בעיה | סיבה | פתרון |
|---|---|---|
| יומנים כפולים ב-Elasticsearch | הגדרת ריבוי שורות שגויה | הגדר את תבנית תחילת האירוע, כוונן max_lines |
| אובדן אירועים בעומס גבוה | אין אגירת דיסק | הפעל storage.type filesystem ב-Fluent Bit או queue.mem עם buffer מספיק ב-Filebeat |
| Promtail קורא מההתחלה לאחר אתחול | אין אחסון מתמיד עבור positions.yaml | עגן hostPath והגדר את הנתיב בקונפיג |
| הסוכן לא יכול לגשת ליומני קונטיינרים | הרשאות לא מספקות ב-Kubernetes | הגדר securityContext.runAsUser: 0 ב-DaemonSet |
רשימת בדיקות להגדרה
- [ ] ודא שהסוכן רץ כ-root כדי לגשת ליומני קונטיינרים
- [ ] בדוק הגדרות אגירה: Fluent Bit — storage.type filesystem, Filebeat — queue.mem עם 4096 אירועים
- [ ] הגדר ניטור לסוכן: מדדי Prometheus, דשבורד לאירועים שהוחמצו
- [ ] הפעל רישום עצמי של הסוכן ברמת אזהרה
- [ ] בדוק רוטציית יומנים: ודא שאין אובדן אירועים במהלך הרוטציה
- [ ] הגדר סובלנות לתקלות: פלטים מרובים או עותקי סוכן
מה כלול בהקמת העברת יומנים
אנו מספקים מחזור שירותים מלא:
- ביקורת על צינור רישום היומנים הנוכחי: נפח, אובדנים, עיכובים.
- בחירת סוכן ועיצוב ארכיטקטורה.
- כתיבת קונפיגים ו-Helm charts.
- פריסה באמצעות Ansible או GitOps.
- אינטגרציה עם SIEM ומערכות התראה.
- תיעוד ו-runbook למפעילים.
- ניטור ואופטימיזציה לאחר הפריסה.
תהליך הקמת העברת יומנים במפתח מלא
שלבי העבודה:
- ניתוח מקורות יומנים: יומני אפליקציה, מערכת, קונטיינרים. קביעת תדירות ונפח (עד 10 TB ליום).
- עיצוב צינור: בחירת סוכן, הגדרת אגירה, יתירות (active-active).
- יישום: קונפיגים לכל השרתים, Helm charts עבור Kubernetes, אינטגרציית SIEM.
- בדיקות: מבחן עומס עם זרם של 10k אירועים/שנייה, אימות אובדנים (SLO 99.9%).
- פריסה ותיעוד: פריסת Ansible/Helm, runbook למפעילים.
לוח זמנים משוער: 2 עד 5 ימי עסקים בהתאם למורכבות התשתית. התמחור נקבע באופן אישי לאחר ביקורת.
מוכן להעריך את הפרויקט שלך? צור קשר — אנו נקים את העברת היומנים שלך עם ערובה לשלמות הנתונים. הזמן ביקורת על צינור רישום היומנים שלך היום.







