log4net 在VS2010 NET4下的使用

来源:互联网 发布:linux新建文档命令 编辑:程序博客网 时间:2024/04/24 21:20
       最近VS2010项目,用log4net来记录日志。现在最新的官方版本是log4net-1.2.10,在net2.0编译方式下没问题。如果要在vs2010中使用,那就得要费点劲了。

       下面是我成功使用的过程。

       首先去网站下载好log4net-1.2.10源码,编译源码前要进行以下修改:

       1.在源码项目添加“System.configuration”空间引用

       2.在项目属性的生成标签页中(log4net项目按右键,点属性,选生成标签),将条件编译符号定义修改成:NET;NET_2_0;NET_4_0

          同时修改输出路径为../build/bin/net/4.0/debug/

       3.在项目属性的应用程序标签页中,将目标框架修改成.NET Framework 4, 注意使用 .NET 4 Client Profile 将导致有问题。

       4.在项目的config目录下找到 XmlConfigurator.cs,打开它,在 623行左右替换 settings.ProhibitDtd = false; 在#elif NET_2_0 判断后加入.Net4新属性,修改成如下:

 #elif NET_2_0
// Allow the DTD to specify entity includes
XmlReaderSettings settings = new XmlReaderSettings();
#if NET_4_0
settings.DtdProcessing = DtdProcessing.Parse;
#else
settings.ProhibitDtd = false;
#endif

      5.修改项目中的AssemblyInfo.cs文件

         首先修改代码34行左右,将其改为如下:

#if (!NETCF && !NET_4_0)

//

// If log4net is strongly named it still allows partially trusted callers

//

[assembly: System.Security.AllowPartiallyTrustedCallers]

#endif  

          接着在 AssemblyInfo.cs 的Assembly Title 部份增加 .Net4,即#elif (NET_2_0)前,大约在53行左右,修改如下:

#elif (NET_4_0)

[assembly: AssemblyTitle("log4net for .NET Framework 4.0")]

#elif (NET_2_0)

[assembly: AssemblyTitle("log4net for .NET Framework 2.0")]

             好了。现在应该可以编译log4net了。

 

             对于log4net的使用

             1.将你的VS2010项目的目标框架设为.NET Framework 4;

             2.接着引用log4net.dll;

             3.然后设置你的app.config,注意:右键 app.config文件点击【属性】,在属性窗口中将‘复制到输出目录’改为‘如果较新则复制’
        或者你可以手动将 app.config 文件复制到你应用程序输出目录。如果不这样做 log4net 组件是找不到配置文件的,但是它本身不会报错。就是不会出现日志信息具体的配置。以下是我的配置示例如下:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-4.0" />
  </configSections>
  <log4net>
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="Log\Log.txt" />
      <param name="AppendToFile" value="true" />
      <param name="MaxSizeRollBackups" value="100" />
      <param name="MaximumFileSize" value="2MB" />
      <param name="RollingStyle" value="Size" />
      <param name="StaticLogFileName" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
      </layout>
    </appender>
    <root>
      <level value="all" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
  </log4net>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" />
  </startup>
</configuration> 

          4.在项目的AssemblyInfo.cs文件中添加如下语句:

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

          通过上面的配置就可以使用了。

          我们可以在窗体上测试一下:

     private void Form1_Load(object sender, EventArgs e)
        {
            log4net.ILog LOG = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
            log.Debug("test");
        }

 

很好,一运行,log.txt就生成了。

//如果要记录所有未捕捉的异常,修改Program.cs如下

    static class Program
    {
        static log4net.ILog LOG = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
       
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //捕获未处理异常 
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            // 捕获完毕 [5/21/2012 Administrator]

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            LOG.Error(e.Exception);
            MessageBox.Show(e.Exception.Message, "线程异常", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Application.Exit();
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
        { 
            Exception ex = e.ExceptionObject as Exception; 
            LOG.Error(ex); 
            MessageBox.Show(ex.Message, "应用程序异常", MessageBoxButtons.OK, MessageBoxIcon.Error); 
            Application.Exit(); 
        } 
    }