بلاگ آموزشی آموزشگاه اندروید ایران

Log کردن در Application ها-قسمت اول

یک سناریو را تصور کنید که شما گزارش یک buG را در برنامه تان دارید.حال با فرض اینکه مراحل دقیق تولید باگ از سوی مشتری کاملا به شما داده شود، و شما بتوانید دقیقا هر بار به باگ برسید.مشکلتا زمانی است که شما در Debugger به یک breakpoint  بخورید ، در غیر اینصورت شما بدون هیچ توضیحی از یک مشکل عبور می کنید.اگر مشکل شما مربوط به همزمانی(concurrency) باشد که یافتن مشکل از این طریق بسیار دشوار خواهد شد.
در بسیاری موارد امکان اینکه شما سناریوی نحوه ایجاد باگ را دوباره اجرا کنید و یا اینکه debugger خود را به ماشینی که برنامه مشتری در آن اجرا می شود وصل کنید، وجود ندارد.


از طرفی debug کردن تنها دلیل استفاده از logging نیست.در بسیاری موارد شما می خواهید از رویدادهای درون برنامه خود، تغییرات در پیکربندی سیستم، رفتار غیر متعارف، راه اندازی و پایان یک جز از برنامه ، گزارش داده های ورودی به برنامه و ... اطلاع داشته باشید.و یا اینکه برنامه خود را مانیتور کنید و اطمینان حاصل کنید که حتما فعالیت مورد نظر شما چگونه اجرا می شود.
ثبت اطلاعات مراحل اجرای برنامه(logging) برای debug، رفع مشکل ، مانیتورینگ و گزارش خطا در برنامه شما ضروری است.شما در این مقاله با logging، logging facades ، API ها و طرز اجرا و و اینکه چگونه logging را در برنامه خود integrate کنید آشنا خواهید شد.

معمولا چه محتواهایی log می شوند
•    زمانی که یک برنامه crash می کند و یا بطور ناگهانی از برنامه خارج می شود، در این حالت باید تا جای ممکن اطلاعات و جزئیات ثبت شوند. این اطلاعات می تواند شامل پیام ها ، stack trace ها ، thread dump ها و یا حتی heap dump ها باشد.برخی اوقات ماهیت خود log اجازه نمی دهد که بتوانید log کنید. مثلا خطای  outOfMemory در سطح JVM . در اینگونه موارد JVM امکاناتی را برای log گرفتن از موقعیت های اینچنینی ارائه می کند.نظیر استفاده از command line option : -XX:+HeapDumpOnOutOfMemoryError که باعث می شود Java ، heap dump را در هنگام بروز خطای outOfMemory تولید کند.

•    زمانی که خطایی روی می دهد، شما باید هرگونه اطلاعات را در رابطه با خطا log کنید. با log کردن جزئیات خطا شما فقط به کاربر یک پیغامی مبنی بر بروز خطایی در سیستم نشان می دهید و جزئیات در جای دیگری نظیر فایل، database ذخیره سازی می شوند که باعث می شود سطح عملکرد برنامه شما هم پایین نیاید.

•    مواردی که مسائلی در سیستم پیش می آید که لزوما خطا نیستند ولی باید بعدا به اطلاع اشخاص دیگر برسند.

•    موارد مهم خاصی وجود دارد که شما می خواهید آنرا در log خود ببینید.نظیر بوجود آمدن entity ها ، راه اندازی یک جز از سیستم ، ورود موفق کاربر، روند اجرای یک سری وظایف(task) که نشان دهد سیستم شما بدرستی کار می کند.

•    زمانی که شما یک مشکل را ردیابی می کنید می خواهید اطلاعات مفصل از از اجرای متدها، توابع و حتی مقدار متغیرهای آنها را ببینید.در مشکلترین حالات شما می خواهید ورود و خروج به یک متد ، مقدار پارامترهای ورودی به آن و مقدار بازگشتی از آنها را Log کنید.

نکته ای که لازم است ذر اینجا به آن اشاره شود آنست که log ها لزوما file نیستند.log ها می توانند به هر صورتی به هر media ای نوشته شوند.برخی مواقع Log شما باید بصورت async(غیرهمزمان) نوشته شود تا برنامه شما قادر باشد کار معمول خود را همراه با نوشته شدن log ادامه دهد. و یا اینکه log شما باید transaction-safe باشد به این معنی که در صورتی که logging شما fail شد ، کل عملیات متوقف شود.

مدیا های معمول مورد استفاده برای logging
Console
Log کردن در کنسول معادل همان system.out.println() است.نکته بدی که در رابطه با log در کنسول وجود دارد این است که بعد از بسته شدن برنامه ، buffer کنسول خالی می شود و چیزی نمایش داده نمی شود.log کنسول در هنگام توسعه برنامه بسیار مفید است.این مدیا به عنوان یک سیستم failover در logging عمل می کند.

Flat Files
Flat File ها شاید راحتترین راه برای نوشتن log ها هستند و سختترین راه برای خواندن log ها.مهمترین مزیت این فایل ها آن است که این ماهیتا ، مانا هستند.انواع مختلفی از log های file ای وجود دارد :
•    Xml logging این نوع log ، اطلاعات log را بصورت xml استاندارد ذخیره سازی می کند.مزیت اول این نوع log آنست که هم توسط ماشین و هم توسط انسان خوانا می باشد.log ها توسط برنامه قابلیت خوانده شدن و فیلتر شدن دارند.اما xml یک فرمت خیلی بزرگ است و اندازه آن چند برابر log های معمولی است.
•    Json logging همانند xml logging است و اطلاعات log را در فرمت JavaScript Object Notation ذخیره سازی می کند.اندازه آن از فرمت xml بسیار کمتر است.اما خوانایی آن توسط انسان کمتر است.

مفهوم rolling file در logging
زمانی که یک سیستم log راه اندازی می شود تا از rolling file  استفاده کند ، این نوع در بازه های زمانی منظم ، فایلی را که در آن log صورت می گیرد را عوض می کند.برخی اوقات سیستم rolling بصورت زمانی می باشد   و برخی اوقات این سیستم log براساس اندازه می باشد.با برآورده شدن این شرایط log فایل جاری در یک فایل بصورت index  شده backup گرفته می شود و یک log file جدید استارت می شود.
 
Socket ها
یک روش کمتر رایج برای logging استفاده از socket هاست. تمامی رویدادهای log بصورت یک فرمت قابل انتقال در شبکه ، به جای دیگر منتقل می شوند. انتهای دیگر سوکت در هر حال یک سرور اختصاصپی logging است تنها هدف آن دریافت و ثبت پیام های log است.

SMTP  و SMS
ارسال log از طریق Email یا SMS(پیام کوتاه)

بانک های اطلاعاتی(DataBase ها)
امروزه برای برنامه ها بسیار رایج است که log های خود را  در یک بانک اطلاعاتی ذخیره سازی کنند.بانک های اطلاعاتی بسیار کارآمد هستند و جستجو و فیلتر داده ها در آنها بسیار آسان است.البته در خصوص بانک های اطلاعاتی با افزایش حجم داده ، عملکرد آنها بسیار افت می کند.
با ورود بانک های اطلاعاتی NOSQL بسیاری از این دست مشکلات حل شده است.رایجترین این نوع بانک اطلاعاتی ، انک اطلاعاتی mongoDB است.

بازدید 567 بار
این مورد را ارزیابی کنید
(1 رای)

نظر دادن

جوملا فارسی