۱۳۸۸/۰۷/۲۶

آشنايي با NHibernate - قسمت نهم


استفاده از Log4Net جهت ثبت خروجي‌هاي SQL حاصل از NHibernate

هنگام استفاده از NHibernate، پس از افزودن ارجاعات لازم به اسمبلي‌هاي مورد نياز آن به برنامه، يكي از اسمبلي‌هايي كه به پوشه build برنامه به صورت خودكار كپي مي‌شود، فايل log4net.dll است (حتي اگر ارجاعي را به آن اضافه نكرده باشيم) كه جهت ثبت وقايع مرتبط با NHibernate مورد استفاده قرار مي‌گيرد. خوب اگر مجبوريم كه اين وابستگي كتابخانه NHibernate را نيز در پروژه‌هاي خود داشته باشيم، چرا از آن استفاده نكنيم؟!
شرح مفصل استفاده از اين كتابخانه سورس باز را در سايت اصلي آن مي‌توان مشاهده كرد:


براي اينكه از اين كتابخانه در برنامه خود جهت ثبت عبارات SQL توليدي توسط NHibernate استفاده كنيم، بايد مراحل زير طي شوند:
الف) ارجاعي را به اسمبلي log4net.dll اضافه نمائيد (كنار اسمبلي NHibernate در پوشه build برنامه بايد موجود باشد)
ب) فايل app.config برنامه را (برنامه ويندوزي) به صورت زير ويرايش كرده و چند سطر مربوطه را اضافه نمائيد (در مورد برنامه‌هاي وب هم به همين شكل است. configSections فايل web.config تنظيم شده و سپس تنظيمات log4net را قبل از بسته شدن تگ configuration اضافه نمائيد ) :

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>

<connectionStrings>
<!--NHSessionManager-->
<add name="DbConnectionString"
connectionString="Data Source=(local);Initial Catalog=HelloNHibernate;Integrated Security = true"/>
</connectionStrings>

<log4net>
<appender name="rollingFile"
type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="NHibernate_Log.txt" />
<param name="AppendToFile" value="true" />
<param name="DatePattern" value="yyyy.MM.dd" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="500KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<conversionPattern value="%d %p %m%n" />
</layout>
</appender>
<logger name="NHibernate.SQL">
<level value="ALL" />
<appender-ref ref="rollingFile" />
</logger>
</log4net>

</configuration>
ج) سپس بايد فراخواني زير نيز در ابتداي كار برنامه صورت گيرد:

log4net.Config.XmlConfigurator.Configure();
در يك برنامه ASP.Net اين فراخواني بايد در Application_Start فايل Global.asax.cs صورت گيرد.
يا در يك برنامه از نوع WinForms تنها كافي است سطر زير را به فايل AssemblyInfo.cs برنامه اضافه كرد:

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
يا اين سطر را به فايل Global.asax.cs يك برنامه ASP.Net نيز مي‌توان اضافه كرد. Watch=true آن، با كمك FileSystemWatcher تغييرات فايل كانفيگ را تحت نظر داشته و هر بار كه تغيير كند بلافاصله، تغييرات جديد را اعمال خواهد كرد.

د) هنگام استفاده از كتابخانه Fluent NHibernate حتما بايد متد ShowSql در جايي كه ديتابيس برنامه را تنظيم مي‌كنيم (Fluently.Configure().Database) ذكر گردد (كه نمونه آن‌را در مثال‌هاي قسمت‌هاي قبل ملاحظه‌ كرده‌ايد).

توضيحاتي در مورد تنظيمات فوق:
configSections حتما بايد در ابتداي فايل app.config‌ ذكر شود و گرنه برنامه كار نخواهد كرد.
سپس كانكشن استرينگ مورد استفاده در قسمت كانفيگ برنامه ذكر شده است.
در ادامه تنظيمات استاندارد مربوط به log4net را مشاهده مي‌كنيد.
در تنظيمات اين كتابخانه، appender مشخص كننده محل ثبت وقايع است. زمانيكه كه از RollingFileAppender استفاده كنيم، اطلاعات را در يك سري فايل ذخيره خواهد كرد (امكان ثبت وقايع در EventLog ويندوز، ارسال از طريق ايميل و غيره نيز ميسر است كه جهت توضيحات بيشتر مي‌توان به مستندات آن رجوع نمود).
سپس نام فايلي كه اطلاعات وقايع در آن ثبت خواهند شد ذكر شده است (براي مثال NHibernate_Log.txt)، در ادامه مشخص گرديده كه اطلاعات بايد هر بار به اين فايل Append و اضافه شوند. سطرهاي بعدي مشخص مي‌كنند كه هر زمانيكه اين لاگ فايل به 10 مگابايت رسيد، يك فايل جديد توليد كن و هر بار 10 فايل آخر را نگه دار و مابقي فايل‌هاي قديمي را حذف كن.
در قسمت PatternLayout مشخصات مي‌كنيم كه خروجي ثبت شده با چه فرمتي باشد. براي مثال يك سطر خروجي مطابق با تنظيمات فوق به شكل زير خواهد بود:

2009-10-18 20:03:54,187 DEBUG INSERT INTO [Student] (Name) VALUES (@p0); select SCOPE_IDENTITY();@p0 = 'Vahid'
در قسمت Logger يك نام دلخواه ذكر شده و ميزان اطلاعاتي كه بايد درج شود، از طريق مقدار level مورد نظر، قابل تنظيم است كه مي‌تواند يكي از مقادير ALL ،DEBUG ،INFO ،WARN ،ERROR ،FATAL و يا OFF باشد. اينجا level در نظر گرفته شده ALL است كه تمامي اطلاعات مرتبط با اعمال پشت صحنه NHibernate را لاگ خواهد كرد.
توسط appender-ref آن appender ايي را كه در ابتداي كار تعريف و تنظيم كرديم، مشخص خواهيم كرد.

اگر هم با برنامه نويسي بخواهيم اطلاعاتي را به اين لاگ فايل اضافه كنيم تنها كافي است بنويسيم:

log4net.LogManager.GetLogger("NHibernate.SQL").Info("test1");

اطلاعات بيشتر

ادامه دارد ...