背景
最近在写一个Adapter,需要调用别的程序的DLL. Adapter使用的是C#还有.net的等方面的技术。今天在写log这块,就像尝试一下有没有“轮子”可以试试的。在网上搜罗了一番之后,决定就使用“log4net”吧。
关于log4net
简单来说,她是从log4j衍生出来的专门用于.net领域的一个写log的类库。支持 .net stardard,.net core等等。。。
下载
我们可以到 http://logging.apache.org/log4net/download_log4net.cgi 来下载,下载页面提供了很多种方式(binary or source)
使用
LZ这里是.net stardard,所以将下载完成后的压缩包解压,之后进入bin目录,找到对应的framework版本,选择引入“log4net.dll”
个人的想法是把这个记录log的组件封装成一个library,所以新建一个ClassLibrary工程,在里面引入“log4net.dll”并且进行封装。项目组成如下图:
其中:
- LogHelper 是一个关于调用Log4net.dll方法的封装类。
- LogLirary.config 该文件是一个配置文件,里面详细记录的log的输出/存储方式
LogHelper.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; [assembly: log4net.Config.XmlConfigurator(ConfigFile = "LogLibrary.config", ConfigFileExtension = ".config", Watch = true)] namespace LogLibary { public enum LogLevel { Debug, Info, Warning, Error } public class LogHelper { public static void WriteLog(Type t, LogLevel logLevel, string msg) { log4net.ILog log = log4net.LogManager.GetLogger(t); switch (logLevel) { case LogLevel.Debug: log.Debug(msg); break; case LogLevel.Info: log.Info(msg); break; case LogLevel.Warning: log.Warn(msg); break; case LogLevel.Error: log.Error(msg); break; default: log.Debug(msg); break; } } public static void WriteLogWithException(Type t, LogLevel logLevel, string msg, Exception ex) { log4net.ILog log = log4net.LogManager.GetLogger(t); switch (logLevel) { case LogLevel.Debug: log.Debug(msg, ex); break; case LogLevel.Info: log.Info(msg, ex); break; case LogLevel.Warning: log.Warn(msg, ex); break; case LogLevel.Error: log.Error(msg, ex); break; default: log.Debug(msg, ex); break; } } } }
标红的语句非常重要,它表明我们log输出依赖于configuration
LogLibrary.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--定义输出到文件中--> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--定义文件存放位置--> <file value="Log\"/> <appendToFile value="true"/> <rollingStyle value="Date"/> <datePattern value="yyyy\yyyyMM\yyyyMMdd'.txt'"/> <staticLogFileName value="false"/> <param name="MaxSizeRollBackups" value="100"/> <layout type="log4net.Layout.PatternLayout"> <!--每条日志末尾的文字说明--> <!--输出格式--> <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info--> <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n"/> </layout> </appender> <!--定义输出到控制台命令行中--> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <!--文件形式记录日志--> <appender-ref ref="RollingLogFileAppender" /> <!--控制台控制显示日志--> <appender-ref ref="ConsoleAppender" /> </root> </log4net> </configuration>
最后,写一个简单的测试类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using RabbitMQ.Client; using LogLibary; namespace Producer { class Program { static void Main(string[] args) { for (int i = 0; i < 1000; i++) // tested code here { string message = String.Format("Hello there! number is: {0}", i.ToString()); LogHelper.WriteLog(typeof(Program), LogLevel.Debug, string.Format(" set {0}", message)); } LogHelper.WriteLog(typeof(Program), LogLevel.Info, "1000 tasks sent out!!"); Console.ReadKey(); } } }
参考文献:
http://logging.apache.org/log4net/release/config-examples.html
http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html
OK. 啰啰嗦嗦写了一堆,感谢大家的收看,预祝各位双11 “买买买!!”