Log4net
参考文档:http://www.cnblogs.com/LiZhiW/p/4317198.html
一、关联配置文件
1,三种配置方式的方式
① 默认web.config/app.config
//监视默认的配置文件,App.exe.config [assembly: log4net.Config.XmlConfigurator(Watch = true)]
② 独立配置文件(<项目名称>.exe. log4net)(例如ConsoleApplication1.exe.log4net)
//配置文件:App.exe.log4net [assembly:log4net.Config.XmlConfigurator(ConfigFileExtension= "log4net")]
③ 独立配置文件log4net.config
//配置文件:log4net.config [assembly:log4net.Config.XmlConfigurator(ConfigFile= "log4net.config")]
也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示:
log4net.Config.XmlConfigurator.Configure(new FileInfo(@"F:/log4net.config"));
2,log4net.Config.XmlConifguratorAttribute
ConfigFile:配置文件的名字,文件路径相对于应用程序目录
ConfigFileExtension:配置文件的扩展名,文件路径相对于应用程序的目录,不能和ConfigFile属性一起使用
Watch:如果将Watch属性设置为true,就会监视配置文件,当配置文件发生变化的时候,就会重新加载
二、案例
1,输出到文本
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <appender name="AdoNetAppender_file" type="log4net.Appender.RollingFileAppender"> <!--日志文件路径,按文件大小方式输出时在这里指定文件名,并且前面的日志按天在文件名后自动添加当天日期形成文件--> <param name= "File" value= "D:\App_Log\Debug\"/> <!--是否是向文件中追加日志--> <param name= "AppendToFile" value= "true"/> <!--记录日志写入文件时,不锁定文本文件--> <!--<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />--> <!--Unicode编码--> <!--<Encoding value="UTF-8" />--> <!--最多产生的日志文件数,value="-1"为不限文件数--> <!--<param name="MaxSizeRollBackups" value="100" />--> <!--log保留天数--> <param name= "MaxSizeRollBackups" value= "30"/> <!--日志文件名是否是固定不变的(是否只写到一个文件中)--> <param name= "StaticLogFileName" value= "false"/> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <param name="RollingStyle" value="Date" /> <!--按日期产生文件夹,文件名[在日期方式与混合方式下使用]日志文件名格式为:2008-08-31.log --> <param name= "DatePattern" value= "yyyy-MM-dd".log""/> <!--<param name= "DatePattern" value= "yyyy-MM/yyyy-MM-dd".log""/>--> <!--每个文件的大小。只在[混合方式与文件大小方式]下使用,超出大小的在文件名后自动增加1重新命名--> <param name="maximumFileSize" value="500KB" /> <!--记录的格式。--> <layout type="log4net.Layout.PatternLayout"> <!-- %d, %date :表示当然的时间 %p, %level :表示日志的级别 %c, %logger :表示日志产生的主题或名称,通常是所在的类名,便于定位问题 %m, %message :表示日志的具体内容 %n, %newline :换行 %exception :表示异常信息 --> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m %logger %exception %n" /> </layout> </appender> <logger name="Test" additivity="true"> <level value="ALL"/> <appender-ref ref="AdoNetAppender_file" /> </logger> </log4net> </configuration>
using System; using log4net; namespace LogDemo { class Program { static void Main(string[] args) { ILog log = log4net.LogManager.GetLogger("Test"); log.Error("错误", new Exception("发生了一个异常"));//错误 log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误 log.Info("信息"); //记录一般信息 log.Debug("调试信息");//记录调试信息 log.Warn("警告");//记录警告信息 Console.WriteLine("日志记录完毕。"); Console.Read(); } } }
案例下载:http://pan.baidu.com/s/1nuU4f93
<param name= "File" value= "log\"/>文件配置格式
2,输出到数据库
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <appender name="AdoNetAppender_mysql" type="log4net.Appender.AdoNetAppender"> <bufferSize value="0" /><!--0:只要有一条就立刻写到数据库。4:第5条时写入数据库--> <!--日志数据库连接串mysql--> <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" /> <connectionString value="server=localhost;user id=root;pwd=123456;port=3306;pooling=True;database=xinleda" providerName="MySql.Data.MySqlClient;" /> <!--日志数据库脚本(注意:mysql不需要[]符号)--> <commandText value="INSERT INTO LogDetails(LogDate,Thread,Level,Logger,Message) VALUES (@logDate, @thread, @logLevel, @logger,@message)" /> <!--参数--> <parameter> <parameterName value="@logDate" /> <dbType value="Datetime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@logLevel" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender> <logger name="Test" additivity="true"> <level value="ALL"/> <appender-ref ref="AdoNetAppender_mysql" /> </logger> </log4net> </configuration>
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using log4net; using log4net.Config; using System.IO; namespace LogDemo { class Program { static void Main(string[] args) { ILog log = log4net.LogManager.GetLogger("Test"); log.Error("错误", new Exception("发生了一个异常"));//错误 log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误 log.Info("信息"); //记录一般信息 log.Debug("调试信息");//记录调试信息 log.Warn("警告");//记录警告信息 Console.WriteLine("日志记录完毕。"); Console.Read(); } } }
using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // 有关程序集的一般信息由以下 // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("LogDemo")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LogDemo")] [assembly: AssemblyCopyright("Copyright © 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] //将 ComVisible 设置为 false 将使此程序集中的类型 //对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, //请将此类型的 ComVisible 特性设置为 true。 [assembly: ComVisible(false)] // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID [assembly: Guid("3cef5427-d026-46c8-a73a-083215681098")] [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")] // 程序集的版本信息由下列四个值组成: // // 主版本 // 次版本 // 生成号 // 修订号 // //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, // 方法是按如下所示使用“*”: : // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
注意:如果是链接到mysql需要引用组件MySql.Data
案例下载:http://pan.baidu.com/s/1c1QIF0s
3,自定义字段输出到数据库
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <appender name="AdoNetAppender_mysql" type="log4net.Appender.AdoNetAppender"> <bufferSize value="0" /><!--0:只要有一条就立刻写到数据库。4:第5条时写入数据库--> <!--日志数据库连接串mysql--> <connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" /> <connectionString value="server=localhost;user id=root;pwd=123456;port=3306;pooling=True;database=xinleda" providerName="MySql.Data.MySqlClient;" /> <!--日志数据库脚本(注意:mysql不需要[]符号)--> <commandText value="INSERT INTO LogDetails(LogDate,Thread,Level,Logger,Message,Content,Age) VALUES (@logDate, @thread, @logLevel, @logger,@message,@Content,@Age)" /> <!--参数--> <parameter> <parameterName value="@logDate" /> <dbType value="Datetime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@logLevel" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@logger" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@message" /> <dbType value="String" /> <size value="240" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@Content" /> <dbType value="String" /> <size value="240" /> <layout type="LogDemo.MessageLayout"> <conversionPattern value="%Content" /> </layout> </parameter> <parameter> <parameterName value="@Age" /> <layout type="LogDemo.MessageLayout"> <conversionPattern value="%Age" /> </layout> </parameter> </appender> <logger name="Test" additivity="true"> <level value="ALL"/> <appender-ref ref="AdoNetAppender_mysql" /> </logger> </log4net> </configuration>
using log4net.Layout.Pattern; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using log4net.Core; using System.IO; using log4net.Layout; namespace LogDemo { //自定义字段 public class LogMassage { public string Content { get; set; } public int Age { get; set; } public DateTime Dt { get; set; } } public sealed class ContentPatternConverter : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { var log =loggingEvent.MessageObject as LogMassage; if (log != null) { writer.Write(log.Content); } } } public sealed class AgePatternConverter : PatternLayoutConverter { protected override void Convert(TextWriter writer, LoggingEvent loggingEvent) { var log = loggingEvent.MessageObject as LogMassage; if (log != null) { writer.Write(log.Age); } } } public class MessageLayout : PatternLayout { public MessageLayout() { this.AddConverter("Content", typeof(ContentPatternConverter)); this.AddConverter("Age", typeof(AgePatternConverter)); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using log4net; using log4net.Config; using System.IO; namespace LogDemo { class Program { static void Main(string[] args) { ILog log = log4net.LogManager.GetLogger("Test"); log.Error("错误", new Exception("发生了一个异常"));//错误 log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误 log.Info("信息"); //记录一般信息 log.Debug("调试信息");//记录调试信息 log.Warn("警告");//记录警告信息 //记录自定义字段 var m = new LogMassage(); m.Content = "asdasd"; m.Age = 123; m.Dt = DateTime.Now; log.Info(m); Console.WriteLine("日志记录完毕。"); Console.Read(); } } }
案例下载:http://pan.baidu.com/s/1hrNSB8C
三、配置详情
1,logger节点配置详解
<!--name:必须的,logger的名称,在代码中得到ILog对象时用到--> <!--additivity:可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender--> <logger name="Test" additivity="true"> <level value="ALL"/><!--日志级别等级。高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL--> <appender-ref ref="AdoNetAppender_mysql" /><!--0个或多个,要引用的appender的名字--> </logger>
2,filter节点配置详解
filter只能作为<appender>的子元素,type属性表示Filter的类型
DenyAllFilter 阻止所有的日志事件被记录
LevelMatchFilter 只有指定等级的日志事件才被记录
LevelRangeFilter 日志等级在指定范围内的事件才被记录
①记录日志等级为“FATAL”和“ERROR”的日志信息
<filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="FATAL"/> </filter> <filter type="log4net.Filter.LevelMatchFilter"> <levelToMatch value="ERROR"/> </filter> <filter type="log4net.Filter.DenyAllFilter"/>
②记录日志等级范围从“ERROR”到“INFO”的日志信息:
<filter type="log4net.Filter.LevelRangeFilter"> <levelMax value="ERROR"/> <levelMin value="INFO"/> </filter>
3,Layout节点配置详解
layout节点只能作为<appender>的子元素。type属性表示Layout的类型
①layout节点的type属性取值
ExceptionLayout |
只呈现日志事件中异常的文本信息 |
PatternLayout |
可以通过类型字符串来配置的布局 |
RawPropertyLayout |
从日志事件中提取属性值 |
RawTimeStampLayout |
从日志事件中提取日期 |
RawUtcTimeStampLayout |
从日志事件中提取UTC日期 |
SimpleLayout |
很简单的布局 |
XmlLayout |
把日志事件格式化为XML元素的布局 |
%m、%message |
输出的日志消息 |
%d、%datetime |
输出当前语句运行的时刻,格式%date{yyyy-MM-dd HH:mm:ss,fff} |
%r、%timestamp |
输出程序从运行到执行到当前语句时消耗的毫秒数 |
%p、%level |
日志的当前优先级别 |
%c、%logger |
当前日志对象的名称 |
%L、%line |
输出语句所在的行号 |
%F、%file |
输出语句所在的文件名,警告:只在调试的时候有效,调用本地信息会影响性能 |
%a、%appdomain |
引发日志事件的应用程序域的名称。 |
%C、%class、%type |
引发日志请求的类的全名,警告:会影响性能 |
%exception |
异常信息 |
%u、%identity |
当前活动用户的名字,我测试的时候%identity返回都是空的。警告:会影响性能 |
%l、%location |
引发日志事件的名空间、类名、方法、行号。警告:会影响性能,依赖pdb文件 |
%M、%method |
发生日志请求的方法名,警告:会影响性能 |
%n、%newline |
换行符 |
%x、%ndc |
NDC(nested diagnostic context) |
%X、%mdc、%P、%properties |
等介于 %property |
%property |
输出{log4net:Identity=, log4net:UserName=, log4net:HostName=} |
%t、%thread |
引发日志事件的线程,如果没有线程名就使用线程号。 |
%w、%username |
当前用户的WindowsIdentity,类似:HostName/Username。警告:会影响性能 |
%utcdate |
发生日志事件的UTC时间。例如:%utcdate{HH:mm:ss,fff} |
%% |
输出一个百分号 |
<parameter> <parameterName value="@logDate" /> <dbType value="Datetime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter>
<parameter> <parameterName value="@thread" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter>