Sunday, August 31, 2014

Logging SQL statements generated by NHibernate

Log4Net can be configured to log the SQL statements generated by NHibernate. A couple of configuration approaches as below can be followed.
I.  Use one single config file eg. App.config (or web.config) can be used to configure both NHibernate as well as log4net.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
    <section name="log4net"      type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
 
<!-- 
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it 
for your own use before compile tests in VisualStudio.
-->
  <!-- This is the ByteFX.Data.dll provider for MySql -->
  <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
    <session-factory name="NHibernate.Test">
      <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
      <property name="connection.connection_string">
        server=127.0.0.1;uid=root;pwd=********;database=test;Allow Zero Datetime=true;
      </property>
      <property name="dialect">NHibernate.Dialect.MySQLDialect</property>
      <property name="show_sql">true</property>
    </session-factory>
  </hibernate-configuration>
 
  <!-- This section contains the log4net configuration settings -->
  <log4net debug="true">
    <!-- Define some output appenders -->
    <!--appender name="trace"          type="log4net.Appender.TraceAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"             value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
      </layout>
    </appender-->
    <appender name="console"          type="log4net.Appender.ConsoleAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"             value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
      </layout>
    </appender>
    <appender name="SQLLogFile"          type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="logs/log-sql.txt" />
      <param name="AppendToFile" value="false" />
      <param name="RollingStyle" value="Date" />
      <param name="DatePattern" value="yyyy.MM.dd" />
      <param name="StaticLogFileName" value="true" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"          value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
    <!-- Setup the root category, add the appenders and set the default priority -->
    <!--root>
      <priority value="DEBUG" />
      <appender-ref ref="console" />
      <appender-ref ref="rollingFile" />
    </root-->
    <logger name="NHibernate.SQL">
      <level value="ALL" />
      <appender-ref ref="SQLLogFile" />
      <appender-ref ref="console" />
    </logger>
  </log4net>
</configuration>

After configuring as above, make sure to invoke below code from somewhere in your startup code.


log4net.Config.
XmlConfigurator.Configure();

II. 
Alternatively, you can use separate config files for Nhibernate as well as Log4Net.  (preferred way).
-Add config file (hibernate.cfg.xml) for NHibernate

<?xml version="1.0" encoding="utf-8"?>
<!-- 
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it 
for your own use before compile tests in VisualStudio.
-->
<!-- This is the ByteFX.Data.dll provider for MySql -->
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
 <session-factory name="NHibernate.Test">
  <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
  <property name="connection.connection_string">
      server=127.0.0.1;uid=root;pwd=********;database=test;Allow Zero Datetime=true;
    </property>
  <property name="dialect">NHibernate.Dialect.MySQLDialect</property>
    <property name="show_sql">true</property>
 </session-factory>
</hibernate-configuration>

-Add config file (log4net.cfg.xml) for Log4Net

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <!-- This section contains the log4net configuration settings -->
  <log4net debug="true">
    <!-- Define some output appenders -->
    <!--appender name="trace"          type="log4net.Appender.TraceAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"             value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
      </layout>
    </appender-->
    <appender name="console"          type="log4net.Appender.ConsoleAppender, log4net">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"             value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" />
      </layout>
    </appender>
    <appender name="SQLLogFile"          type="log4net.Appender.RollingFileAppender,log4net" >
      <param name="File" value="logs/log-sql.txt" />
      <param name="AppendToFile" value="false" />
      <param name="RollingStyle" value="Date" />
      <param name="DatePattern" value="yyyy.MM.dd" />
      <param name="StaticLogFileName" value="true" />
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern"          value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
    <!-- Setup the root category, add the appenders and set the default priority -->
    <!--root>
      <priority value="DEBUG" />
      <appender-ref ref="console" />
      <appender-ref ref="rollingFile" />
    </root-->
    <logger name="NHibernate.SQL">
      <level value="ALL" />
      <appender-ref ref="SQLLogFile" />
      <appender-ref ref="console" />
    </logger>
  </log4net>
</configuration>
-Make sure log4net file is specified in the AssemblyInfo.cs file
// Configure log4net using the config file
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.cfg.xml", Watch = true)]

-After configuring as above, make sure to invoke below code from somewhere in your startup code.
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

And log will be as in the below:
2014-08-31 20:05:33,725 [4] DEBUG NHibernate.SQL - INSERT INTO User (FName, LName, PlaceOfBirth, Id) VALUES (?p0, ?p1, ?p2, ?p3);?p0 = 'John' [Type: String (6)], ?p1 = 'Smith' [Type: String (7)], ?p2 = 'London' [Type: String (5)], ?p3 = 9929769d-a95a-4f71-9cf8-4e93fdff54ce [Type: Guid (0)]

Friday, August 29, 2014

Comparison of Timer Class in .Net Class Library

 System.Windows.FormsSystem.TimersSystem.Threading
Timer event runs on what thread?UI threadUI or worker threadWorker thread
Instances are thread safe?NoYesNo
Familiar/intuitive object model?YesYesNo
Requires Windows Forms?YesNoNo
Metronome-quality beat?NoYes*Yes*
Timer event supports state object?NoNoYes
Initial timer event can be scheduled?NoNoYes
Class supports inheritance?YesYesNo
* Depending on the availability of system resources (for example, worker threads)

For details descrition : http://msdn.microsoft.com/en-us/magazine/cc164015.aspx