‫مشاهده لاگ NHibernate در Visual Studio

اگر پنجره Output را در ویژوال استودیو به هنگام Debug باز کرده و Show output from را برابر Debug قرار داده باشید می‌بینید که ویژوال استودیو خیلی از فعالیت‌های داخلی برنامه را از جمله Load اسمبلی‌ها یا Exceptionهای برنامه را مدام در آنجا فهرست می‌کند. همین کار را در مورد فعالیت‌های داخلی NHibernate هم می‌توان انجام داد.

NHibernate به طور داخلی از log4net برای log فعالیت‌های داخلی خودش استفاده می‌کند. NHibernate تقریباً تمام کارهایش را log می‌کند. به همین دلیل با دنبال کردن این logها هم می‌توان به بسیاری از اشکالات و ایرادات برنامه‌های مختلف پی برد و هم می‌توان مقدار زیادی از مکانیزم داخلی NHibernate را یاد گرفت. روال معمول برای مشاهده این log ریختن آن در یک فایل text و بررسی آن می‌باشد. اما راه ساده‌تر و موثرتری هم وجود دارد. آن هم این است که به log4net بگوییم خروجی log را به جای فایل text به پنجره Output ویژوال استودیو کپی کند.

برای انجام این کار کافی است بعد از معرفی log4net در web.config یا app.config، خطوط زیر را هم اضافه کنید:



type="log4net.Appender.TraceAppender, log4net">











بعد از انجام این کار بایستی در ابتدای شروع به کار برنامه، log4net را هم با عبارت log4net.Config.XmlConfigurator.Configure();‎ مقدار دهی (initialize) کنید.

البته غیر از این یک راه دیگر هم وجود دارد. در راه دوم یک فایل مستقل برای log4net در نظر گرفته می‌شود به اسم log4net.config. خطوط بالا در این فایل کپی شده (خط اول فایل‌های xml فراموش نشود) و سپس برای راه اندازی اولیه log4net به جای روش قبلی از XmlConfigurator.Configure(new FileInfo(“log4net.config”));‎ استفاده می‌شود.

منبع:
فصل دوم کتاب NHibernate 3.0 Cookbook

log4net: logging NHibernate and my own domain

I was used to use entlib for logging. But as I’m in favour of open source and because I am using NHibernate and Castle ActiveRecord in my applications, decided to use log4net instead. So found a good article about it, and enabled it for my application. But the problem was a very huge log file was producing because of verbose logs from NHibernate.

I’ve been heard that log4net uses hierarchical loggers but did not have a good understanding of it. I was thinking that using hierarchical loggers I can omit NHibernate’s logs and instead show my application’s logs. My bad assumption about hierarchical loggers was that they should be defined in app.config/web.config as nested. Obviously this assumption was wrong. Hierarchical logger in log4net means that you define a root and define all loggers inside it directly. Hierarchy then is understood of “name” attribute of “logger” node. This just acts a C# namespaces. For example you can have “NHibernate” and “NHibernate.SQL”. The second one is a child of the first.

Following guides in this, this, this, this and this link helped me to build my own config that works greatly in my application:

  













type="log4net.Appender.FileAppender">







value="%d [%t] %-5p %c [%x] - %m%n" />
type="log4net.Appender.FileAppender"/>







value="%d [%t] %-5p %c [%x] - %m%n" />