اول از همه میخوام درمورد خود لاگ حرف بزنم. ما ها هر برنامه ای که مینویسیم اینجوریه که باید همیشه یک سری اطلاعات از اون رو بدیم بیرون که بفهمیم الان داره چه اتفاقی میافته ؟ اصلا برنامه کار میکنه ؟ ارور خورده یا نه ؟ اگه ارور خورده چه اروری خورده ؟و کجا این اتفاق افتاده ؟
اینجوری بگم که حجم کد که از یه حدی بزرگتر بشه، اگه اشکالی به وجود بیاد عملا بدون دیدن لاگ ها نمیشه کاریش کرد و فهمید اشکال کار کجاست :(
پس در واقع لاگ انداختن یکی از شیوه های دیگهی مانیتورینگه ک قبلا یه دونش رو گفتیم.
خب لاگ رو کی تولید میکنه ؟ معلومه ما (برنامه نویس) باید وقت هایی که احساس میکنه اینجا باید یک چیزی لاگ بشه باید اونجا این کار رو انجام بده.
دیگه نمیخوام زیاد وارد جزئیات بشم ولی لازم میدونم چند تا نکته رو همینجا بگم - شاید اصلا بعدا یک نوشته خصوصا برای چجوری لاگ خوب بندازیم رو بنویسم - :
لاگ ها سطح بندی دارن و اینجوریه که توی هر موقعیت باید لاگ مربوط به اون رو بندازیم. و میتونیم به سیستم لاگینگمون بگیم که کدوم سطح از لاگ ها رو میخوایم ببینیم. این سطح ها عموما به ترتیب debug و info و error و critical هستن. (البته سطح های warning , exception هم هستن که من کم دیدم استفاده بشن.) این سطح هایی که گفتم از راست به چپ به ترتیب با اهمیت تر میشن. (چون عموما حجمشون خییلیه)
خب تا الان احتمالا به اهمیت لاگ پی برده ایم و قانع شدیم که باید باشن.
کلا اگه بخوام یک تصور راحت بهتون بدم اینه که دیدید وقتی یک کدی رو داریم میزنیم و یه ایرادی داره اولین راهی که به ذهنمون میرسه میریم و چند تا پرینت توی قسمت های مختلف از برنامه میذاریم که ببینیم چه اتفاقی داره میافته و ایراد رو پیدا کنیم. لاگ کردن میشه حالت پیشرفته این کار که صرفا به قصد دیباگ کردن و فهمیدن خطا نیست و حتی بعدا میشه تحلیل های بیزینسی و آماری جالبی روی لاگ های برنامه کرد و چیز های جالبی از اون ها فهمید.
به جرئت میتونم بگم که همه زبون های برنامه نویسی logger دارن برای خودشون و با یک سرچ ساده که مثلا توی پایتون چجوری لاگ بندازیم ؟ میتونیم ببینیم چجوری دارن کار میکنن. (بازم اگر شد میام و درمورد لاگ انداختن توی زبون های معروف حرف میزنم.)
نکته بعدی اینه که لاگ ها معمولا یک سری فرمت هایی هم دارن که کاملا بستگی مستقیم به برنامه نویس اون سیستم داره. مثلا اینکه تاریخ و ساعت و کجا باشه و این ها، این یک مثال ساده از لاگ لایبرری echo توی زبون Go هستش:
{"level":"info","msg":"⇨ http server started on [::]:8000","time":"2018-12-28T09:39:31Z"}
حالا یک مسئله ای پیش میاد و اونم اینه که الان برنامه من داره کار میکنه یک مشت لاگ رو داره میده بیرون و خیلی هم زیاد هستن و فی الواقع باید گفت یا ابلفضل : دی
خب این ها رو یه جوری باید مدیریت کرد و برای این روش های مختلفی وجود داره، ابتدایی ترین اون ها اینه که به کدمون بگیم روی همون کنسولی که روش اجرا شده یا یه مرحله بریم جلو تر رو یک سری فایل ذخیرشون کنیم و بعد دییتابیس و این داستانها. اما همه این ها (که بعضی هاشون لازمن و باید باشن بعضا) مشکلاتی دارن. مثلا یک مشت لاگ داریم که توی یک مشت فایله، سرچ توی اون ها و کلا مدیریتش هزینه (زمان) بره.
یک سری ابزار ها هستن که اینکار رو برای ما راحت تر میکنن و گریلاگ یکی از اون ها هستش. که برای طولانی نشدن مطلب توی نوشته بعدی بهش میپردازم.