Log4Net
在WinForm或Console应用程序中,要使用Log4Net组件,需要在AssembleInfo.cs文件中添加如下代码,表示要使用的配置文件信息:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "./LearnLog4Net.exe.config", ConfigFileExtension = "config", Watch = true)]
使用Log4Net组件,主要的是要会配置Appender
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, Log4net" /> </configSections> <log4net> <!-- 使用RollingFileAppender循环记录日志 --> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <!--自定义log文件名及log文件存储路径--> <file type="log4net.Util.PatternString" value="e:/log/%date{yyyy-MM-dd}.txt" /> <appendToFile value="true" /> <!-- 每个日志文件最大1MB --> <maximumFileSize value="1MB" /> <!-- 最大日志文件个数是10。如果日志文件大于1M,则会生成一个新的日志文件:yyyy-MM-dd.txt.1, 如果记录的日志超过10个,会从yyyy-MM-dd.txt.1开始覆盖。 --> <maxSizeRollBackups value="10" /> <!-- 根据文件大小循环生成日志文件 --> <rollingStyle value="Size" /> <layout type="log4net.Layout.PatternLayout"> <!-- 关于使用log4net中可能会使用到的一些参数 %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 %n(new line):换行 %d(datetime):输出当前语句运行的时刻 %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 %t(thread id):当前语句所在的线程ID %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等 %c(class):当前日志对象的名称,例如: %f(file):输出语句所在的文件名。 %l(line):输出语句所在的行号。 %数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。 --> <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" /> </layout> </appender> <!-- 定义输出到SQL Server数据库中 --> <!-- 创建日志表的SQL脚本 CREATE TABLE [dbo].[Log]( [Id] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [varchar](255) NOT NULL, [Level] [varchar](50) NOT NULL, [Logger] [nvarchar](255) NOT NULL, [Message] [nvarchar](4000) NOT NULL, [Exception] [ntext] NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] --> <appender name="AdoNetAppender_SQLServer" type="log4net.Appender.AdoNetAppender"> <!-- 先把日志内容记录到内存缓冲集合中,当集合长度为100时,一次性写入数据库,提高性能 --> <bufferSize value="100" /> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="Data Source=SHZ-PC\SQLSERVER2008;Initial Catalog=Log4Net;integrated security=false;Persist Security Info=True;User ID=sa;Password=sa" /> <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" /> <parameter> <parameterName value="@log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@thread" /> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%thread" /> </layout> </parameter> <parameter> <parameterName value="@log_level" /> <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="20000" /> <layout type="log4net.Layout.ExceptionLayout" /> </parameter> </appender> <!-- 通过邮件发送日志 --> <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender"> <authentication value="Basic" /> <!-- 收件人邮箱,多个邮箱以“,”分隔 --> <to value="test@sina.cn" /> <!-- 发件人邮箱 --> <from value="1111111111@qq.com" /> <!-- 发件人邮箱 --> <username value="1111111111@qq.com" /> <!-- 发件人邮箱密码 --> <password value="1111111111" /> <!-- 邮件主题 --> <subject value="XXX系统异常报告" /> <!-- 发送邮件的服务器 --> <smtpHost value="smtp.qq.com" /> <!-- 内存中的日志缓冲区满100条才发送一次邮件 --> <bufferSize value="100" /> <!--超长部分是否丢弃--> <lossy value="true" /> <!-- 下面的定义, 就是 日志级别 大于 WARN 的, 才发邮件. --> <evaluator type="log4net.Core.LevelEvaluator"> <threshold value="WARN"/> </evaluator> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" /> </layout> </appender> <root> <!-- 定义记录日志的级别,该级别(含)以上的日志会被记录到对应的媒介中,取值有INFO,DEBUG,WARN,ERROR,FETAL,ALL 注意:如果定义为INFO,则DEBUG信息并不会记录到媒介中。如果定义为DEBUG,则全部级别都会记录。 --> <level value="ALL" /> <appender-ref ref="RollingLogFileAppender" /> <appender-ref ref="AdoNetAppender_SQLServer" /> <appender-ref ref="SmtpAppender" /> </root> </log4net> </configuration>
LogHelper文件代码
using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace LearnLog4Net { public static class LogHelper { private static ILog log; static LogHelper() { log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); } public static void WriteInfo(object message) { if(log.IsInfoEnabled) { log.Info(message); } } public static void WriteDebug(object message) { if (log.IsDebugEnabled) { log.Debug(message); } } public static void WriteWarn(object message) { if(log.IsWarnEnabled) { log.Warn(message); } } public static void WriteError(object message) { WriteError(message, null); } public static void WriteError(object message,Exception ex) { if(log.IsErrorEnabled) { log.Error(message, ex); } } public static void WriteFetal(object message) { if(log.IsFatalEnabled) { log.Fatal(message); } } } }