לאחר תקרית דליפת מידע, לא הצלחנו לשחזר את ציר הזמן המלא — יומנים מחמישה שרתים היו מפוזרים בין auth.log, messages ו-journald. שחזור הכרונולוגיה לקח יומיים במקום כמה שעות, והניתוח הראה שעד 30% מההודעות הקריטיות אבדו עקב היעדר אחסון מרכזי. אז החלטנו לפרוס את syslog-ng — מיקום יחיד ומאובטח לכל היומנים. כיום, ה-MTTR לתקריות הקשורות ליומנים ירד מ-4 שעות ל-30 דקות. הזמן שנחסך בחיפוש יומנים לאחר הפריסה הוא עד 40%.
אנחנו משתמשים ב-syslog-ng בסביבת ייצור כבר למעלה מ-7 שנים. הכלי מבין את syslog RFC3164 ו-RFC5424, journald, קבצים ו-HTTP, וה-DSL שלו לטרנספורמציית הודעות גמיש יותר מזה של rsyslog. תיעוד רשמי מאשר את הבשלות של הפרויקט ואת התמיכה הקהילתית הפעילה. במהלך תקופה זו סיפקנו יותר מ-50 פרויקטים של איסוף יומנים מרכזי — מסטארטאפים ועד סביבות ארגוניות עם 500+ שרתים.
ארכיטקטורה בסיסית: לקוח → שרת
הלקוח (כל שרת בתשתית) שולח יומנים לשרת syslog-ng המרכזי דרך TLS. השרת מנתח לפי מקור, כותב לקבצים או מעביר ל-Elasticsearch.
תצורת לקוח:
# /etc/syslog-ng/conf.d/client.conf
source s_local {
system();
internal();
};
destination d_central {
syslog(
"syslog.example.com"
port(6514)
transport("tls")
tls(
ca-file("/etc/syslog-ng/ca.pem")
cert-file("/etc/syslog-ng/client.pem")
key-file("/etc/syslog-ng/client.key")
)
flags(no-multi-line)
);
};
log {
source(s_local);
destination(d_central);
};
תצורת שרת:
# /etc/syslog-ng/syslog-ng.conf
@version: 4.5
@include "scl.conf"
options {
time-reap(30);
mark-freq(0);
keep-hostname(yes);
create-dirs(yes);
dir-perm(0755);
perm(0640);
};
source s_network_tls {
syslog(
ip(0.0.0.0)
port(6514)
transport("tls")
tls(
key-file("/etc/syslog-ng/server.key")
cert-file("/etc/syslog-ng/server.pem")
ca-file("/etc/syslog-ng/ca.pem")
peer-verify(required-trusted)
)
);
};
template t_json {
template(
"$(format-json --scope rfc5424 --scope nv-pairs --exclude DATE --key ISODATE @timestamp=${ISODATE})\n"
);
};
destination d_elasticsearch {
elasticsearch-http(
url("http://elasticsearch:9200/_bulk")
index("syslog-${YEAR}.${MONTH}.${DAY}")
type("")
template(t_json)
flush-lines(100)
flush-timeout(10000)
);
};
destination d_files {
file(
"/var/log/syslog-ng/${HOST}/${PROGRAM}.log"
template(t_json)
create-dirs(yes)
);
};
filter f_error {
level(err..emerg);
};
log {
source(s_network_tls);
destination(d_files);
destination(d_elasticsearch);
flags(flow-control);
};
# /etc/syslog-ng/conf.d/client.conf source s_local { system(); internal(); }; destination d_central { syslog( "syslog.example.com" port(6514) transport("tls") tls( ca-file("/etc/syslog-ng/ca.pem") cert-file("/etc/syslog-ng/client.pem") key-file("/etc/syslog-ng/client.key") ) flags(no-multi-line) ); }; log { source(s_local); destination(d_central); }; — כאשר החוצץ עולה על גדותיו, syslog-ng חוסם במקום להפיל הודעות. חיוני לזרמים קריטיים לביקורת.
טרנספורמציה וסינון
syslog-ng יכול לנתח יומנים מובנים דרך # /etc/syslog-ng/syslog-ng.conf @version: 4.5 @include "scl.conf" options { time-reap(30); mark-freq(0); keep-hostname(yes); create-dirs(yes); dir-perm(0755); perm(0640); }; source s_network_tls { syslog( ip(0.0.0.0) port(6514) transport("tls") tls( key-file("/etc/syslog-ng/server.key") cert-file("/etc/syslog-ng/server.pem") ca-file("/etc/syslog-ng/ca.pem") peer-verify(required-trusted) ) ); }; template t_json { template( "$(format-json --scope rfc5424 --scope nv-pairs --exclude DATE --key ISODATE @timestamp=${ISODATE})\n" ); }; destination d_elasticsearch { elasticsearch-http( url("http://elasticsearch:9200/_bulk") index("syslog-${YEAR}.${MONTH}.${DAY}") type("") template(t_json) flush-lines(100) flush-timeout(10000) ); }; destination d_files { file( "/var/log/syslog-ng/${HOST}/${PROGRAM}.log" template(t_json) create-dirs(yes) ); }; filter f_error { level(err..emerg); }; log { source(s_network_tls); destination(d_files); destination(d_elasticsearch); flags(flow-control); }; ו-flags(flow-control):
parser p_json {
json-parser(prefix(".json."));
};
filter f_app {
program("myapp");
};
rewrite r_add_env {
set("production" value(".json.environment"));
};
log {
source(s_network_tls);
filter(f_app);
parser(p_json);
rewrite(r_add_env);
destination(d_elasticsearch);
}; למה לבחור ב-syslog-ng על פני rsyslog?
הבחירה בין syslog-ng ל-rsyslog תלויה בצרכים שלך. syslog-ng מנצח כשצריך טרנספורמציה מורכבת של יומנים ואבטחה; rsyslog עדיף לניתוב פשוט עם ביצועים מקסימליים. להלן השוואה של מאפיינים מרכזיים.
| קריטריון | syslog-ng | rsyslog |
|---|---|---|
| תחביר | דמוי Python (קל יותר ל-DevOps) | דקדוק מותאם אישית (עקומת למידה תלולה יותר) |
| מפענחים מובנים | JSON, KV, CSV, syslog | חלקי (דרך מודולים) |
| תפוקה (EPS) | עד 50k לכל מופע | עד 250k (אך עם פחות גמישות) |
| תמיכה ב-TLS | מובנית (אישור הדדי) | דרך מודול imtcp |
| פלט Elasticsearch | טבעי (מנהל התקן http) | דרך omelasticsearch (תצורה נוספת) |
למקרה אמיתי: בפרויקט עם 200 שרתים עם דרישות PCI DSS, בחרנו ב-syslog-ng — היינו צריכים סינון גמיש ומשלוח מובטח. rsyslog לא הצליח להתמודד עם הטרנספורמציה של יומנים לא סטנדרטיים.
| מדד | ערך syslog-ng |
|---|---|
| תפוקה מקסימלית | 50,000 EPS לכל מופע |
| זמן פריסה (20 שרתים) | 1-2 ימים |
| הבטחת משלוח (עם בקרת זרימה) | 99.9% |
| פרוטוקולים נתמכים | syslog, journald, HTTP, Kafka |
כיצד syslog-ng פותר את בעיית אובדן היומנים
בעיה: עומס יתר בערוץ או כשל בקבלת השרת מובילים לנפילת הודעות. syslog-ng מטפל בכך עם שני מנגנונים:
- בקרת זרימה: חוסם את הלקוח כאשר החוצץ מלא.
-
חוצץ דיסק: אלגוריתם
json-parserשומר יומנים לדיסק אם הזיכרון נגמר. הגדר עםkv-parserו-parser p_json { json-parser(prefix(".json.")); }; filter f_app { program("myapp"); }; rewrite r_add_env { set("production" value(".json.environment")); }; log { source(s_network_tls); filter(f_app); parser(p_json); rewrite(r_add_env); destination(d_elasticsearch); };.
למערכות קריטיות, אנחנו תמיד מפעילים את שניהם. הבטחת משלוח — 99.9% עם תצורה נכונה.
תהליך היישום: מה כלול
- ניתוח תוכנית איסוף היומנים הנוכחית (מקורות, פרוטוקולים, מדיניות רוטציה).
- עיצוב ארכיטקטורה: בחירת תוכנית TLS, הגדרת אשכול שרתים.
- הגדרת לקוחות (playbook של Ansible לפריסה המונית).
- תצורת שרת: מפענחים, מסננים, יעדים.
- בדיקת כשלים: נתק את החשמל — ודא שאין אובדן יומנים במהלך הפסקת רשת.
- תיעוד runbook וסקריפטים לניטור (מדדי Prometheus דרך exporter).
- הדרכת צוות: כיצד להוסיף מקורות חדשים ולשנות תצורות.
ציר זמן: 3 עד 7 ימים בהתאם למספר השרתים (מ-5 עד 100). העלות מחושבת באופן אישי — צור קשר, נעריך את הפרויקט שלך תוך יום עסקים אחד.
טעויות נפוצות בהגדרת syslog-ng
- שימוש ב-
disk-bufferללאbuf-size— כל לקוח עם אישור חתום על ידי ה-CA שלך יכול לשלוח יומנים. סיכון אבטחה. - התעלמות מ-
dirביומנים — אינדקס אובד בעת הפעלה מחדש של השרת. tls()אגרסיבי מדי ביעד Elasticsearch — גורם לבקשות HTTP תכופות ולהפחתת תפוקה. ערך אופטימלי: 10-50.
הניסיון שלנו: במשך שנים של עבודה עם syslog-ng, הקמנו איסוף מרכזי לפרויקטים מסטארטאפים ועד ארגונים עם 500+ שרתים. אנו מבטיחים תמיכה לאחר פריסה — SLA קבוע בחוזה.
הזמן יישום syslog-ng במפתח: נגדיר את השרת, נפרוס לקוחות על כל השרתים ונשלב עם Elasticsearch. קבל ביקורת יומנים מלאה עם עמידה בדרישות אבטחה. צור קשר לייעוץ — נעריך את הפרויקט שלך תוך יום עסקים אחד.







