今天体验了一把用log4net写.NET应用程序日志。
log4net的官方网站地址: http://logging.apache.org/log4net/
log4net的下载地址:http://logging.apache.org/log4net/download_log4net.cgi
在这个地址可以下载 log4net 的源码,也可以直接下载编译好的版本(dll库)。直接编译好的release版有两个,分别是log4net-1.2.15-bin-newkey.zip和log4net-1.2.15-bin-oldkey.zip,这两个release版的区别是:前者对程序集使用了强名称签名(strong name key)。
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.zip
下载并解压缩后,发现这个zip文件里面有很多个release版dll,这里我们用net4.0的版本

新建一个C#控制台应用程序工程,引用其中的log4net.dll
在工程中新建一个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".log""/>
<!--日志根据日期滚动-->
<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));
//1、使用logger写日志(最简单的调用)
logger.Debug("调试类型日志");
logger.Info("一般类型日志");
logger.Warn("警告类型日志");
logger.Error("错误类型日志");
logger.Fatal("致命错误日志");
Console.WriteLine();
//2、使用logger写日志(异常信息的日志)
try
{
TestFunc1();
}
catch (Exception ex)
{
logger.Error("捕获异常测试", ex);
}
Console.WriteLine();
//3、使用logger写日志(其他线程的日志)
Thread thread = new Thread(() =>
{
try
{
TestFunc1();
}
catch (Exception ex)
{
logger.Error("捕获异常测试2", ex);
}
});
thread.IsBackground = true;
thread.Start();
Thread.Sleep(2000);
Console.WriteLine();
//3、使用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的基本使用方法:
1、引用log4net.dll
2、配置log4net.config文件,并在代码中使用XmlConfigurator.ConfigureAndWatch方法加载
3、使用LogManager.GetLogger方法获取当前类的logger
4、使用logger写日志,根据log4net.config的定义,日志可以写到控制台、文本文件、数据库等位置
参考文献:
柄棋先生,C#使用Log4Net记录日志
http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html
周公,log4net使用详解
http://blog.youkuaiyun.com/zhoufoxcn/article/details/2220533
周公 ,Log4Net使用详解(续)
http://www.cnblogs.com/zhoufoxcn/archive/2010/11/23/2515616.html
END
本文详细介绍了如何使用log4net在.NET应用程序中记录日志。从log4net的安装配置到具体代码实现,包括如何将不同级别的日志输出到控制台及文件中,并通过示例展示了异常捕捉及多线程日志的处理方式。
1776

被折叠的 条评论
为什么被折叠?



