پرش به مطلب اصلی

Log

با لاگ‌ها مثل stream رفتار کن

لاگ‌ها راهی هستن برای دیدن رفتار یک برنامه‌ی در حال اجرا. توی محیط‌های سروری، معمولاً لاگ‌ها توی یک فایل روی دیسک نوشته می‌شن (که بهش می‌گن "فایل لاگ")؛ ولی این فقط یه روش برای خروجی دادنه.

در واقع، لاگ‌ها streamی از رویدادهای زمان‌بندی‌شده هستن که از خروجی همه‌ی پردازش‌ها و سرویس‌های پشتیبان جمع‌آوری می‌شن. معمولاً لاگ‌ها به‌صورت متن هستن و هر خط نماینده‌ی یک رویداده این جریان نه نقطه‌ی شروع داره، نه پایان؛ فقط تا زمانی که برنامه در حال اجراست، ادامه داره.

برنامه‌ نباید درگیر مدیریت یا مسیر‌دهی خروجی لاگ بشه. نباید خودش فایل لاگ بسازه یا باهاش کاری داشته باشه. بلکه هر پردازش باید لاگ‌هاش رو مستقیم، بدون بافر، به stdout (خروجی استاندارد) بنویسه.
توی حالت local، برنامه‌نویس می‌تونه این stream رو همون لحظه توی ترمینال ببینه و رفتار برنامه رو بررسی کنه.

اما توی محیط staging یا production، این خروجی‌ها توسط پلتفرم اجرا (execution environment) جمع‌آوری می‌شن، با خروجی‌های دیگه ترکیب می‌شن، و به یک یا چند مقصد نهایی برای مشاهده و آرشیو بلندمدت فرستاده می‌شن. این مقصدها برای خود برنامه قابل دیدن یا تنظیم نیستن، و کاملاً توسط محیط اجرا مدیریت می‌شن. ابزارهای متن‌باز مثل Logplex یا Fluentd می‌تونن برای این کار استفاده بشن.

این جریان لاگ رو می‌شه توی یک فایل نوشت یا همزمان توی ترمینال تماشا کرد. مهم‌تر از اون، می‌شه اون رو به سیستم‌هایی مثل Splunk (برای جستجو و تحلیل لاگ) یا ابزارهایی مثل Hadoop/Hive فرستاد. این ابزارها امکانات زیادی برای بررسی رفتار برنامه در طول زمان فراهم می‌کنن.

البته مهمه که [[Log Rotation]] هم داشته باشیم

تفاوت apm ها و logger در این جمله است

[!APM vs LOG] Logging is for events with identity, events that will be inspected individually. Metrics are for events that will never have identity and will only be understood statistically.

log sampling

فرض کن یه سیستم داری که هزار تا event پشت‌سرهم تولید می‌کنه، مثلاً کامنت‌های یه پست توی شبکه اجتماعی. هر ثانیه یه نفر کامنت می‌ذاره — X برای Y، بعد Z برای Y، بعد یکی دیگه...
اگه بخوای همه‌شو log کنی، هم فضای زیادی می‌گیره هم خوندن و تحلیلش بعداً سخت می‌شه.

برای همین یه روش بهتر اینه که یه sampler service بذاری بین راه که فقط بخشی از این پیام‌ها رو ذخیره کنه. مثلاً از هر ۱۰۰ تا پیام یکی رو log کنه، یا فقط پیام‌هایی با اهمیت بیشتر (مثل error یا delay بالا) رو نگه داره.

اینجوری هم حجم logها کم می‌شه، هم سیستم سریع‌تر می‌مونه، هم وقتی می‌خوای عیب‌یابی یا تحلیل کنی، فقط داده‌های مهم رو داری نه کلی نویز الکی

log rotation

لاگ روتیشن یه فایل Log داری که هر روز کلی اطلاعات توش میره و همش بزرگ و بزرگ‌تر میشه. بعد از یه مدت دیگه نه می‌تونی بخونی، نه می‌تونی ازش استفاده کنی! log rotation یعنی به طور خودکار این فایل‌های لاگ رو تقسیم کنیم. مثلاً روزانه یا هفتگی یه فایل جدید درست می‌کنیم و قدیمیا رو آرشیو می‌کنی. چرا؟ چون: سرعت کم میشه و پیدا کردن لاگی که میخوای سخت میشه