يمكننا الآن، بعد إكمال إعداد بيئة الإنتاج في الدرس السابق، البدء في إعداد نظام مركزي للسجلات؛ وهو وسيلة رائعة لجمع سجلات الخواديم ومعاينتها. لا يعدّ إعداد نظام سجلات دقيق، على العموم، في نفس أهمية توفر نظامي نسخ احتياطي ومراقبة فعالين؛ إلا أنه يمكن أن يكون مفيدا جدا عند البحث في اتجهات استخدام التطبيق أو أثناء محاولة تحديد المشاكل التي يعاني منها التطبيق.
سنعد في هذا الدليل حزمة برامج ELK، ونعني بها Logstash، Elasticsearch وKibana؛ ثم نعد مختلف الخواديم المكونة لبيئة الإنتاج حتى ترسل السجلات المناسبة إلى خادوم السجلات. سنعد أيضا مُرشِحات Filters في Logstash من أجل تجزئة السجلات وهيكلتها وهو ما يسهِّل عملية البحث في السجلات وترشيحها ثم استخدام Kibana لمعاينتها.
المتطلبات
يجب، إن أردت الوصول إلى لوحة المراقبة عبر نطاق خاص مثل logging.example.com
، إنشاء سجل من نوع A
ضمن إعدادات النطاق يحيل إلى عنوان IP العمومي الخاص بخادوم السجلات. أو يمكنك بدلا من ذلك الوصول إلى لوحة التسجيلات باستخدام عنوان الخادوم العمومي. يُنصح بإعداد خادوم السجلات لاستخدام HTTPS
وتقييد الوصول إليه بوضعه في شبكة خاصة افتراضية.
تثبيت حزمة ELK على خادوم السجلات
اضبط حزمة ELK على خادوم السجلات باتباع خطوات درس كيف تثبت Logstash، Elasticsearch وKibana 4 على خادوم Ubuntu 14.04. تأكد من اتباع الخيار رقم 2 في فقرة توليد شهادات SSL.
توقف عند الوصول إلى فقرة ضبط معيد توجيه Logstash.
إعداد معيدي توجيه Logstash على العملاء
اضبط معيد توجيه Logstash (مُرسِل للسجلات) على الخواديم العميلة (مثلا db1
، app2
، app1
وlb1
) باتباع فقرة ضبط معيد توجيه Logstash في درس ELK.
سيمكنك بعد إكمال الإعداد الدخولُ إلى Kibana عبر العنوان العمومي لخادوم السجلات وعرض سجلات النظام الخاصة بخواديمك.
تحديد السجلات المراد جمعها
تتيح برامج ELK الكثير من السجلات لجمعها، حسب نوعية البرامج المثبتة على الخواديم وإعدادها. سنجمع، في مثالنا، السجلات التالية:
- سجل الاستعلامات Queries البطيئة في MySQL (الخادوم
db1
). - سجلات الأخطاء والوصول في Apache (على الخادومين
app1
وapp2
). - سجلات HAProxy (خادوم توزيع الحمل
lb1
).
اخترنا هذه السجلات بالضبط لأن بإمكانها توفير معلومات مفيدة أثناء استكشاف الأخطاء وإصلاحها أو عند محاولة تحديد توجهات المستخدمين. يمكن أن يكون لدى خادومك سجلات أخرى مهمة، حسب إعداداتك.
إعداد سجلات MySQL
يحفظ MySQL الاستعلامات البطيئة في سجل على المسار var/log/mysql/mysql-slow/
. يتضمن السجل الاستعلامات التي أخذت وقتا طويلا للتنفيذ؛ يمكن أن يساعد تحديد هذه الاستعلامات في تحسين التطبيق والبحث عن علله وإصلاحها.
تفعيل تسجيل الاستعلامات البطيئة في MySQL
تسجيل الاستعلامات البطيئة في MySQL غير مفعَّل في الإعدادات الافتراضية؛ لذا سنحتاج لتفعيله.
افتح ملف إعدادات MySQL لتحريره:
sudo nano /etc/mysql/my.cnf
ابحث عن التعليمة log_slow_queries
وانزع علامة التعليق #
الموجودة أمامها ليصبح السطر على النحو التالي:
log_slow_queries = /var/log/mysql/mysql-slow.log
احفظ الملف ثم أغلقه. تجب إعادة تشغيل MySQL لاعتماد التغييرات:
sudo service mysql restart
سيبدأ MySQL الآن في تسجيل الاستعلامات التي تأخذ وقتا طويلا للتنفيذ. ملف السجل يوجد على المسار المحدّد في الإعداد.
إرسال ملفات سجلات MySQL
يجب إعداد معيد التوجيه في Logstash لإرسال سجلات الاستعلامات البطيئة إلى خادوم السجلات. حرر ملف إعداد معيد التوجيه على خادوم قاعدة البيانات db1
:
sudo nano /etc/logstash-forwarder.conf
أضف الأسطر التالية في آخر فقرة files
لإرسال الاستعلامات البطيئة إلى خادوم السجلات وتحديد نوع السجل ب mysql-slow
, { "paths": [ "/var/log/mysql/mysql-slow.log" ], "fields": { "type": "mysql-slow" } }
احفظ الملف ثم أغلقه. تعد التعليمات السابقة معيد توجيه Logstash لإرسال سجلات الاستعلامات البطيئة إلى خادوم السجلات وتعليمها بmysql-slow
. سنستخدم نوع السجل لاحقا في الترشيح.
أعد تشغيل معيد التوجيه للبدء في إرسال السجلات:
sudo service logstash-forwarder restart
مرماز Codec المدخلات متعددة الأسطر
سنحتاج لتفعيل مرماز تعدد الأسطر في Logstash لمعالجة سجلات الاستعلامات البطيئة في MySQL التي تأتي على أسطر متعددة. افتح ملف الإعدادات الذي يعرِّف مدخل Lumberjack على خادوم logging
:
sudo nano /etc/logstash/conf.d/01-lumberjack-input.conf
أضف الأسطر التالية إلى تعريف lumberjack
:
codec => multiline { pattern => "^# User@Host:" negate => true what => previous }
احفظ الملف ثم أغلقه. تعد التعليمات أعلاه Logstash لاستخدام معالج السجلات متعددة الأسطر عند العثور على سجلات تحتوي على النمط Pattern المُحدَّد (أي تلك التي تبدأ ب # User@Host:
).
في ما يلي سنضبط مرشح Logstash لسجلات MySQL.
مرشح سجلات MySQL
افتح ملفا جديدا على خادوم السجلات logging
لإضافة مرشحات لسجل MySQL. سنسمي الملف 11-mysql.conf
لكي يُقرأ بعد إعداد مدخلات Logstash (موجودة في ملف 01-lumberjack-input.conf
):
sudo nano /etc/logstash/conf.d/11-mysql.conf
أضف تعريف المرشح التالي:
filter { # يسجل المستخدم واختياريا اسم المستضيف وعنوان IP if [type] == "mysql-slow" { grok { match => [ "message", "^# User@Host: %{USER:user}(?:\[[^\]]+\])?\s+@\s+%{HOST:host}?\s+\[%{IP:ip}?\]" ] } # يسجل مدة تنفيذ الاستعلام، مدة قفل السطر في قاعدة البيانات، الأسطر المُرجعة في النتيجة والأسطر المفحوصة. grok { match => [ "message", "^# Query_time: %{NUMBER:duration:float}\s+Lock_time: %{NUMBER:lock_wait:float} Rows_sent: %{NUMBER:results:int} \s*Rows_examined: %{NUMBER:scanned:int}"] } # يسجل وقت حدوث الاستعلام grok { match => [ "message", "^SET timestamp=%{NUMBER:timestamp};" ] } # يستخرج الوقت اعتمادا على وقت الاستعلام بدلا من وقت إدراج العنصر في السجلات date { match => [ "timestamp", "UNIX" ] } # يحذف حقل الختم الزمني من السجل نظرا لتسجيل وقت الحدث (الاستعلام) mutate { remove_field => "timestamp" } } }
احفظ الملف ثم أغلقه. تعد التعليمات Logstash لترشيح السجلات من نوع mysql-slow
باستخدام أنماط Grok
المحددة في تعليمات match
. راجع التعليقا فوق كل تعليمة لأخذ نبذة عن عملها.
لكي تبدأ هذه المرشحات عملها يجب أن نعيد تشغيل Logstash:
sudo service logstash restart
يجب التأكد في هذه المرحلة من أن Logstash يعمل بطريقة صحيحة؛ إذ أن أخطاء الإعداد قد تتسبب في إخفاق إعادة تشغيله.
يجب أن تتأكد أيضا أن Kibana قادر على رؤية سجلات MySQL المرشحة.
سجلات Apache
توجد سجلات Apache عادة على المسار var/log/apache2/
باسم access.log
و error.log
. يتيح لك جمع هذه السجلات معرفة عناوين IP التي تتصل بخواديمك، طلبات هذه العناوين ونوعية المتصفحات ونظم التشغيل المستخدمة في الاتصال؛ بالإضافة إلى الأخطاء التي يبلغ عنها Apache.
إرسال سجلات Apache
نضبط معيد توجيه Logstash لإرسال سجلات الوصول والأخطاء في Apache إلى خادوم logging
.
نفذ الأمر التالي على كل واحد من خادومي التطبيق، app1
وapp2
لفتح ملف إعاد الخاص بمعيد توجيه Logstash:
sudo nano /etc/logstash-forwarder.conf
أضف ما يلي ضمن فقؤة files
تحت التعليمات الموجودة:
, { "paths": [ "/var/log/apache2/access.log" ], "fields": { "type": "apache-access" } }, { "paths": [ "/var/log/apache2/error.log" ], "fields": { "type": "apache-error" } }
احفظ الملف ثم أغلقه. تعد هذه التعليمات معيد توجيه Logstash لإرسال سجلات الوصول والأخطاء في Apache إلى خادوم السجلات، ثم تعليم كل سجل بنوعه (أي apache-access
بالنسبة للوصول وapache-error
بالنسبة للأخطاء).
أعد تشغيل معيد التوجيه للبدء في إرسال السجلات:
sudo service logstash-forwarder restart
إذا تركنا الإعداد الحالي فستُظهر كل سجلات Apache عنوان IP الخاص لخادوم HAProxy بوصفه عنوان المصدر. يعود السبب في ذلك إلى أن الخادوم الوسيط lb1
هو الوسيلة الوحيدة للوصول إلى خواديم التطبيق من الإنترنت. يمكن تغيير هذا الأمر بإعداد الصيغة الافتراضية لسجل Apache بحيث يستخدم الرأسيات X-Forwarded-For
التي يرسلها HAProxy.
افتح ملف إعداد Apache على كل واحد من خادومي التطبيقات:
sudo nano /etc/apache2/apache2.conf
ابحث عن سطر يظهر على النحو التالي:
[Label apache2.conf — Original "combined" LogFormat] LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
أبدل:
h% ب%{X-Forwarded-For}i
لكي تصبح هيئة السطر كالتالي:
[Label apache2.conf — Updated "combined" LogFormat] LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
احفظ الملف ثم أغلقه. بهذا نكون أعددنا سجلات Apache لتضمين عنوان IP المصدر الفعلي بدلا من عنوان IP الخاص لخادوم توزيع الحمل.
أعد تشغيل Apache لاعتماد التغييرات:
sudo service apache2 restart
نحن الآن جاهزون لإضافة مرشحات لسجلات Apache في Logstash.
مرشحات سجلات MySQL
ننشئ ملف إعداد جديدا على خادوم السجلات logging
من أجل إضافة مرشحات لسجل Apache إلى Logstash. سنسميه 12-apache.conf
لكي يقرأه Logstash بعد ملف إعداد المُدخلات (أي ملف 01-lumberjack-input.conf
):
sudo nano /etc/logstash/conf.d/12-apache.conf
أضف تعريفات المرشحات التالية:
filter { if [type] == "apache-access" { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } } } filter { if [type] == "apache-error" { grok { match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{DATA:severity}\] \[pid %{NUMBER:pid}\] \[client %{IPORHOST:clientip}:%{POSINT:clientport}] %{GREEDYDATA:error_message}" } } } }
احفظ الملف ثم أغلقه. تعد هذه التعليمات Logstash لاستخدام مرشحات Grok
لتحليل سجلات الوصول والأخطاء في Apache. يعرف كل مرشح صيغة السجلات التي يتعامل معها ضمن تعليمة match
الموجودة في المرشح الموافق لنوع السجل في الاسم. يُستخدم مرشح Grok
يوفره Logstash لتحليل سجلات الوصول إلى Apache اعتمادا على الصيغة الافتراضية لهذه السجلات؛ بينما كتبنا مرشح Grok
خاص لتحليل الصيغة الافتراضية لسجل الأخطاء في Apache.
نعيد تشغيل Logstash لكي تبدأ المرشحات الجديدة عملها:
sudo service logstash restart
يجب التأكد في هذه المرحلة من أن Logstash يعمل بطريقة صحيحة؛ إذ أن أخطاء الإعداد قد تتسبب في إخفاق إعادة تشغيله. يجب أن تتأكد أيضا أن Kibana قادر على رؤية سجلات Apache المرشحة.
سجلات HAProxy
يسمح جمع سجلات موزع الحمل HAProxy (توجد عادة في الملف var/log/haproxy.log/
) بمعرفة عناوين IP التي تتصل بخادوم توزيع الحمل، ماذا تطلب، خادوم التطبيق الذي يجيب على الطلب، ومعلومات مفصَّلة أخرى عن الاتصال.
إرسال ملفات السجلات الخاصة بHAProxy
نضبط معيد توجيه Logstash لإرسال سجلات HAProxy إلى خادوم السجلات بنفس طريقة الإعداد التي اتبعناها مع الخواديم السابقة. افتح الملف التالي على خادوم توزيع الحمل lb1
:
sudo nano /etc/logstash-forwarder.conf
أضف الأسطر التالية إلى فقرة files
تحت التعليمات الموجودة سلف. ترسل التعليمات الجديدة سجلات HAProxy إلى خادوم Logstash وتحدد نوعها بـ haproxy-log
.
, { "paths": [ "/var/log/haproxy.log" ], "fields": { "type": "haproxy-log" } }
احفظ الملف ثم أغلقه. تعد التعليمات أعلاه Logstash لإرسال سجلات HAProxy مع تحديد نوعها بhaproxy-log
. يستخدَم النوع في ما بعد لترشيح السجلات.
أعد تشغيل معيد توجيه في Logstash للبدء في إرسال السجلات:
sudo service logstash-forwarder restart
مرشح سجلات HAProxy
افتح ملفا جديدا على خادوم logging
لإضافة مرشح سجلات HAProxy إلى Logstash. سنسمي الملف الجديد 13-haproxy.conf
:
sudo nano /etc/logstash/conf.d/13-haproxy.conf
أضف تعريف المرشح التالي:
filter { if [type] == "haproxy-log" { grok { match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{SYSLOGPROG}: %{IPORHOST:clientip}:%{POSINT:clientport} \[%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}:%{TIME}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} "(%{WORD:http_verb} %{URIPATHPARAM:http_request} HTTP/%{NUMBER:http_version})|<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://))"'} } } }
احفظ الملف ثم أغلقه. تعد التعليمة Logstash لترشيح السجلات من نوع haproxy-log
باستخدام نمط Grok
المعيَّن، والذي يحلل السجلات لمطابقتها مع الصيغة الافتراضية لسجلات HAProxy.
أعد تشغيل Logstash لاعتماد المرشح:
sudo service logstash restart
يجب التأكد بعد تنفيذ الأمر أن Logstash يعمل بطريقة صحيحة؛ إذ أن أخطاء الإعداد قد تتسبب في إخفاق إعادة تشغيله.
إعداد المعاينة باستخدام Kibana
يمكن البدء باستخدام Kibana لمعاينة السجلات التي جمعناها من مختلف الخواديم. يسعادك المقال التالي في البدء باستخدام Kibana: كيف تستخدم لوحات القيادة والمعاينة في Kibana
بعد التأقلم مع Kibana جرب درس كيف تظهر مواقع المستخدمين على خريطة باستخدام GeoIP وELK لمعاينة أكثر تقدما.
خاتمة
إن اتبّعت الخطوات المشروحة في هذا الدليل فستحصل على بيئة إنتاج مثل تلك التي وصفناها في الجزء الأول نظرة عامة على إنشاء تطبيقات موجهة لبيئة الإنتاج من الدليل.
ترجمة - وبتصرف - لمقال Building for Production: Web Applications — Centralized Logging لصاحبه Mitchell Anicas.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.