سطح لاگ

سطح لاگ

تمرین یادگیری

مقدمه

اتم

نوع atom در Elixir یک ثابت مشخص را نمایش می‌دهد. مقدار یک اتم صرفاً اسم خودش است. این به ما امکان می‌دهد به شکلی ایمن از نظر نوع با داده‌ها کار کنیم. اتم‌ها را می‌توان به شکل زیر تعریف کرد:

# All atoms are preceded with a ':' then follow with alphanumeric snake-cased characters
variable = :an_atom

اتم‌ها در باطن با یک عدد صحیح در یک جدول جست‌وجو نمایش داده می‌شوند که به‌طور خودکار تعیین می‌شوند. امکان تغییر این مقدار درونی وجود ندارد.

Cond

اغلب می‌خواهیم کدی بنویسیم که بتواند بر اساس یک شرط منشعب شود. هرچند در Elixir راه‌های زیادی برای این کار وجود دارد، یکی از ساده‌ترین آن‌ها استفاده از cond/1 است.

cond در ساده‌ترین حالت، با یک یا چند شاخه، نخستین مسیری را دنبال می‌کند که به true ارزیابی شود:

cond do
  x > 10 -> :this_might_be_the_way
  y < 7 -> :or_that_might_be_the_way
  true -> :this_is_the_default_way
end

اگر هیچ مسیری به true ارزیابی نشود، زمان اجرا یک خطا ایجاد می‌کند.

دستورالعمل‌ها

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

کد لاگ برچسب لاگ پشتیبانی در برنامه‌های قدیمی؟
0 trace خیر
1 debug بله
2 info بله
3 warning بله
4 error بله
5 fatal خیر
سایر / پشتیبانی‌نشده unknown -

1. تعیین برچسب لاگ

تابع LogLevel.to_label/2 را پیاده‌سازی کنید. این تابع باید یک کد عددی و یک پرچم «منطقی» بگیرد که به شما می‌گوید آیا لاگ از یک برنامه‌ی قدیمی می‌آید، و برچسب یک خط لاگ را به‌صورت یک «اتم» برگرداند.

کدهای لاگی که در جدول مشخص نشده‌اند باید برچسب unknown را برگردانند. کدهای لاگی هم که در جدول به‌عنوان پشتیبانی‌نشده در برنامه‌های قدیمی مشخص شده‌اند، اگر لاگ از یک برنامه‌ی قدیمی آمده باشد باید برچسب unknown را برگردانند.

LogLevel.to_label(0, false)
# => :trace

LogLevel.to_label(0, true)
# => :unknown

2. ارسال هشدار

وقتی اتفاق‌های غیرمنتظره‌ای می‌افتد، باید به کسی اطلاع داده شود.

تابع LogLevel.alert_recipient/2 را پیاده‌سازی کنید تا مشخص شود هشدار باید به چه کسی فرستاده شود. این تابع باید یک کد عددی و یک پرچم منطقی بگیرد که می‌گوید آیا لاگ از یک برنامه‌ی قدیمی می‌آید، و اسم گیرنده را به‌صورت یک اتم برگرداند.

از تابع LogLevel.to_label/2 از بخش قبلی استفاده کنید. اگر برچسب لاگ error یا fatal باشد، هشدار را به تیم ops بفرستید. اگر لاگی با برچسب unknown از یک سیستم قدیمی دریافت کردید، هشدار را به تیم dev1 بفرستید، و سایر برچسب‌های unknown باید به تیم dev2 فرستاده شوند. سایر برچسب‌های لاگ را می‌توان با برگرداندن false با خیال راحت نادیده گرفت.

LogLevel.alert_recipient(-1, true)
# => :dev1

LogLevel.alert_recipient(0, false)
# => false
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elixir Exercism

آماده‌اید سطح لاگ را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elixir را همراه با 58 مفهوم168 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.