freeman99
یک شنبه 17 اسفند 1393, 23:36 عصر
میدونید که لاگ کردن خطاها و حتی هشدارها در فایل یا دیتابیس مهمه، چون ادمین میتونه اونا رو بررسی کنه و ببینه چه خطاها و هشدارهایی رخ دادن و علت رو پیگیری و رفع کنه (شاید باگی در برنامه باشه، شاید کسی میخواسته به سیستم حمله کنه، و غیره).
ولی نمیدونم چند درصد برنامه نویسان برنامه هاشون سیستم لاگ خطا داره :متفکر:
نکته: از این ببعد هرگاه بطور کلی از «خطا» صحبت میکنیم در مواقع منظورمون بطور کلی هرگونه اطلاعات غیرعادی درمورد کارکرد سیستم است، یعنی علاوه بر خطاها، هشدارها (Warning) و آگهی ها (Notice) هم منظور ما هستن.
البته دو نوع خطا داریم؛ یکی خطاهایی که خود PHP متوجه میشه و صادر میکنه و دیگر خطاهایی که مختص خود برنامه هستن و به PHP ربطی ندارن و لزوما موجب متوجه شدن و خطا دادن توسط PHP نمیشن. مثلا یک دیتایی به سیستمی در برنامه میرسه که مطابق فرمت قابل قبول برای اون سیستم نیست (دقت کنید که این دیتاها میتونن مستقیما توسط کاربران هم تولید نشده باشن و مربوط به منطق و کارکردهای داخلی خود برنامه هم باشن)، و سیستم اگر درست و امن طراحی شده باشه ممکنه درصورت صلاحدید و محتمل و لازم دیده شدن از جانب برنامه نویس، اول این فرمت رو چک کنه و اگر نادرست باشه متوجه میشه و میتونه لاگ کنه. میگم درصورت صلاحدید و محتمل و لازم دیدن، چون معمولا تمام داده ها و جریانات در برنامه لازم نیست یا نمیشه که تحت بررسی گسترده قرار داد، و بیشتر در بعضی موارد خاص هست که احتمال پیدایش باگ یا مشکلات امنیتی در اونها میره و بنابراین اون موارد از منطق و جریان داخلی برنامه چک میشن. البته سطح چک های برنامه و دقت و مفصل و محکم کار بودن اون در این زمینه به پارامترهای متعدد دیگری هم بستگی داره (ولی بهرحال بازم مثلا دیگه نمیایم هرجا یه متغییر و داده های داخلی خود برنامه رو مدام چک بکنیم که!).
میدونید که صرف نمایش خطاها در مرورگر کافی نیست، چون اولا طبیعتا تمام خطاها در حضور مسئول سیستم تولید نمیشن که بتونه متوجه بشه و علت رو پیدا و رفع کنه، دوما به دلایل امنیتی و غیره معمولا روی سیستمهای عملیاتی (و نه آزمایشی و تحت توسعه و تست) نمایش خطاها در مرورگر رو خاموش یا محدود میکنن چون این خطاها نباید به کاربران عادی و سوء استفاده کنندگان یا نفوذگران/هکرهای احتمالی ارسال بشن.
بنابراین بنظر میرسه لازمهء هر سیستم اصولی داشتن یک سیستم لاگ خطاست.
حالا میخواستم از تجربیات و اطلاعات شما در این زمینه استفاده کنم و ایده ها و نکاتی رو که در این مورد میدونید یا بنظرتون میرسه بگید.
من فعلا در مراحل اولیهء تحقیق به این چند دستور ساده رسیدم:
ini_set("log_errors", 1);
ini_set("error_log", "path/error.log");
دستور اول سیستم لاگ خطای درونی php رو فعال میکنه و دستور دوم فایل مورد نظر که خطاها در اون نوشته میشن رو مشخص میکنه.
حالا در همین قدم اول بنظر من رسید که فایل مورد نظر رو کجا ذخیره کنیم و طبیعتا نکات امنیتیش مثل اینکه دسترسی مستقیم از طریق وب بهش نباشه (که البته جواب اینا و روش حل کردنشون نسبتا ساده و روشن بنظر میرسه)، و اما دیگر اینکه ممکنه پرمیشن فایلها و دایرکتوری ها طوری باشه که بصورت پیشفرض php نتونه در این فایل بنویسه و بخاطر همین به فکر افتادم که شاید اگر یک سیستمی درست کنیم و این خطاها رو بجای فایل در دیتابیس ذخیره کنیم از نظر کمتر شدن مشکلات و کاهش نیاز به دخالت دستی و تغییر کانفیگ ها بهتر باشه. هرچند شاید همون فایل بهتر باشه چون بهرحال خیلی ساده تره و شاید برای برای چنین هدف ساده و پشت پرده ای که مستقیما به کارکرد برنامه و تجربهء کاربری مربوط نمیشه ما نمیخوایم زیاد کار کنیم.
تا اینجا این درمورد خطاهای در سطح php که اولویت و قدم اول در توسعه و تست و نگهداری هر برنامه ایه.
اما درمورد خطاهای در سطح خود اپلیکیشن (برنامهء خودمون)، یه راه ساده فکر میکنم این باشه که خطاهای خود برنامه رو هم توسط تابع error_log به لاگ خطای php بفرستیم (البته طبیعتا با فرمتی که در لاگ خطا از خطاهای php براحتی قابل تمیز باشه).
راستی سیستم لاگ خطا میتونه موقع روی دادن خطاها برای ادمین یا مسئول سیستم ایمیل اطلاع رسانی هم بفرسته یا حتی SMS بفرسته. البته لزوما این کار رو برای همه نوع و همه سطح از خطاها و هشدارها انجام نمیدیم، بخصوص که ممکنه منجر به ارسال تعداد بیش از حد پیام و ایجاد آزار و مشکل بشه.
منتظر نظرات و تجربیات شما هستم :چشمک:
ولی نمیدونم چند درصد برنامه نویسان برنامه هاشون سیستم لاگ خطا داره :متفکر:
نکته: از این ببعد هرگاه بطور کلی از «خطا» صحبت میکنیم در مواقع منظورمون بطور کلی هرگونه اطلاعات غیرعادی درمورد کارکرد سیستم است، یعنی علاوه بر خطاها، هشدارها (Warning) و آگهی ها (Notice) هم منظور ما هستن.
البته دو نوع خطا داریم؛ یکی خطاهایی که خود PHP متوجه میشه و صادر میکنه و دیگر خطاهایی که مختص خود برنامه هستن و به PHP ربطی ندارن و لزوما موجب متوجه شدن و خطا دادن توسط PHP نمیشن. مثلا یک دیتایی به سیستمی در برنامه میرسه که مطابق فرمت قابل قبول برای اون سیستم نیست (دقت کنید که این دیتاها میتونن مستقیما توسط کاربران هم تولید نشده باشن و مربوط به منطق و کارکردهای داخلی خود برنامه هم باشن)، و سیستم اگر درست و امن طراحی شده باشه ممکنه درصورت صلاحدید و محتمل و لازم دیده شدن از جانب برنامه نویس، اول این فرمت رو چک کنه و اگر نادرست باشه متوجه میشه و میتونه لاگ کنه. میگم درصورت صلاحدید و محتمل و لازم دیدن، چون معمولا تمام داده ها و جریانات در برنامه لازم نیست یا نمیشه که تحت بررسی گسترده قرار داد، و بیشتر در بعضی موارد خاص هست که احتمال پیدایش باگ یا مشکلات امنیتی در اونها میره و بنابراین اون موارد از منطق و جریان داخلی برنامه چک میشن. البته سطح چک های برنامه و دقت و مفصل و محکم کار بودن اون در این زمینه به پارامترهای متعدد دیگری هم بستگی داره (ولی بهرحال بازم مثلا دیگه نمیایم هرجا یه متغییر و داده های داخلی خود برنامه رو مدام چک بکنیم که!).
میدونید که صرف نمایش خطاها در مرورگر کافی نیست، چون اولا طبیعتا تمام خطاها در حضور مسئول سیستم تولید نمیشن که بتونه متوجه بشه و علت رو پیدا و رفع کنه، دوما به دلایل امنیتی و غیره معمولا روی سیستمهای عملیاتی (و نه آزمایشی و تحت توسعه و تست) نمایش خطاها در مرورگر رو خاموش یا محدود میکنن چون این خطاها نباید به کاربران عادی و سوء استفاده کنندگان یا نفوذگران/هکرهای احتمالی ارسال بشن.
بنابراین بنظر میرسه لازمهء هر سیستم اصولی داشتن یک سیستم لاگ خطاست.
حالا میخواستم از تجربیات و اطلاعات شما در این زمینه استفاده کنم و ایده ها و نکاتی رو که در این مورد میدونید یا بنظرتون میرسه بگید.
من فعلا در مراحل اولیهء تحقیق به این چند دستور ساده رسیدم:
ini_set("log_errors", 1);
ini_set("error_log", "path/error.log");
دستور اول سیستم لاگ خطای درونی php رو فعال میکنه و دستور دوم فایل مورد نظر که خطاها در اون نوشته میشن رو مشخص میکنه.
حالا در همین قدم اول بنظر من رسید که فایل مورد نظر رو کجا ذخیره کنیم و طبیعتا نکات امنیتیش مثل اینکه دسترسی مستقیم از طریق وب بهش نباشه (که البته جواب اینا و روش حل کردنشون نسبتا ساده و روشن بنظر میرسه)، و اما دیگر اینکه ممکنه پرمیشن فایلها و دایرکتوری ها طوری باشه که بصورت پیشفرض php نتونه در این فایل بنویسه و بخاطر همین به فکر افتادم که شاید اگر یک سیستمی درست کنیم و این خطاها رو بجای فایل در دیتابیس ذخیره کنیم از نظر کمتر شدن مشکلات و کاهش نیاز به دخالت دستی و تغییر کانفیگ ها بهتر باشه. هرچند شاید همون فایل بهتر باشه چون بهرحال خیلی ساده تره و شاید برای برای چنین هدف ساده و پشت پرده ای که مستقیما به کارکرد برنامه و تجربهء کاربری مربوط نمیشه ما نمیخوایم زیاد کار کنیم.
تا اینجا این درمورد خطاهای در سطح php که اولویت و قدم اول در توسعه و تست و نگهداری هر برنامه ایه.
اما درمورد خطاهای در سطح خود اپلیکیشن (برنامهء خودمون)، یه راه ساده فکر میکنم این باشه که خطاهای خود برنامه رو هم توسط تابع error_log به لاگ خطای php بفرستیم (البته طبیعتا با فرمتی که در لاگ خطا از خطاهای php براحتی قابل تمیز باشه).
راستی سیستم لاگ خطا میتونه موقع روی دادن خطاها برای ادمین یا مسئول سیستم ایمیل اطلاع رسانی هم بفرسته یا حتی SMS بفرسته. البته لزوما این کار رو برای همه نوع و همه سطح از خطاها و هشدارها انجام نمیدیم، بخصوص که ممکنه منجر به ارسال تعداد بیش از حد پیام و ایجاد آزار و مشکل بشه.
منتظر نظرات و تجربیات شما هستم :چشمک: