مقدمه‌ای بر Logging

مقدمه‌ای بر Logging

نوشته شده توسط: احمدرضا صدیقی
تاریخ انتشار: ۱۳ مهر ۱۳۹۸
آخرین بروزرسانی: ۱۷ تیر ۱۴۰۳
زمان مطالعه: 20 دقیقه
۴
(۴)

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

مقدمه

اگر روزهای اولیه برنامه نویسی خود را به خاطر آوردید بی شک در بسیاری از مواقع، برای دیباگ کردن برنامه‌های خود از جمله (System.out.println)استفاده می‌کردید با نوشتن این جملات در لابلای کدهای برنامه، می‌توان اجرای خطوط برنامه را ردیابی کرده و وضعیت متغیرهای برنامه، رخداد خطا، شروع و پایان یک متد یا هر چیز دیگری که در حین اجرای برنامه برایتان حائز اهمیت است را در خروجی استاندارد چاپ کنید.
اگر تعداد جملات (System.out.println) در برنامه کم باشد ردیابی اجرای برنامه با بکارگیری این جملات آسان است، اما مسئله‌ای که عموما با این نوع دیباگ کردن مواجه هستیم این است که اگر از تعداد زیادی از این جملات در برنامه خود استفاده کنید در اینصورت ردیابی اجرای برنامه بسیار دشوار خواهد شد زیرا در زمان اجرای برنامه، جملات بیشماری را در خروجی استاندارد مشاهده خواهید کرد.

مشکل دیگر (System.out.println) کاربرد موقتی آن است چاپ جملاتی بدین طریق فقط در زمان تولید برنامه کاربرد دارد زمانیکه برنامه تولید شد، چاپ جملات دیگر ضرورت ندارد شاید اینگونه تصور کنید که می‌توان پس از تولید برنامه، آنها را از برنامه حذف نمود، اما این راه حل نیز مناسب نیست زیرا گذشته از اینکه حذف آنها از برنامه خطازا خواهد بود ممکن است در طول زمان نگهداری برنامه مجددا به آنها نیاز شود.
اما مهمترین اشکال (System.out.println)کاربرد عمومی و غیرتخصصی آن است برای درک این مطلب تکه کد زیر را ملاحظه کنید:

public void doSomething(){
  System.out.println("method is starting...");
  ...
  try{
    System.out.println("try block is running...");
             ...
  }catch(Exception ex){
    System.out.println("exception occured”);
  }
       ...
  System.out.println("method finished.");
}

در اینجا پیام‌های مختلفی در حین اجرای متد در کنسول برنامه چاپ شده‌اند، اما همه آنها از یک درجه اهمیت برخوردار نیستند. اکثر پیام‌ها اطلاعاتی هستند در حالیکه یکی از که درون بلوک Catch قرار دارد یک پیام خطا را گزارش می‌کند.
به طور خلاصه می توان نقاط ضعف (System.out.println)را به صورت زیر عنوان کرد:

  • پیغام‌هایی که توسط (System.out.println) در خروجی چاپ می‌شوند قابل دسته بندی نیستند به عبارت دیگر شما نمی‌توانید بین پیغام‌های خطا، پیغام‌های اخطار، پیغام‌های اطلاعاتی و … تفاوت قایل شوید.
  • قالب پیغام‌ها تحت کنترل برنامه نیستند یعنی هر پیغام به همان شکلی که در (System.out.println) نوشته می‌شود در خروجی ظاهر می‌شود. ممکن است بخواهید در کنار هر پیغام زمان و محل تولید پیغام در برنامه را نیز گزارش کنید.
  • جملات (System.out.println) که در لابلای کدهای برنامه نوشته می‌شوند قابلیت غیرفعال شدن ندارند یعنی اگر بخواهید مانع نمایش تمام پیغام‌ها یا برخی از آنها در خروجی شوید ناگزیر به دستکاری کدهای برنامه و حذف آنها خواهید بود!
  • از همه مهمتر، جملات (System.out.println)، پیغام‌ها را در خروجی استاندارد چاپ می‌کنند ولی ممکن است بسته به نیاز بخواهیم، پیغام‌ها در یک فایل، در پایگاه داده، روی وب یا هر جای دیگری ذخیره و نمایش یابند.

Logging نیز هدفی مشابه (System.out.println) دارد، با این تفاوت که پیغام‌هایی که توسط Logging تولید می شوند کاملا تحت کنترل هستند با استفاده از Logging می‌توانید:

  • بدون دستکاری کدهای برنامه، قالب پیغام‌ها را کنترل کنید
  • انواع مختلفی از پیغام‌ها را تولید کنید (پیغام خطا، اخطار، اطلاعاتی، …)
  • بدون دستکاری کدهای برنامه، محل نمایش یا چاپ پیغام‌ها را از بیرون برنامه کنترل کنید.
  • بدون دستکاری کدهای برنامه، نمایش یا عدم نمایش پیغام‌ها را از بیرون برنامه کنترل کنید (نمایش پیغام‌ها را فعال یا غیرفعال کنید).

برنامه‌های (framework) مختلفی در جاوا طراحی و پیاده سازی شده‌اند که کار Logging در یک برنامه را تسهیل می‌کنند اگرچه می‌توان بدون استفاده از هیچیک از این برنامه‌ها، امکانات Logging را در یک برنامه طراحی و پیاده سازی نمود ولی استفاده از برنامه‌های آماده، ما را از بسیاری از مسایل و جزئیات Logging رهایی می‌دهد و بسیاری از خصوصیات پیشرفته Logging را در اختیار می‌گذارند چیزهایی که اگر خودمان بخواهیم پیاده سازی کنیم ممکن است به سادگی برایمان مقدور نباشند.
اگرچه برنامه‌های Logging در جاوا بسیار متنوع هستند و بالتبع استفاده از آنها نیز متفاوت است ولی مفاهیم و عملکرد مشابهی دارند در چند ابزار رایج Logging معرفی شده‌اند.
کد زیر، نسخه تغییر یافته از کد بالاتر است که به جای (System.out.println)

private final static Logger LOGGER = Logger.getLogger(LoggingUsage.class.getName());
public void doSomething(){
        LOGGER.info("method is starting...");
  ...
  try{
             LOGGER.info("try block is running...")
             ...
  }catch(Exception ex){
             LOGGER.info("exception occured ");
  }
       ...
       LOGGER.info("method finished.");
}

JDK Logging

در JDK یک API اختصاصی برای Logging پیش بینی شده است. بنابراین بدون استفاده از هرگونه فریم ورک یا کتابخانه خارجی، می‌توان پیام‌های برنامه را Log کرد. اگرچه Loggingای که در JDK ارائه شده است بسیار قدرتمند است، اما در مقایسه با فریم ورکهای قدرتمندی همچون Log4j و logback از امکانات و خصوصیات کمتری برخوردار است.

JDK Logging دارای خصوصیات زیراست

  • چاپ یا ذخیره کردن پیغام‌ها در مقصدهای مختلف (فایل، حافظه، خروجی استاندارد، سوکت شبکه،…)
  • قالب دهی پیام‌ها در XML یا متن ساده
  •  پشتیبانی از انواع مختلف پیام‌ها شامل Severe، Warning، Info، Config، Fine، Finer و Finest (به انواع پیام، سطوح پیام گفته می‌شود).

Log4j

Log4j را می‌توان اصلی ترین ابزار Logging در جاوا نامید که در دو گونه Log4j1 و Log4j2 ارائه شده است. Log4j2 نسل جدیدتر Log4j1 است که معماری آن دگرگون شده است و در مقایسه با نسل قبلی کارایی بالاتری دارد. هر استفاده از دو نسل Log4j بسیار ساده است، تنظیم سر راست و آسانی دارند و خصوصیات و ویژگی‌های فراوان و قدرتمندی دارند.
Log4j مشابه بقیه فریم ورک‌های Logging انواع مختلفی از پیام‌ها را تحت عنوان سطح (level) را پشتیبانی می‌کند. این سطوح عبارتند از debug، info، warn، error، fatal. Log4j دارای یک فایل تنظیمات log4j.properties است که با استفاده از آن می‌توان به آسانی پیغام‌های مربوط به یک سطح را خاموش یا روشن (فعال یا غیرفعال) نمود. پیغام‌های هر سطحی که خاموش شوند در خروجی ظاهر نمی‌شوند.

Logback

یکی دیگر از فریم ورکهای محبوب Logging، پروژه Logback است. Logback همانند Log4j2 نسل جدیدتر Log4j1 است که توسط بعضی از برنامه نویسان Log4j بعد از جدایی از تیم Log4j با هدف تولید یک فریم ورک کارای Logging بوجود آمده است. به همین خاطر باید Logback را موازی Log4j2 تصور کرد، کما اینکه در مجامع و گروه‌های مختلف برنامه نویسان، به صورت مداوم سرعت و کارایی این دو فریم ورک با هم مقایسه می‌شود.

Logging Facade

مطمئنا در اینجا می‌خواهید بدانید باوجود این همه فریم ورک Logging کدامیک بهتر است و کدامیک را باید انتخاب کنید. واقعیت این است که همه این فریم ورکها خیلی به هم نزدیک هستند و در اغلب مواقع نیازهای Logging پروژه‌ها را برآورده می‌کنند، ولی یکی از عوامل بسیار مهم و تاثیرگذار در انتخاب یک فریم ورک Logging کارایی آن است. از آنجاییکه Logging هرجایی از کد و به تعداد زیاد ظاهر می‌شوند اگر فریم ورک مورد استفاده کارایی لازم را نداشته باشد، به سادگی می‌تواند کارایی برنامه را تحت تاثیر بگذارد. این موضوع در برنامه‌های وب و Enterprise مشهود و محسوس خواهد بود. براساس تجربه شخصی، یکی از فریم ورکهای Log4j2 یا Logback را پیشنهاد می‌کنم. توجه داشته باشید که فریم ورکهای Logging زیادی در جاوا وجود دارند که برای سادگی موضوع و کوتاه شدن مبحث، صرفا مهم ترین آنها در اینجا مطرح شدند.

اما برای اینکه، یک برنامه به یک فریم ورک خاص Logging وابسته نشود، و بعدا امکان تغییر یا سوییچ بین فریم ورکهای Logging وجود داشته باشد، فریم ورکهای Logging Facade تولید شده‌اند که همانند یک واسطه بین برنامه و فریم ورک Logging قرار می‌گیرند و برنامه را از جزئیات فریم ورک Logging ایزوله می کنند. SLF4J و Commons Logging دو نمونه از فریم ورکهای Facade هستند. Commons Logging به علت اشکالاتی که با JDK Logging دارد، امروزه استفاده نمی‌شود.
اگرچه در نگاه اول ممکن است اینگونه به نظر برسد که SLF4J نیز یکی دیگر از ابزارهای Logging است، اما در واقع اینگونه نیست!. اما
SLF4J همانند همه برنامه‌های Logging، کلاس‌ها و متدهایی را برای Logging در اختیار قرار می‌دهد اما خود در پشت صحنه از یکی از ابزارهای Log4j، JDK logging، Logback برای انجام Logging استفاده می‌کند مزیت استفاده از SLF4J همانطور که گفته شد در این است که کدهای برنامه را به Log4j، JDK logging یا Logback وابسته نمی‌کند و به سادگی می‌توانید بدون تغییر در کدهای برنامه، ابزار Logging خود را به یکی از برنامه‌های Logging تغییر دهید

چه رتبه ای می‌دهید؟

میانگین ۴ / ۵. از مجموع ۴

اولین نفر باش

title sign
معرفی نویسنده
احمدرضا صدیقی
مقالات
6 مقاله توسط این نویسنده
محصولات
3 دوره توسط این نویسنده
احمدرضا صدیقی

احمدرضا صدیقی متخصص و معمار ارشد جاوا است. از دیگر سوابق حرفه ای او می توان به:معمار ارشد در حوزه جاوا مربوط به پروژه دانشگاه علوم پزشکی، معمار ارشد در حوزه جاوا مربوط به پروژه شرکت خبره پردا، معمار ارشد در حوزه جاوا مربوط به پروژه شرکت کیاتک بنیا، معمار ارشد در حوزه جاوا مربوط به پروژه دانشگاه مالک اشتر، مشاور پروژه‌ ملی طرح جامع مالیاتی، مشاور پروژه‌ ملی وزارت بهداشت، مشاور پروژه‌ بانک ملت، مولف مجموعه کتاب‌های جاوا (فارسی و انگلیسی)، بیش از ۱۲ سال سابقه تدریس جاوا، ارائه فریم‌ورک تخصصی جاوا (اطلس) اشاره کرد.

title sign
معرفی محصول
title sign
دیدگاه کاربران

    • سلام خیلی عالی بود خیلی ممنون
      ببحشید فقط موقع رای من فکر کردم باید از سمت راست ستاره رو انتخاب کنم ولی متاسفانه با کلیک روی اولین ستاره همون ثبت شد. ولی من منظورم ۵ تا ستاره بود:)
      خیلی ممنون برای من واقعا این مطلب مفید بود
      ببخشید فقط یه سوال دارم اینکه گفتید slf4j یک اینترفیس هست که داره به یکی از فریم ورک های لاگ مثل log4j و غیره وصل میشه.. چطور متوجه بشیم که از کدوم فریم ورک داره استفاده میکنه؟ من توی لامبوک از انوتیشن slf4j استفاده کردم ولی این سوال برام پیش اومد که از کدوم فریم ورگ لاگ استفاده میکنه
      خیلی ممنون