معرفی ELMAH
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: پنج دقیقه


عموما کاربران نمی‌توانند گزارش خطای خوبی را ارائه بدهند و البته انتظاری هم از آنان نیست. تنها گزارشی که از یک کاربر دریافت می‌کنید این است: "برنامه کار نمی‌کنه!" و همین!
روش‌های متعددی برای لاگ کردن خطاهای یک برنامه ASP.Net موجود است؛ چه خودتان آن‌ها را توسعه دهید و یا از ASP.NET health monitoring استفاده کنید.
روش دیگری که این روزها در وبلاگ‌های متعددی در مورد آن مطلب منتشر می‌شود، استفاده از ELMAH است. (البته ELMAH به تازگی منتشر نشده ولی تا کیفیت محصولی به عموم ثابت شود مدتی زمان می‌برد)

ELMAH یک ماژول رایگان و سورس باز لاگ کردن خطاهای مدیریت نشده برنامه‌های ASP.Net‌ است. برای استفاده از این ماژول نیازی نیست تا تغییری در برنامه خود ایجاد کنید یا حتی آن‌را کامپایل مجدد نمائید. یک فایل dll‌ دارد به همراه کمی تغییر در web.config برنامه جهت معرفی آن و این تمام کاری است که برای برپایی آن لازم است صورت گیرد. این ماژول تمامی خطاهای مدیریت نشده‌ی برنامه شما را لاگ کرده (در حافظه سرور، در یک فایل xml ، در یک دیتابیس اس کیوال سرور یا اوراکل ، در یک دیتابیس اکسس و یا در یک دیتابیس اس کیوال لایت) و برای مرور آن‌ها یک صفحه‌ی وب سفارشی یا فیدی مخصوص را نیز در اختیار شما قرار می‌دهد. همچنین این قابلیت را هم دارد که به محض بروز خطایی یک ایمیل را نیز به شما ارسال نماید.

با توجه به این‌که این ماژول در Google code قرار گرفته احتمالا دسترسی به آن مشکل خواهد بود. سورس و فایل‌های کامپایل شده آن‌را از آدرس‌های زیر نیز می‌توان دریافت نمود:
( + و + و +)

نحوه استفاده از ELMAH :

برای استفاده از ELMAH دو کار را باید انجام دهید:
الف) کپی کردن فایل Elmah.dll در پوشه bin برنامه
ب) تنظیم وب کانفیگ برنامه

بهترین مرجع برای آشنایی با نحوه بکار گیری این ماژول، مراجعه به فایل web.config موجود در پوشه samples آن است. بر اساس این فایل نمونه:

- ابتدا باید configSections آن را به وب کانفیگ خود اضافه کنید.

- سپس تگ elmah باید اضافه شود. در این تگ موارد زیر مشخص می‌شوند:
الف) آیا خطاها توسط آدرس elmah.axd توسط کاربران راه دور قابل مشاهده شود یا خیر.
ب) خطاها کجا ذخیره شوند؟ موارد زیر پشتیبانی می‌شوند:
دیتابیس‌های اس کیوال سرور ، اوراکل ، حافظه سرور، فایل‌های xml ، دیتابیس SQLite ، دیتابیس اکسس و یا دیتابیسی از نوع VistaDB
ج) آیا خطاها ایمیل هم بشوند؟ اگر بلی، تگ مربوطه را تنظیم کنید.
د) آیا خطاها به اکانت twitter شما نیز ارسال شوند؟

- در ادامه تگ مربوط به معرفی این httpModules باید تنظیم شود.

- سپس httpHandlers ایی به نام elmah.axd که جهت مرور خطاها می‌توان از آن استفاده نمود معرفی می‌گردد.

- از IIS7 استفاده می‌کنید؟ قسمت system.webServer را نیز باید اضافه نمائید.

- و در آخر نحوه‌ی دسترسی به elmah.axd مشخص می‌شود. اگر اجازه دسترسی از راه دور را داده باشید، به این طریق می‌شود دسترسی را فقط به کاربران مجاز و تعیین اعتبار شده، اعطاء کرد و یا به نقشی مشخص مانند ادمین و غیره.

برای نمونه، اگر بخواهید از دیتابیس SQLite جهت ذخیره سازی خطاهای حاصل شده استفاده نمائید و نیز از ارسال ایمیل صرفنظر کنید، وب کانفیگ برنامه شما باید به شکل زیر تغییر یابد:
<?xml version="1.0"?>

<configuration>
<configSections>
<sectionGroup name="elmah">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
<section name="errorTweet" requirePermission="false" type="Elmah.ErrorTweetSectionHandler, Elmah"/>
</sectionGroup>
</configSections>

<elmah>
<security allowRemoteAccess="1" />
<errorLog type="Elmah.SQLiteErrorLog, Elmah" connectionStringName="cn1" />
</elmah>


<appSettings/>

<connectionStrings>
<add name="cn1" connectionString="data source=~/ErrorsLog/Errors.db" />
</connectionStrings>

<system.web>
<httpModules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
</httpModules>

<httpHandlers>
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>

<compilation debug="true"/>

<authentication mode="Windows" />
</system.web>

</configuration>
در اینجا یک پوشه جدید به نام ErrorsLog را باید به ریشه سایت خود اضافه کنید (یا هر نام دلخواه دیگری که در قسمت connectionStrings باید تنظیم شود). فایل Errors.db به صورت خودکار ایجاد خواهد شد. بدیهی است کاربر ASP.net باید دسترسی write بر روی این پوشه داشته باشد تا عملیات ثبت خطاها با موفقیت صورت گیرد. همچنین فایل System.Data.SQLite.DLL نیز باید در پوشه bin برنامه شما کپی شود.
ساده‌ترین تنظیم این ماژول استفاده از حالت xml است که به ازای هر خطا یک فایل xml را تولید کرده و نیاز به اسمبلی دیگری بجز ماژول مربوطه نخواهد داشت.

تذکر:
از لحاظ امنیتی مثال فوق توصیه نمی‌شود زیرا allowRemoteAccess آن 1 است و قسمت authorization ذکر نشده است. این مثال فقط جهت راه اندازی و آزمایش اولیه ارائه گردیده است. (همچنین بهتر است این نام پیش فرض را به نامی دیگر مثلا myloggermdl.axd تغییر داده و در قسمت httpHandlers تنظیم نمائید. سپس این نام را به تگ location نیز اضافه کنید)

اکنون برای مشاهده خروجی این ماژول به انتهای آدرس سایت خود، elmah.axd را اضافه کرده و سپس enter کنید:



همانطور که در تصویر مشخص است، تمامی خطاهای لاگ شده گزارش داده شده‌اند. همچنین دو نوع فید به همراه امکان دریافت خطاها به صورت CSV نیز موجود است. با کلیک بر روی لینک details ، صفحه‌ی بسیار ارزنده‌ای ارائه می‌شود که تقریبا نحوه‌ی وقوع ماجرا را بازسازی می‌کند.
نکته‌ی مهمی که در صفحه‌ی جزئیات ارائه می‌شود (علاوه بر stack trace‌ و مشخصات کاربر)، مقادیر تمامی فیلدهای یک صفحه هنگام بروز خطا است (قسمت Raw/Source data in XML or in JSON در این صفحه) :



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


نکته:
ماژول SQLite ایی که به همراه مجموعه ELMAH ارائه می‌شود 32 بیتی کامپایل شده (64 بیتی آن نیز موجود است که باید از آن در صورت لزوم استفاده شود). بنابراین برای اینکه در یک سرور 64 بیتی به مشکل برنخورید و خطای BadImageFormat را دریافت نکنید نیاز است تا به این نکته دقت داشت.

برای مطالعه بیشتر:

Error Logging Modules And Handlers
Sending ELMAH Errors Via GMail
Exception-Driven Development
Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components

  • #
    ‫۱۵ سال و ۵ ماه قبل، شنبه ۹ خرداد ۱۳۸۸، ساعت ۱۴:۴۳
    جناب نصیری

    شما واقعا ابزارهای جالب و مفیدی را می‌شناسید. خیلی از آنها کار بنده را راه انداخته است!
  • #
    ‫۱۴ سال و ۲ ماه قبل، جمعه ۲۲ مرداد ۱۳۸۹، ساعت ۱۷:۲۰
    ممنون
    جالب بود
  • #
    ‫۱۴ سال و ۲ ماه قبل، یکشنبه ۲۴ مرداد ۱۳۸۹، ساعت ۱۵:۵۶
    خیلی حال داد ، ممنون
  • #
    ‫۱۴ سال و ۲ ماه قبل، سه‌شنبه ۲۶ مرداد ۱۳۸۹، ساعت ۰۴:۰۰
    سلام
    با تشکر از مطالب جالب و آموزنده شما
    میشه دوباره یه لینک برا دانلود بذارید؟
    لینک قبلی خراب شده
  • #
    ‫۱۴ سال و ۲ ماه قبل، سه‌شنبه ۲۶ مرداد ۱۳۸۹، ساعت ۰۴:۱۵
    http://rapidshare.com/files/412297366/ELMAH-1.1-bin.zip.html
  • #
    ‫۱۴ سال و ۲ ماه قبل، دوشنبه ۸ شهریور ۱۳۸۹، ساعت ۱۸:۵۰
    با سلام ودرود خدمت آقای نصیری:
    elmah معرفی شده یکی از پرکاربردترین و دوست داشتنی ترین مواردی که توسط استاد بنده (آقای مهدی کرامتی) معرفی (ارجاع به وبلاگ شما) و از اینجا مورد استفاده قرار گرفت.
    به نظر در پیاده سازی و عملکرد elmah در پروژه هیچ مشکلی وجود ندارد ...
    اما مشکلی در مورد ارسال ایمیل وجود دارد که خدمتتان عرض می کنم.
    در حالت local‌ایمیل به زیبایی هر چه تمام تر ارسال می شود ...
    اما پس از آپلود سایت در ارسال ایمیل مشکل وجود دارد !
    به نظر شما چگونه باید این مشکل را حل نمایم ؟
    این مشکل به سرور مربوط می شود یا به web.config

    من قسمت نظرات رو هر روز بررسی می کنم تا بلکه پاسخی از طرف شما در یافت نمایم و یا اینکه پاسخ را بدون زحمت به آدرس زیر ایمیل بزنید:
    majid.darab@gmail.com

    با تشکر فراوان از وب لاگ تخصصی حضرتعالی
  • #
    ‫۱۴ سال و ۲ ماه قبل، دوشنبه ۸ شهریور ۱۳۸۹، ساعت ۲۰:۱۱
    سلام
    تمام هاست‌ها برای ارسال ایمیل نیاز به smtp authentication دارند. برای این منظور باید یوزر نیم و پسورد داده شده به شما را در web.config برنامه اضافه کنید که در این مقاله توضیح داده شده است:
    http://www.4guysfromrolla.com/articles/072606-1.aspx
  • #
    ‫۱۴ سال و ۲ ماه قبل، دوشنبه ۸ شهریور ۱۳۸۹، ساعت ۲۰:۴۷
    با تشکر از پاسخگویی شما...
    یعنی authentication زیر که مربوط به تنظیمات خود elmah بود کفایت نمی کند و باید در web.config آئوتنتیکیشن دیگری هم تعریف نمایم:


    من کمی گیج شدم ...

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

    من از داخل کدبیهایند (بدون دست کاری در web.config) هم سیستم ارسال ایمیل رو دارم و این قسمت پس از آپلود به خوبی کار می کند.
    تقریباً مشابه همون عملکردو در مورد elmah تو web.config پیاده سازی کردیم (طبق فرمول بالا)که در local درست و پس از آپلود مشکل دار شد.

    اگر لازم است در web.config کدی اضافه نمایم پس چرا ایمیل داخل کدبیهایند داره به خوبی کار می کنه
  • #
    ‫۱۴ سال و ۲ ماه قبل، دوشنبه ۸ شهریور ۱۳۸۹، ساعت ۲۲:۴۷
    در ASP.NET برای تعریف smtp authentication یا باید از طریق code behind عمل کنید که این حالت نیازی به تعریف همان موارد در web.config ندارد.
    یا این تنظیمات رو مطابق مقاله‌ای که ذکر کردم می‌تونید به web.config انتقال بدید (قسمت system.net -- mailSettings -- smtp -- network) و نیازی به تعریف مجدد آن‌ها در code behind نیست و به صورت سراسری به برنامه اعمال می‌شود. یکی از این دو حالت رو انتخاب کنید.
    در elmah مطابق مقاله https://www.dntips.ir/2010/08/elmah-wcf-ria-services.html باید قسمت errorMail اضافه شود که در آن مقاله البته comment شده که باید comment آن برداشته شود.
    سپس elmah هم چون از همان کدهای متداول دات نتی استفاده می‌کند تنظیمات smtp authentication را که بحث مجزایی است می‌تواند از web.config هم دریافت کند. راه دیگر هم این است که این یوزر نیم و پسورد را در همان تگ errorMail هم مطابق مثال web.config موجود در پوشه samples آن هم می‌شود تعریف کرد. تمام این‌ها یک اثر را دارند و فقط یکی باید اعمال شود.

    ضمنا یک مطلب رو هم به صراحت خدمت شما عرض کنم. تابحال هاستی رو ندیدم که با همان تنظیمات local شما بدون مشکل کار کند. علت هم این است که کسی نتواند از امکانات ارسال ایمیل آن‌ها سوء استفاده کند. بنابراین بر روی هاست حتما نیاز به smtp authentication هست. یا این اطلاعات را باید از هاست بگیرید. یا اگر کنترل پنل ارسال ایمیل هم سایت دارد یک یوزر جدید در آن تعریف کنید و مشخصات آن‌را در برنامه استفاده کنید. در غیر اینصورت آن هاست از لحاظ امنیتی به شدت مشکل دارد و دیر یا زود زیر بار ارسال میلیون‌ها اسپم از پا در خواهد آمد.
  • #
    ‫۱۴ سال و ۲ ماه قبل، دوشنبه ۸ شهریور ۱۳۸۹، ساعت ۲۳:۰۴
    برای تکمیل مبحث هم حتما یکبار فایل web.config موجود در پوشه samples آن را مفصل بررسی کنید و یک سری کامنت دارد که باید بخونید.
    برای مثال اگر هاست شما از IIS7 به بعد استفاده می‌کند قسمت system.webServer فایل web.config شما باید شامل Elmah.ErrorMailModule شود در غیر اینصورت ایمیلی ارسال نخواهد شد.
    این موارد دقیقا در این فایل راهنمای همراه مجموعه موجود است.
  • #
    ‫۱۴ سال و ۲ ماه قبل، دوشنبه ۸ شهریور ۱۳۸۹، ساعت ۲۳:۱۶
    خلاصه بحث ارسال ایمیل:
    - امکان ندارد هاست شما برای ارسال ایمیل نیاز به smtp authentication نداشته باشد (من ندیدم). بنابراین یا این اطلاعات را باید زنگ بزنید و از هاست بگیرید یا در کنترل پنل ایمیل‌های سایت یک یوزر مخصوص را درست کنید تا بشود در برنامه از آن استفاده کرد.
    - سپس تگ errorMail باید دقیقا مقدار دهی شود. آدرس و نام کاربری و غیره. (این موارد مرتبط به ارسال ایمیل است و با نام کاربری مثلا ftp سایت متفاوت می‌باشد)
    - در IIS6 : باید در قسمت system.web -- httpModules ، مطابق مثال web.config پوشه sample کتابخانه، قسمت Elmah.ErrorMailModule را از کامنت خارج کنید.
    - در IIS7 : باید در قسمت system.webServer فایل web.config شما Elmah.ErrorMailModule نیز مطابق مثال یاد شده ، ذکر شده باشد.
  • #
    ‫۱۴ سال و ۲ ماه قبل، سه‌شنبه ۹ شهریور ۱۳۸۹، ساعت ۰۱:۵۰
    از اینکه با صبر و حوصله پاسخگوی مشکل مطرح شده بودید از شما به شدت قدر دانی می کنم و فکر کنم فهمیدم مشکل از کجا بود!
    شما مورد ایمیل را کاملاً‌ مو شکافی کردید و فکر می کنم حق مطلب در مورد آن ادا شده است.
    من تنظیمات الماه را براساس iis سرور 2003 گذاشته بودم (قاعدتاً باید 6 می بود)و الان که ورژن iis رو دیدم ، با تعجب متوجه شدم شده ورژن 76,0.
    حالا اینکه این ورژن 6 یا 7 است با تغییر کانفیگ الماه مشخّص خواهد گردید.

    درود فراوان بر وب لاگ شما
  • #
    ‫۱۴ سال و ۲ ماه قبل، سه‌شنبه ۹ شهریور ۱۳۸۹، ساعت ۰۶:۰۳
    سلام آقای نصیری :
    نزدیک به 2 ساعت هر جور تغییری که بگید در web.config دادم اما نشد که نشد.

    دایماً کامنت ها رو بر می داشتم و دوباره می ذاشتم.

    من به سرور دسترسی remote کامل دارم و از این طریق حالت های مختلف web.config رو بررسی کردم.
    (team viewer)

    من یک ایمیل توسط گوگل ایجاد کردم و از اون برای ارسال ایمیل استفاده می کنم.

    تنها تنظیماتی که انجام دادم در خود تگ error mail الماه بود و بس.

    وقتی پروژه در local کار می کنه ایمیل ارسال میشه ، اما وقتی پابلیش میشه میره رو سرور نمی دونم چرا کار نمی کنه؟

    ویندوز سرور هم 2003 است و ورژن iis اونو زده 76,0

    فایروال سرور هم از کار انداختم و یه بار تست کردم ، اما از ایمیل خبری نشد.

    آیا منظور از autheticate کردن این است که :
    1-
    یا در تگ error mail تنظیمات کانکت شدن به سروری که ایمیل مربوط به آن است را انجام دهیم (شامل user name و پسورد) که دراین مورد gmail مورد نظر می باشد!
    2-
    یا در جای دیگری از وب کافیگ این تعاریف را انجام دهیم که برای کل پروژه عمومیت داشته باشه!
    3-
    یا در کد بیهایند جداگانه برای هر ایمیل زدن انجام دهیم!

    این سوالو برا این پرسیدم چون گفته بودید از هاست خود user name و پسورد بگیرید.
    این user name و پسورد مربوط به چیست ؟
    از آنجا که سروری که من دارم استفاده می کنم تازه راه اندازی شده لذا مفاهیمی به نام mail server یا کنترل پنل برای آن وجود ندارد و فقط یک وب سرور است با یک دامین ثبت شده که به خوبی کار می کند.

    کجای کار می لنگد؟
  • #
    ‫۱۴ سال و ۲ ماه قبل، سه‌شنبه ۹ شهریور ۱۳۸۹، ساعت ۱۳:۵۲
    GMail نیاز به SSL دارد و پورت آن هم متفاوت است. برای تنظیمات مخصوص ELMAH در این مورد ویژه (که بهتر بود از ابتدا به آن اشاره می‌کردید) به مقاله زیر مراجعه کنید:
    http://dotnetslackers.com/ASP_NET/re-205775_Sending_ELMAH_Errors_Via_GMail.aspx
  • #
    ‫۱۲ سال و ۳ ماه قبل، شنبه ۱۰ تیر ۱۳۹۱، ساعت ۱۴:۰۵
    سلام
    آقای نصیری واقعا از مطالب مفیدتون تشکر میکنم
    بی زحمت میشه لینک جدید دانلود elmah رو بذارید؟
    چون لینکها منقضی شدن!
    ممنون
    • #
      ‫۱۲ سال و ۳ ماه قبل، شنبه ۱۰ تیر ۱۳۹۱، ساعت ۱۴:۱۴
      نیازی نیست. به سادگی و بدون مشکل بسته بودن سورس اصلی، از NuGet استفاده کنید:
      http://nuget.org/packages/elmah  
  • #
    ‫۱۲ سال و ۳ ماه قبل، یکشنبه ۱۱ تیر ۱۳۹۱، ساعت ۰۲:۱۶
    خیلی ممنون استاد عالی بود فقط دو سوال :
    1- آیا امکان داره ظاهر errorLogی که ایمیل میشود را تغییر داد تا خوانا‌تر شود؟
    2-برای امنیت بیشتر امکان Hash کردن UserName و Password مربوط SMTP وجود دارد؟
  • #
    ‫۱۲ سال و ۱ ماه قبل، دوشنبه ۲۰ شهریور ۱۳۹۱، ساعت ۱۷:۱۲
    سلام
    آیا ابزاری مشابه برای winforms هم وجود داره؟
    • #
      ‫۱۲ سال و ۱ ماه قبل، دوشنبه ۲۰ شهریور ۱۳۹۱، ساعت ۱۷:۳۶
      این دو مطلب را با هم ترکیب کنید تا به نمونه مشابهی در Winforms و WPF برسید:
      (^) و (^ )
  • #
    ‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۲۳ مهر ۱۳۹۱، ساعت ۱۵:۵۱
    آقای نصیری آیا باید این تگ حتما true باشه؟
     <compilation debug="true"/>

    این قضیه باعث پایین آمدن راندمان وب سایت ما نمیشه. چون وقتی میزارم روی false دیگه اطلاعات دقیق خطا رو میل نمیکنه برام؟
    • #
      ‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۲۳ مهر ۱۳۹۱، ساعت ۱۶:۱۶
      خیر. در زمان ارائه نهایی نباید به این ترتیب عمل شود. در مورد دریافت جزئیات بیشتر در حالت release به مقاله لینک داده شده مراجعه کنید.
      • #
        ‫۱۱ سال و ۱۲ ماه قبل، یکشنبه ۲۳ مهر ۱۳۹۱، ساعت ۲۰:۰۱
        ممنون؛
        به نظر میادروشی که گفتید تو وب فرم جواب نمیده. جون من اون release رو پیدا نکردم. من میخام زمانی که <compilation debug="false"/> هستش شماره خطا و جزئیاتش هم برام میل بشه. آیا امکانش هست؟
        • #
          ‫۱۱ سال و ۱۲ ماه قبل، دوشنبه ۲۴ مهر ۱۳۹۱، ساعت ۱۵:۵۸
          خلاصه مطلب ذکر شده این است: در حالت release، باید فایل pdb متناظر با dll پروژه شما در کنارش باشد تا شماره خط متناظر با استثنای رخ داده شده، قابل لاگ کردن باشد.