日志记录工具 - log4net
使用 log4net
1. 安装
在主项目下的控制台中输入
Install-Package log4net
2. 配置可用性
在使用 Ilog 的项目上 配置 AssemblyInfo.cs 在尾部加入一行
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension="ext", Watch = true)] // ConfigFile : 指的是log4Net的配置文件的路径,相对应用程序的根路径 // ConfigFileExtension : 如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。 // Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名,删除等事件。 // 注:其中:ConfigFile和ConfigFileExtension属性不能同时使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt” ConfigFileExtension=”txt”,则配置文件就应该是”test.exe.txt”
同时需要在使用 ILog 的项目上引入 log4net.dll
3. 文件配置
在主项目上创建配置文件, 用来配置相关项
log4net.config 此名字根据上一步 的配置文件名而来
总框架
root 不是必须的, 这个只是个继承的作用, 可以省略然后把配置都卸载每个 logger 里

<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <root> <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录--> <!--如果没有定义LEVEL的值,则缺省为DEBUG--> <level value="ALL"/> </root> <logger name="dblog" additivity="false"> <!-- 预定义了一个具体日志对象的设置 --> <!-- name 用来调用查找的名字, 例如: LogManager.GetLogger(“testAPP.Logging”) --> <!-- additivity 是否继承root --> <level value="ALL"/> <!--定义输出介质--> <appender-ref ref="SysAppender" /> </logger> </log4net> <!--必须指定框架,否则不执行,新版本默认支持4.0,可修改源文件,项目属性设定为.NET FRAMEWORK2.0后,打开重新编译,去掉其中的.NET 4.0编译导致错误环节,如此只能使用在.net 2.0框架--> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
在 <logger> 中配置想要的记录载体
记录到文件配置
<!--日志格式必须要有, 否则记录的文件会为空-->

<!--记录到文件--> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net"> <!--日志文件名开头--> <param name="File" value="Files/Logs" /> <!--是否追加到文件,默认为true,通常无需设置--> <param name="AppendToFile" value="true" /> <!--变换的形式为日期,这种情况下每天只有一个日志--> <!--此时MaxSizeRollBackups和maximumFileSize的节点设置没有意义--> <!--<rollingStyle value="Date"/>--> <!--变换的形式为日志大小--> <!--这种情况下MaxSizeRollBackups和maximumFileSize的节点设置才有意义--> <param name="RollingStyle" value="Date" /> <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置--> <param name="DatePattern" value="\\yyyy-MM\\yyyy-MM-dd".log"" /> <param name="StaticLogFileName" value="false" /> <!--每天记录的日志文件个数,与maximumFileSize配合使用--> <MaxSizeRollBackups value="10"/> <!--每个日志文件的最大大小--> <!--可用的单位:KB|MB|GB--> <!--不要使用小数,否则会一直写入当前日志--> <maximumFileSize value="2MB"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="Header" value="[Header]"/> <!--头--> <param name="Footer" value="[Footer]"/> <!--脚注--> <param name="ConversionPattern" value="%d - %m%n" /> <!-- 调用实例 log4net.ILog log = log4net.LogManager.GetLogger("Filelog"); log.Info(Message); %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 %n(new line):换行 %d(datetime):输出当前语句运行的时刻 %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 %t(thread id):当前语句所在的线程ID %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等 %c(class):当前日志对象的名称 %L:输出语句所在的行号 %F:输出语句所在的文件名 %-数字:表示该项的最小长度,如果不够,则用空格填充 例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出: [main] INFO org.foo.Bar - Located nearest gas station. --> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <!--应用到Appender对象的过滤器--> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="WARN" /> </filter> </appender>
记录到 Oracle 数据库

<!--Oracle数据库--> <appender name="OracleAppender" type="log4net.Appender.AdoNetAppender"> <!-- Oracle数据源--> <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> <!-- Oracle连接字符串--> <connectionString value="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.206)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)));PASSWORD=watdb;PERSIST SECURITY INFO=True;USER ID=watdb;"/> <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,Message,Exception,ClientUser,ClientIP,RequestUrl,Action)VALUES(:Dates,:Levels,:Logger,:Message,:Exception,:ClientUser,:ClientIP,:RequestUrl,:Action)"/> <!-- 设置缓存区大小 1表明有一条日志就要写入 如果10就表示日志到达10条时一起写入 --> <bufferSize value="0"/> <parameter> <parameterName value=":Dates" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout"/> </parameter> <parameter> <parameterName value=":Levels" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value=":Logger" /> <dbType value="String" /> <size value="200" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value=":Message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value=":Exception" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%exception" /> </layout> </parameter> <!--DIY--> <parameter> <parameterName value=":ClientUser" /> <dbType value="String" /> <size value="100" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{ClientUser}" /> </layout> </parameter> <parameter> <parameterName value=":ClientIP" /> <dbType value="String" /> <size value="20" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{ClientIP}" /> </layout> </parameter> <parameter> <parameterName value=":RequestUrl" /> <dbType value="String" /> <size value="500" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{RequestUrl}" /> </layout> </parameter> <parameter> <parameterName value=":Action" /> <dbType value="String" /> <size value="20" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{Action}" /> </layout> </parameter> </appender>
记录到 Sqlite 数据库

<!--Sqlite数据库--> <appender name="SqliteAppender" type="log4net.Appender.AdoNetAppender"> <bufferSize value="0" /> <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.98.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" /> <connectionString value="Data Source=|DataDirectory|test.db;Version=3;" /> <commandText value="INSERT INTO Log (Date, Level, Logger, ClientUser,ClientIP, RequestUrl,Action, Message, Exception) VALUES (@Date, @Level, @Logger,@ClientUser,@ClientIP, @RequestUrl,@Action, @Message, @Exception)" /> <parameter> <parameterName value="@Date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@Level" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@Logger" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@ClientUser" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{ClientUser}" /> </layout> </parameter> <parameter> <parameterName value="@ClientIP" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{ClientIP}" /> </layout> </parameter> <parameter> <parameterName value="@RequestUrl" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{RequestUrl}" /> </layout> </parameter> <parameter> <parameterName value="@Action" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{Action}" /> </layout> </parameter> <parameter> <parameterName value="@Message" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@Exception" /> <dbType value="String" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%exception" /> </layout> </parameter> </appender>
记录到 SqlServer 数据库

<!--SqlServer数据库--> <appender name="SqlServerAppender" type="log4net.Appender.AdoNetAppender"> <!-- SqlServer数据源--> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <!-- SqlServer连接字符串--> <connectionString value="data source=.;initial catalog=wkmvc_db;integrated security=false;persist security info=True;User ID=sa_wkmvc;Password=123456" /> <commandText value="INSERT INTO SYS_LOG(Dates,Levels,Logger,ClientUser,ClientIP,RequestUrl,Action,Message,Exception)VALUES(@Dates,@Levels,@Logger,@ClientUser,@ClientIP,@RequestUrl,@Action,@Message,@Exception)"/> <!-- 设置缓存区大小 1表明有一条日志就要写入 如果10就表示日志到达10条时一起写入 --> <bufferSize value="0"/> <parameter> <parameterName value="@Dates" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@Levels" /> <dbType value="String" /> <size value="50" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@Logger" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger" /> </layout> </parameter> <parameter> <parameterName value="@Message" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> <parameter> <parameterName value="@Exception" /> <dbType value="String" /> <size value="2000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> <!--DIY--> <parameter> <parameterName value="@ClientUser" /> <dbType value="String" /> <size value="100" /> <layout type="log4net.Layout.PatternLayout" > <param name="ConversionPattern" value="%property{ClientUser}"/> </layout> </parameter> <parameter> <parameterName value="@ClientIP" /> <dbType value="String" /> <size value="100" /> <layout type="log4net.Layout.PatternLayout" > <param name="ConversionPattern" value="%property{ClientIP}"/> </layout> </parameter> <parameter> <parameterName value="@RequestUrl" /> <dbType value="String" /> <size value="500" /> <layout type="log4net.Layout.PatternLayout" > <param name="ConversionPattern" value="%property{RequestUrl}"/> </layout> </parameter> <parameter> <parameterName value="@Action" /> <dbType value="String" /> <size value="100" /> <layout type="log4net.Layout.PatternLayout" > <param name="ConversionPattern" value="%property{Action}"/> </layout> </parameter> </appender>
4. 使用
Console.WriteLine("Begin Run"); XmlConfigurator.Configure(); Type type = MethodBase.GetCurrentMethod().DeclaringType; ILog m_log = LogManager.GetLogger(type); m_log.Debug("这是一个Debug日志"); m_log.Info("这是一个Info日志"); m_log.Warn("这是一个Warn日志"); m_log.Error("这是一个Error日志"); m_log.Fatal("这是一个Fatal日志"); Console.WriteLine("End"); Console.ReadLine();
public static void WriterLog(bool result, string module, string describe, string note) { ILog logger = LogManager.GetLogger("dblog"); if (logger.IsInfoEnabled) { logger.InfoFormat(@"结果:{0},模块:{1}, 描述:{2}, 备注:{3}", result ? "成功" : "失败", module, describe, note); } }
如何使用自定义的字段进行数据库记录
public class MessageLog { public string Date { get; set; } public string Message { get; set; } public string ClientUser { get; set; } public override string ToString() { return Message; } } internal sealed class ContentPatternConverter : PatternLayoutConverter { protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent) { var messageLog = loggingEvent.MessageObject as MessageLog; if (messageLog != null) { writer.Write(messageLog.ClientUser); } } } public class MessageLayout : PatternLayout { public MessageLayout() { this.AddConverter("ClientUser", typeof(ContentPatternConverter)); } }
<logger name="dblog" additivity="false">
<level value="ALL"/>
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="Files/Logs" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="\\yyyy-MM\\yyyy-MM-dd".log"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net" />
</appender>
<appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1"/>
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Data Source=(localdb)\ProjectsV13; Initial Catalog=LogDemo; Integrated Security=SSPI;" />
<commandText value="INSERT INTO dbo.SYS_LOG(Dates,Message,ClientUser)VALUES(@Dates,@Message,@ClientUser)"/>
<parameter>
<parameterName value="@Dates" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@Message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<!--DIY-->
<parameter>
<parameterName value="@ClientUser" />
<!--这里的类型可以是 String, DateTime, Int32 -->
<!--如果程序里的字段是 int, 这里也可以设置为 String, 只要能相互转换-->
<dbType value="String" />
<size value="100" />
<!--type里填写Layout的类(包含命名空间)-->
<layout type="Log4netTest.MessageLayout" >
<conversionPattern value="%ClientUser"/>
</layout>
</parameter>
</appender>
</logger>
注意: 如果是在控制台应用程序里使用 log4net 则需要吧 log4net.config 属性设置为!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
https://blog.csdn.net/binnygoal/article/details/79557746