1、引入log4net.dll
2、在AssemblyInfo.cs添加代碼
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "config", Watch = true)]
3、在webconfig或者appconfig中增加配置
<configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections>
4、創建應用程序配置文件log4net.config ,修改為始終復制
log4net.config的內容如下
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <log4net> <!--錯誤日志類--> <!--信息日志類--> <!--Debug日志類--> <root> <level value="ALL" /> <appender-ref ref="InfoAppender" /> <appender-ref ref="ErrorAppender"/> <appender-ref ref="DebugAppender"/> </root> <!--<logger name="loginfo"> <level value="ALL" /> <appender-ref ref="InfoAppender" /> </logger> <logger name="logerror"> <level value="ALL" /> <appender-ref ref="ErrorAppender" /> </logger> <logger name="logdebug"> <level value="ALL" /> <appender-ref ref="DebugAppender" /> </logger>--> <!--錯誤日志附加介質--> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <!-- name屬性指定其名稱,type則是log4net.Appender命名空間的一個類的名稱,意思是,指定使用哪種介質--> <param name="File" value="Log\\LogError\\" /> <!--日志輸出到exe程序這個相對目錄下--> <param name="AppendToFile" value="true" /> <!--輸出的日志不會覆蓋以前的信息--> <param name="MaxSizeRollBackups" value="100" /> <!--備份文件的個數--> <param name="MaxFileSize" value="10240" /> <!--當個日志文件的最大大小--> <param name="StaticLogFileName" value="false" /> <!--是否使用靜態文件名--><!-- <param name="DatePattern" value="yyyyMMdd".htm"" />--> <!--日志文件名--> <param name="RollingStyle" value="Date" /> <!-- 等級過濾 只需要ERROR等級的LOG --> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="ERROR"/> <levelMax value="ERROR"/> </filter> <!--文件創建的方式,這里是以Date方式創建--> <!--錯誤日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="異常時間:%d [%t] %n異常級別:%-5p %n異常內容:%m %n%n" /> </layout> </appender> <!--信息日志附加介質--> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Log\\LogInfo\\" /> <param name="AppendToFile" value="true" /> <param name="MaxFileSize" value="10240" /> <param name="MaxSizeRollBackups" value="100" /> <param name="StaticLogFileName" value="false" /> <param name="DatePattern" value="yyyyMMdd'.txt'" /> <param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" /> <param name="RollingStyle" value="Date" /> <!-- 等級過濾 --> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="INFO"/> <levelMax value="INFO"/> </filter> <!--信息日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="日志時間:%d [%t] %n日志級別:%-5p %n日志內容:%m %n%n" /> </layout> </appender> <!--調試日志附加介質--> <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Log\\LogDebug\\" /> <param name="AppendToFile" value="true" /> <param name="MaxFileSize" value="10240" /> <param name="MaxSizeRollBackups" value="100" /> <param name="StaticLogFileName" value="false" /> <!--<param name="DatePattern" value="yyyyMMdd".htm"" />--> <param name="RollingStyle" value="Date" /> <!-- 等級過濾 --> <filter type="log4net.Filter.LevelRangeFilter"> <levelMin value="DEBUG"/> <levelMax value="DEBUG"/> </filter> <!--信息日志布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="日志時間:%d [%t] %n日志級別:%-5p %n日志內容:%m %n%n" /> </layout> </appender> </log4net> </configuration>
ConversionPattern中的一些注解
%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:輸出語句所在的文件名
%-數字:表示該項的最小長度,如果不夠,則用空格填充
5、創建Log4netHelper,代碼如下
public class Log4netHelper { #region /// <summary> /// /// </summary> /// <param name="msg"></param> public static void InfoLog(object msg) { log4net.ILog log = log4net.LogManager.GetLogger("loginfo"); Task.Run(() => log.Info(msg)); //異步 //Task.Factory.StartNew(() => log.Error(msg));// 這種異步也可以 //log.Error(msg); //這種也行跟你需要,性能越好,越強大,我還是使用異步方式 } public static void WriteInfoLog(object msg) { log4net.ILog logInfo = log4net.LogManager.GetLogger("InfoAppender"); Task.Run(() => logInfo.Info(msg)); //異步 //log.Error(msg); //這種也行跟你需要,性能越好,越強大,我還是使用異步方式 } /// <summary> /// /// </summary> /// <param name="msg"></param> public static void ErrorLog(object msg) { log4net.ILog log = log4net.LogManager.GetLogger("logerror"); Task.Run(() => log.Error(msg)); //異步 // Task.Factory.StartNew(() =>log.Error(msg));// 這種異步也可以 //log.Error(msg); //這種也行跟你需要,性能越好,越強大,我還是使用異步方式 } /// <summary> /// /// </summary> /// <param name="ex"></param> public static void ErrorLog(Exception ex) { log4net.ILog log = log4net.LogManager.GetLogger("logerror"); Task.Run(() => log.Error(ex.Message.ToString() + "/r/n" + ex.Source.ToString() + "/r/n" + ex.TargetSite.ToString() + "/r/n" + ex.StackTrace.ToString())); } /// <summary> /// /// </summary> /// <param name="msg"></param> /// <param name="ex"></param> public static void ErrorLog(object msg, Exception ex) { log4net.ILog log = log4net.LogManager.GetLogger("logerror"); if (ex != null) { Task.Run(() => log.Error(msg, ex)); //異步 } else { Task.Run(() => log.Error(msg)); //異步 } } #endregion }
6、在program.cs或者Global.asax中進行初始化
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(root + "/Log4net.config"));
7、使用
Log4netHelper.WriteInfoLog("測試日志寫入2");