لاگ یک بخش کلیدی از نگهداری و داشتن تضمین کارایی یک سیستم در طول زمانه. طبیعت یک سیستم نرمافزاری پیچیده است و قرار نیست همیشه همه چیز عالی و درست پیش بره. در هر لحظه یک سیستم نرمافزاری ممکنه با خطا و مشکل ناخواستهای مواجه بشه که در زمان طراحی و پیادهسازی کدها به اون توجهی نشده. لاگ کردن به ما کمک میکنه که برنامهی خودمون رو بهتر درک کنیم.
بدون لاگ درست ما باید ساعتهای متوالی رو برای پیدا کردن منشا خطا در هنگام production صرف کنیم و ممکنه بارها و بارها به یک خطا بر بخوریم بدون اینکه به طور کامل بتونیم حلش کنیم. توی این نوشته قراره یک سری به دنیا لاگ در Node.js بزنیم و با هم امکانات موجود در این حوزه رو بررسی کنیم.
هشدار: هیچ وقت اطلاعات حساس یا دیتای شخصی مثل رمزعبور و نامکاربری کاربران یا اطلاعات حسابشون رو داخل لاگ ذخیره نکنید.
دو کتابخونهی winston (به اندازهی سیگارش معروفه) و morgan (به خاطر علاقه به دکستر مورگن نامگذاری شده) اصلیترین کتابخونهها این این حوزه به شمار میرن که به ترتیب در حال حاضر بیش از 5 میلیون و 2 میلیون دانلود در هفته دارند.
هدف اصلی کتابخونهی winston ایجاد یک ساختار لاگ کامل و چند سطحیه و این کار رو با دو ابزار Transports و Logging levels انجام میده. Transports این امکان رو برای ما فراهم میاره که لاگهای متفاوت رو توی زمانهای متفاوت در در بسترهای متفاوت ذخیره کنیم. مثلا در زمان development فقط لاگهای خطاهای سری 400 و 500 رو توی کنسول نمایش بدیم و در زمان production لاگ اجرای تمامی سرویسها رو توی دیتابیس ذخیره کنیم.
مثلا توی تکه کد بالا ما تصمیم گرفتیم همهی لاگها رو توی فایل ذخیره کنیم اما فقط هنگامی که در Moody به غیر از production هستیم لاگ اجرای سرویسها رو در کنسول هم به نمایش بزاریم.
سطحها یا levelها ابزار قدرتمند دیگه این کتابخونه برای مدیریت لاگه. سطحهای این کتابخونه شامل موارد زیر است:
مشخصه که مهمترین سطح لاگ سطح صفر یا خطا هست و هر چقدر که بالاتر میاییم از اهمیت سطح لاگ کاسته میشه. به طور مثال میتونیم option زیر رو برای مدیریت سطحهای مختلف طراحی کنیم:
در option بالا ما برای دو سطح برنامه ریزی کردیم. لاگهای تا سطح info رو داخل فایل ذخیره کردیم. همچنین فرمت ذخیرهسازی لاگها رو json انتخاب کردیم. سطح debug هم رو برای مدیریت اطلاعات در هنگام development انتخاب و کانفیگ کردیم. در تکه کد اولی ما از این optionها به عنوان تنظیمات Transport ها استفاده کردیم.
کارمون تقریبا با کتابخونهی winston اینجا تمومه و به سراغ کتابخونهی morgan میریم. این کتابخونه در اصل یک middleware برای لاگ کردن اطلاعات هنگام api نویسیه. این کتابخونه مانند winston از option های متفاوتی برای ذخیره لاگ استفاده میکنه که شامل option هایی از قبیل tiny، dev، common و .. است. تفاوت این option ها به مقادیری اطلاعاتیه که اونها ذخیره میکنند. به طور مثال tiny شامل موارد زیر میشه:
:method :url :status :res[content-length] - :response-time ms
علاوه بر option های پیش فرض امکان شخصیسازی اونها هم وجود داره. به طور مثال تکه کد زیر رو در نظر بگیرید:
اینجا چند تا اتفاق مهمه افتاده. اول اینکه ما یک option شخصیسازی شده برای این کتابخونه طراحی کردیم. ما مشخص کردیم که نوع متد، آدرس، وضعیت اجرا، طول پاسخ و زمان پاسخ رو ذخیره کنیم. همچنین منبع ذخیرهسازی لاگهای این کتابخونه رو winston اعلام کردیم. اینجوری قدرت این دو تا کتابخونه رو با هم ترکیب کردیم.
ترند اصلی ذخیرهسازی لاگ علاوه بر ذخیره در دیتابیس Mongodb استفاده از اکوسیستم Elasticsearch به همراه Logstash و نمایش لاگها در Kibana است. همچنین کدهای این مطلب در این آدرس قرار داده شده.