נתחיל לפי הסדר, ולכל כלי נקדיש פוסט נפרד.
מה שאני כותב רלוונטי ללינוקס. עבור win זה יהיה מאוד דומה, אבל כנראה שמיקומי הקבצים יהיו קצת שונים. הדוגמאות שלי נכתבו על גרסת 7.6.2, יתכן שבגרסאות שונות יהיה צורך בשינויים.
Filebeat
הכלי הזה נועד לקחת את המידע מהלוגים ולשלוח שורה אחרי שורה ל-Logstash. לשם כך
צריך לקנפג אותו מאיפה לקחת את הלוגים ולאן לשלוח אותם.
קובץ הקונפיגורציה נקרא filebeat.yml והוא נמצא בד"כ בספריית /etc/filebeat. הוא מגיע עם קינפוג דיפולטיבי
שהוא די טוב בשביל התחלה אבל בכל זאת יש צורך בכמה שינויים קטנים כל אחד בשביל
המערכת שלו.
נקנפג את הדברים הבאים:
מיקום קבצי הלוג – בחלק ה-filebeat.inputs בשדה שנקרא paths נכניס את ה-path שבו יהיו קבצי הלוג למשל:
- /my_logs/*.log
לא לשכוח את המקף שבתחילת השורה. הכוכבית, כמקובל, מסמלת כל טקסט שהוא. זה
אומר ש-filebeat ישתמש בכל
קובץ שמסתיים ב “.log”. אם למשל אנחנו רוצים להשתמש בקבצים שמסתיימים
ב-“.txt” נשנה את
השדה paths ל:
- /my_logs/*.txt
ואם אנחנו רוצים רק קבצים שבשם שלהם יש “abc” ומסתיימים בסימות “.log” אז נכתוב:
- /my_logs/*abc*.log
לאן המידע ישלח – בחלק ה-Outputs בשדה שנקרא hosts נכניס את ה-IP וה-Port של המכונה שבה מותקן ה-logstash שאליו אנחנו
רוצים לשלוח את המידע. במקרה הפשוט שבו ה-logstash מותקן על
אותה מכונה כמו ה-filebeat נכתוב:
hosts:
["localhost:5044"]
הפורט ה-default של logstash הוא 5044.
ניתן כמובן לשנות אותו בקובץ הקונפיגורציה של logstash. אם נשנה את מספר הפורט אז גם נשנה אותו
כאן ב-filebeat. הם חייבים
להיות מתואמים כדי לתקשר.
יש עוד המון אפשרויות קינפוג ב-filebeat אבל בשביל המקרה הפשוט זה
מספיק.
הצורה שבה filebeat עובד מבטיחה
לנו שכל שורה תישלח לפחות פעם אחת ל-logstash. אני אומר לפחות כי יכול להיות
שהיא תישלח יותר מפעם אחת. אבל אפשר להיות בטוחים (הכל יחסי) שלפחות פעם אחת כל
שורה תישלח.
נסביר קצת איך filebeat מבטיח לנו את זה. ל-filebeat יש קובץ registery שבו הוא שומר
את המצב הנוכחי שלו. הוא כותב שם עבור כל קובץ עד איזו נקודה (offset) הוא כבר שלח. אם filebeat נעצר מכל
סיבה שהיא, או איבד תקשורת עם logstash, ברגע שהם חוזרים לפעולה – filebeat בודק בקובץ
ה-registry עד איזו
נקודה הוא כבר שלח וממשיך משם. עבור כל שליחה של מידע ל-logsatsh, filebeat מחכה לאישור (acknowledgement או בקיצור ack) מ-logstash שהמידע
התקבל, ורק אז מעדכן את קובץ ה-registry. כך מובטח לנו שכל שורה תישלח לפחות פעם אחת.
יכול להיות מצב שהמידע נשלח ל-logstash אבל מכל סיבה שהיא filebeat לא קיבל את
ה-ack, או שהוא
קיבל את ה-ack אבל לא
הספיק לעדכן את קובץ ה-regestry וה-filebeat נפל (למשל בגלל הפסקת חשמל), במקרה כזה כשהמערכת תחזור לפעול filebeat ישלח שוב את
אותו מידע שהוא לא הספיק לעדכן ב-registry שכבר נשלח.
קובץ ה-registry נמצא ב-/usr/share/filebeat/bin/data/registry/filebeat והוא נקרא data.json. בתוך הקובץ
הזה תמצאו עבור כל קובץ שנשלח ל-logstash שורה דומה
לזו:
{"source":"/my_logs/myproject.log","offset":9510278,"timestamp":"2020-05-10T14:35:53.304316473+03:00","ttl":-2,"type":"log","meta":null,"FileStateOS":{"inode":1161454061,"device":22}}
כפי שניתן לראות מצוין מהו שם הקובץ ומה ה-offset שעד אליו ה-filebeat סיים לשלוח.
כדי לדעת אם הוא סיים לשלוח את כל הקובץ ניתן לכתוב ב-linux את הפקודה:
ll /my_logs/myproject.log
ואז נקבל בשדה החמישי את גודל הקובץ:
-rw-r--r--.
1 300 300 9510278 …
אם ה-offset שווה לגודל הקובץ זה אומר שהוא סיים לשלוח את כל הקובץ.
אם יש צורך שה-filebeat ישלח שוב קובץ שהוא כבר שלח ניתן פשוט למחוק אותו מה-registry. ואם רוצים
שכל הקבצים ישלחו מחדש, למשל כשאנחנו רק בתחילת בניית מערכת ואנחנו עושים הרבה
ניסויים, אפשר פשוט למחוק את ה-registry כולו:
rm -rf /usr/share/filebeat/bin/data/registry
ועכשיו מה שנשאר לנו זה רק להריץ את filebeat. לצורך כך נשתמש בפקודה הבאה:
/usr/share/filebeat/bin/filebeat
-e -c /etc/filebeat/filebeat.yml -d "publish"
ואז נתחיל לראות אותו עובד. עבור כל קובץ הוא פותח מה שנקרא Harvester ותיראו שורה
כזו:
Harvester
started for file: /my_logs/myproject.log
כשהוא סיים לעבוד על הקובץ והמתין את הזמן שמוגדר לו בקובץ הקונפיגורציה (5
דקות בדיפולט) הוא ידפיס שורה כזו עבור כל קובץ.
log/harvester.go:324 File is inactive: /my_logs/myproject.log.
Closing because close_inactive of 5m0s reached.
הגדרת זמן ההמתנה מיועד בעיקר למידע שמגיע אונליין ולא לקבצים סטטיים. ולכן
במקרה שלנו אין צורך לשנות אותו.
אם אהבתם, תכתבו משהו למטה...
אין תגובות:
הוסף רשומת תגובה