آموزش Log4net

پنجشنبه 13 اسفند 1394

در این مقاله قصد داریم در مورد log4net توضیح دهیم و در مورد تنظیمات و پیکربندی آن توضیحاتی را قرار دهیم، یکی از بزرگترین ابزارهای لاگ کردن برای microsoft.net است، که چطور باید لاگ های خودمون را تولید و نگه داری نماییم.این کار بسیار ساده قدرت مند و قابل توسعه است.

آموزش Log4net

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

Log4net سه بخش دارد پیکربندی، راه اندازی و پاسخ

تنظیمات معمولا در app.config و web.config انجام خواهد شد.

ورود به سطح سیستم :

هفت سطح ورود به سیستم داریم، که 5 تا از آن ها داخل کد وجود دارد که به شرح زیر است:

1-off(هیچ چیز وارد سیستم نمی شود)

2-FATAL

3-ERROR

4-WARN

5-INFO

6-DEBUG

7-ALL

پیکربندی تنظیمات:

روش استاندارد برای راه اندازی log4net استفاده از فایل app.config در ویندوز و استفاده از فایل web.config در وب است، برای راه اندازی log4net باید تنظیمات اندکی در فایل config به ترتیب قرار دهید این تنظیمات به log4net می گوید که چگونه خود را پیکربندی کنید برای تغییراتی که بعدا در این تنظیمات انجام می دهید نیازی به کامپایل برنامه خود ندارید.

Root:

در اولین قدم برای Config، جهت قرار دادن تنظیمات لاگر به یک Root Section نیاز دارید. اینها تنظیماتی هستند که لاگر های دیگر از لاگر Root به ارث میبرند. یکی از تنظیماتی که در Root Section قرار می گیرد ، حداقل سطح لاگ گیری است. از آنجا که همه چیز از Root به ارث برده می شود ، هیچ Appernderی هیچ پیامی را زیر حداقل سطح تعیین شده لاگ نخواهد کرد. این راه بسیار ساده ای برای کنترل سریع سطح لاگ گیری در برنامه نرم افزار ما است. در مثال زیر مقدار پیشفرض INFO در نظر گرفته شده ( به این معنا که پیام های DEBUG لاگ نخواهند شد ) و ارجاع لاگ ها به دو Appender که یکی لاگ ها را درون فایل ذخیره سازی میکند و دیگری برروی پنجره نمایش Console نمایش میدهد .

<root>
  <level value="INFO"/>
  <appender-ref ref="FileAppender"/>
  <appender-ref ref="ConsoleAppender" />
</root>

Additional Loggers:

گاهی اوقات نیاز هست که از تکه ای از برنامه به صورت مجزا لاگ بگیریم، log4net این مورد را از قبل پیش بینی کرده و به شما اجازه می دهد فراتر از Root Logger چندین Additional Logger تعریف کنید .

برای مثال در config زیر ما یک Addtional داریم که log های کلاس other class را درون console برای ما لاگ می کند.

<logger name="Log4NetTest.OtherClass">
  <level value="DEBUG"/>
  <appender-ref ref="ConsoleAppender"/>
</logger>

:ConfigSections

برای پیکربندی معمولا اطلاعات بیشتری ذخیره خواهد شد، برای همین برای مشخص کردن log4net باید یک بخش جداگانه ای به نام log4net داخل فایل پیکربندی قرار دهید.

در اینجا یک بخش که اطلاعات پیکربندی تحت تگ log4net است به صورت xml ذخیره شده است.

<configSections>
  <section name="log4net" 
    type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>

Appender (General)

Appender که در آن اطلاعات ثبت می شود، نحوه ی چگونگی ثبت اطلاعات و تحت چه شرایطی ثبت خواهد شد هم در این بخش مشخص می شود.

در زیر یک appender مثال زده شده است که اولین نام appender و دومی نوع appender را مشخص می کند.

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">

Layout:

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

یکی دیگر از راه های استفاده از layout  این است که چگونه اطلاعات شما نوشته شده است و به مخزن داده شده است، اگر شما می خواهید نوع طرح الگو را مشخص کنید شما از یک زیر تگ برای تبدیل یک الگوی مشخص نیاز دارید.

در زیر یک مثال برای استفاده از layout با طرح یک الگوی مشخص است:

<layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger [%ndc] 
    - %message%newline"/>
    </layout>

الگوهای تبدیل:

همان طور که در بالا گفته شد از الگوی تبدیل برای وارد کردن الگوی layout استفاده می شود، این کار برای ذخیره شدن اطلاعات استفاده می شود.

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

لیست کامل به صورت زیر خواهد بود:
date%:خروجی از تاریخ با استفاده از اطلاعات منطقه زمانی این تاریخ را می توان با استفاده از یک آکولاد و یک الگوی مانند فرمت تاریخ استفاده خواهد شد.

برای استفاده از تاریخ برای عملکرد بهتر از یکی از  فرمت های تاریخ  log4net بهتر است استفاده نمایید.

utcdate%:این هم مثل بالا برای نمایش زمان و تاریخ استفاده خواهد شد.

exception%:اگر در کدهای خود خط به خط اجرا شد و هیچ exception ای انداخته نشد، پس به خط بعدی خواهد رفت در غیر این صورت اگر exception ای پاس داده شد پس به خط های بعدی نخواهد رفت.

level%:برای مشخص کردن رویداد(اشکال زدایی، اطلاعات و هشدار و ...) مشخص می کنند.

message%:شما را به رویداد log پاس می دهد.

newline%:این یک ورودی خط جدید است.

timestamp%: تعداد میلی ثانیه برای  زمان شروع برنامه است.

thread%:نام موضوع را که ساخته شده بود مشخص می نماید.

فراتر از موارد بالا هم است که مفید است ولی باید با احتیاط از آن استفاده شود.

که فهرست به صورت زیر خواهد بود:

identity%:نام کاربری از کاربر فعلی با استفاده از روش principal.identity.Name است.

location%:برای زمان اشکال زدایی استفاده خواهد شد برای زمانی که می خواهید یک خط را اشکال زدایی نمایید.

line%:تعداد خط از زمان ورود را نمایش خواهد داد.

method%:این روش خواستار ورود به سیستم است.

username%:این خروجی مقدار ورودی ویندوز هویت است.

Filters

فیلتر ها بخش بسیار مهم دیگری از هر appender هستند با استفاده از یک فیلتر شما می توانید مشخص کنید کدام سطح لاگ شود و یا حتی تعیین می کند تنها در صورت وجود کلمه ای خاص درون message لاگ شود، فیلترها می توانند با یک دیگر ترکیب یا جفت شوند اما شما باید در انجام این کار احتیاط کنید زمانی که یک message با شرایط یک فیلتر جور می شود لاگ شده و پردازش آن فیلتر تمام می شود اگر شما در حال ساخت یک فیلتر ترکیبی هستید به ترتیب آن توجه کنید زیرا ترتیب آن ها مهم است و فیلتر بر روی یک message به ترتیب اعمال می شود.

StringMatchFilter

 با استفاده از string match filter  در صورت وجود يك كلمه كليدي درون اطلاعاتي كه در حال لاگ شدن هستند ، لاگ انجام مي شود. شما مي توانيد از چند String match filter بصورت تركيبي استفاده كنيد. در این شرایط فیلترها با هم Or خواهند شد. تا زمانی که شرایط یکی از فیلترها با اطلاعات لاگ برقرار شود، فیلتر به ترتیب کلمات را بررسی میکند. نكته مهم اين است اگر لاگ با فیلتر تطبيق نداشت و كلمه در لاگ پيدا نشد آن لاگ به فيلتر بعدي ارسال مي شود و در آخر هم اگر با فيلتر آخر هم تطبيق نداشت باز هم از رده خارج نمي شود و لاگ خواهد شد مگر اينكه در انتهاي تمام فيلتر ها از deny all filter استفاده كنيم تا اگر اطلاعات با هيچكدام از فيلترها تطبيق نداشت از لاگ شدن آن جلوگيري شود. در ادامه Deny All Filter بيشتر شرح خواهيم داد. در زير مثالي از String Match Filter وجود دارد :

<filter type="log4net.Filter.StringMatchFilter">
  <stringToMatch value="test" />
</filter>

LevelRangeFilter

این فیلتر تنها ورودی که داخل محدوده مشخص هستند را وارد می کنند.

این محدوده فراگیر است، رویداد ها با سطحی از اطلاعات هشدار می دهد، خطا و یا fatal اما رویداد های debug نادیده گرفته می شود.

<filter type="log4net.Filter.LevelRangeFilter">
  <levelMin value="INFO" />
  <levelMax value="FATAL" />
</filter>
LevelMatchFilter

این فیلتر برای مطابقت سطح کار می کند که مشخص کنند یک سطح است به صورت زیر:

<filter type="log4net.Filter.LevelMatchFilter">
  <levelToMatch value="ERROR"/>
</filter>
DenyAllFilter

اگر وارد نشده باشید احتمالا اطمینان حاصل می شود که appender شما کار نمی کند ، تنها هدف از این مطلب این است که باید حتما ورود به سیستم ساخته شده باشد.

بدون ورود امکان پذیر نخواهد بود

<filter type="log4net.Filter.DenyAllFilter" />

Appenders

در سایت log4net شما می توانید به صورت آنلاین از آن ها استفاده نمایید و لی ما در زیر 3 مورد را که مورد استفاده است نام برده و توضیح می دهیم:

Console Appender:

اگر شما از console appender استفاده نمایید این فیلتر خاص خروجی یک مقدار مانند "2010-12-26 15: 41: 03،581 [10] را هشدار می دهد Log4NetTest.frmMain یک تست هشدار است که آن را در یک خط جدید ارسال می نماید.

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{ABSOLUTE} 
    [%thread] %level %logger - %message%newline"/>
  </layout>
  <filter type="log4net.Filter.StringMatchFilter">
    <stringToMatch value="test" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

File Appender:

این appender یک فایل متنی را ارسال خواهد کرد، در اینجا شما یک فایل را با پسوند logfile.txt ذخیره می نمایید

و این فایل قابل استفاده برای appender های متعدد است، به صورت زیر:

<appender name="FileAppender" type="log4net.Appender.FileAppender">
  <file value="mylogfile.txt" />
  <appendToFile value="true" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
  </layout>
  <filter type="log4net.Filter.LevelRangeFilter">
    <levelMin value="INFO" />
    <levelMax value="FATAL" />
  </filter>
</appender>

Rolling File Appender

این appender که باید در محل از appender به فایل هر زمان که ممکن است مورد استفاده قرار گیرد، در این مثال یک روش مشابه برای ورود به سیستم با استفاده از فایل appender بالا است.

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="mylogfile.txt" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="5" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
  </layout>
</appender>

ADO.NET Appender

در اینجا یک مثال از این نمونه برای شما زده ایم که می توانید فقط در مورد هر پایگاه داده ای که می خواهید از این الگو استفاده نمایید، توجه نمایید که نوع اتصال رشته اساسا مهم است، commandtext یک الگوی بسیار مهم است که شما می توانید هر کوئری مهم را روی آن اعمال نمایید، توجه داشته باشید که هر متغییری که در زیر تعریف شده است تصویری از متغییر log4net است، برای محدود کردن اطلاعات قرار داده شده به پارامتر این appender به یک کپی مستقیم از مثال log4net نیاز است، اگر appemder ado.net شما کار نمی کند، باید مقدار buffersize را چک نماییداین مقدار شامل تعدادی از statement هایی که وارد سیستم log4net می شوند، که قبل از نوشتن همه ی این ها در پایگاه داده cash خواهد شد.

به عنوان مثال سایت log4net دارای bufferesize 100 است، که برای کاربر خسته کننده خواهد بود و علاوه بر آن در زمان تست هم چیزی کار نمی کند.

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
  <bufferSize value="100" />
  <connectionType value="System.Data.SqlClient.SqlConnection, 
   System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionString value="data source=[database server];
    initial catalog=[database name];integrated security=false;
    persist security info=True;User ID=[user];Password=[password]" />
  <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],
    [Message],[Exception]) VALUES (@log_date, @thread, @log_level, 
    @logger, @message, @exception)" />
  <parameter>
    <parameterName value="@log_date" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
  </parameter>
  <parameter>
    <parameterName value="@thread" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%thread" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@log_level" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%level" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@logger" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%logger" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@message" />
    <dbType value="String" />
    <size value="4000" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%message" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@exception" />
    <dbType value="String" />
    <size value="2000" />
    <layout type="log4net.Layout.ExceptionLayout" />
  </parameter>
</appender>

هنگامی که dll log4net به عنوان یک مرجع در برنامه ی خود استفاده می نمایید، 3 خط کد لازم دارید یکی اولین بار وارد شدن که باید در خارج از کلاس آن را قرار دهید، که معمولادر program.cs آن را قرار می دهند

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

کد بعدی که یک بار در هر کلاس نوشته می شود، که با استفاده از system.reflection تمام اطلاعات کلاس جاری را پیدا می نماییم، و اطلاعات خاص آن به کلاس ها منتقل می شود. این کد ایجاد یک متغییر به نام log که با استفاده از متد log4net انجام می شود.

private static readonly log4net.ILog log = log4net.LogManager.GetLogger
    (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

قطعه کد نهایی صدا زدن واقعی برای ورود برخی از قطعه اطلاعات است.

log.Info("Info logging");

توجه داشته باشید که شما می توانید در پایین کد خود یک پارامتر اختیاری که شامل یک exception است وارد نمایید

اگر می خواهید استفاده نمایید از کد زیر استفاده کنید:

log.Error("This is my error", ex);

ex شی استثنا است، به یاد داشته باشید شما نیاز به استفاده از الگوی %exception در  appender هستید.

Logging Extra Data

اگر شما بخواهید یک فیلدی را با استفاده از ado.net appender از نام کاربری به جای یک جمله در قسمت پیام استفاده کنید، یک الگوی تطبیق وجود دارد که منطبق با نام کاربری نرم افزار وجود ندارد، شما می توانید برای ذخیره ی اطلاعات مختلف از کلاس contex استفاده نمایید.

log4net.GlobalContext.Properties["testProperty"] = "This is my test property information";

در کد بالا شما از یک textproperty استفاده نمایید که تا حالا از آن استفاده نشده است.

فایل appconfig/webconfig

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

[assembly: log4net.Config.XmlConfigurator(ConfigFile = 
                "MyStandardLog4Net.config", Watch = true)]

بهتر است برای استفاده از فایل از پسوند configfileextention به جای configfile استفاده نمایید، اگر شما می خواهید از فایل ها استفاده نمایید شما باید داخل فایل پیکربندی خود نام اسمبلی خود از جمله پسوند آن را هم قرار دهید.

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "mylogger", Watch = true)]

در مثال بالا اگر برنامه ما test.exe بود، بعد از تنظیم فایل log4net باید به این گونه بنویسید:test.exe.log4nrt

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 3k بازدید
  • 9 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید