使用 log4net 写.NET程序的日志

今天体验了一把用log4net写.NET应用程序日志。html

log4net的官方网站地址: http://logging.apache.org/log4net/数据库

log4net的下载地址:http://logging.apache.org/log4net/download_log4net.cgiapache

在这个地址能够下载 log4net 的源码,也能够直接下载编译好的版本(dll库)。直接编译好的release版有两个,分别是log4net-1.2.15-bin-newkey.zip和log4net-1.2.15-bin-oldkey.zip,这两个release版的区别是:前者对程序集使用了强名称签名(strong name key)。app

There are two different binary releases, oldkey and newkey. Both contain assemblies built for most supported platforms and have been built from the same code base, they only differ in the strong name key used to sign the assemblies.函数

See the FAQ for background. We recommend you use the assemblies signed with the "new" key whenever possible.测试

官方建议若是条件容许尽可能使用newkey的版本,所以咱们也使用这个版本,下载连接:网站

http://mirrors.tuna.tsinghua.edu.cn/apache//logging/log4net/binaries/log4net-1.2.15-bin-newkey.zipui

下载并解压缩后,发现这个zip文件里面有不少个release版dll,这里咱们用net4.0的版本spa

新建一个C#控制台应用程序工程,引用其中的log4net.dll.net

在工程中新建一个xml文件,取名为log4net.config,代码以下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <log4net>
    <!-- Appender:输出到文件 -->
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "log\"/>
      <!--是不是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--日志文件名是不是固定不变的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式为:年-月-日.log-->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <!--日志输出格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
      </layout>
      <!--日志输出等级-->
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Info" /> <!--输出到文件的日志,不包含Debug-->
        <param name="LevelMax" value="Fatal" />
      </filter>
    </appender>
    <!-- Appender:输出到控制台 -->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <!--调试类型日志-->
      <mapping>
        <level value="Debug" />
        <foreColor value="White" />
      </mapping>
      <!--通常类型日志-->
      <mapping>
        <level value="Info" />
        <foreColor value="White, HighIntensity" />
      </mapping>
      <!--警告类型日志-->
      <mapping>
        <level value="Warn" />
        <foreColor value="Yellow, HighIntensity" />
      </mapping>
      <!--错误类型日志-->
      <mapping>
        <level value="Error" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <!--致命错误日志-->
      <mapping>
        <level value="Fatal" />
        <backColor value="White, HighIntensity" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <!--日志输出格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
      <!--日志输出等级-->
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Debug" />
        <param name="LevelMax" value="Fatal" />
      </filter>
    </appender>
    <!--注册Appender-->
    <root>
      <appender-ref ref="RollingLogFileAppender"/>
      <appender-ref ref="ColoredConsoleAppender"/>
    </root>
  </log4net>
</configuration>

log4net的配置项教程,网上能搜索到不少。基本逻辑是,定义若干个Appender,再在root节点中注册一下这些Appender。

log4net官网对Appender的定义方法有着很是详细的介绍(都是英文的):

http://logging.apache.org/log4net/release/config-examples.html

如今设计工程结构以下:

其中,Program.cs代码以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;
using log4net;
using log4net.Config;

namespace Log4NetTest
{
    class Program
    {
        static void Main(string[] args)
        {
            //加载log4net配置
            FileInfo configFile = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
            XmlConfigurator.ConfigureAndWatch(configFile);
            
            //建立logger
            var logger = LogManager.GetLogger(typeof(Program));
            
            //一、使用logger写日志(最简单的调用)
            logger.Debug("调试类型日志");
            logger.Info("通常类型日志");
            logger.Warn("警告类型日志");
            logger.Error("错误类型日志");
            logger.Fatal("致命错误日志");
            Console.WriteLine();
            
            //二、使用logger写日志(异常信息的日志)
            try
            {
                TestFunc1();
            }
            catch (Exception ex)
            {
                logger.Error("捕获异常测试", ex);
            }
            Console.WriteLine();

            //三、使用logger写日志(其余线程的日志)
            Thread thread = new Thread(() =>
            {
                try
                {
                    TestFunc1();
                }
                catch (Exception ex)
                {
                    logger.Error("捕获异常测试2", ex);
                }
            });
            thread.IsBackground = true;
            thread.Start();
            Thread.Sleep(2000);
            Console.WriteLine();

            //三、使用logger写日志(其余类的日志)
            TestClass.WriteLog("TestClass.WriteLog调用测试");

            Console.Read();
        }

        //测试用函数 TestFunc1 TestFunc2 TestFunc3
        static void TestFunc1() { TestFunc2(); }
        static void TestFunc2() { TestFunc3(); }
        static void TestFunc3() { int a = 1; int b = 0; int i = a / b; }
    }
}

其中引用到的TestClass类代码以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;

namespace Log4NetTest
{
    class TestClass
    {
        public static void WriteLog(string log = "")
        {
            var logger = LogManager.GetLogger(typeof(TestClass));
            logger.Info(log);
        }
    }
}

程序运行结果以下:

写入到文本文件中的内容以下:

最后总结一下log4net的基本使用方法:

一、引用log4net.dll

二、配置log4net.config文件,并在代码中使用XmlConfigurator.ConfigureAndWatch方法加载

三、使用LogManager.GetLogger方法获取当前类的logger

四、使用logger写日志,根据log4net.config的定义,日志能够写到控制台、文本文件、数据库等位置

参考文献:

柄棋先生,C#使用Log4Net记录日志

http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html

周公,log4net使用详解

http://blog.csdn.net/zhoufoxcn/article/details/2220533

周公 ,Log4Net使用详解(续)

http://www.cnblogs.com/zhoufoxcn/archive/2010/11/23/2515616.html

END

相关文章
相关标签/搜索