Log4net學習系列(二)——Log4net的例項
一、log4net簡單例項建立步驟如下
1、第一步:在專案中新增對log4net.dll的引用,這裡引用版本是2.0.8.0
2、第二步:程式啟動時讀取log4net的配置檔案。
讀取log4net的配置檔案有兩種方式
(1)如果是CS程式,在根目錄的Program.cs中的Main方法中新增:log4net.Config.XmlConfigurator.Configure();
如果是BS程式,在根目錄的Global.asax.cs(沒有新建一個)中的Application_Start方法中新增:log4net.Config.XmlConfigurator.Configure();
(2)無論BS還是CS程式都可直接在專案的AssemblyInfo.cs檔案裡新增以下的語句:[assembly: log4net.Config .XmlConfigurator()]
3、第三步:在程式使用。
二、具體程式碼解析
1、建立日誌級別列舉
public enum ELogLevel { /// <summary> /// 錯誤資訊 /// </summary> Error = 1, /// <summary> /// 跟蹤資訊/// </summary> Trace = 2, /// <summary> /// 除錯資訊 /// </summary> Debug = 3, /// <summary> /// 記錄資訊 /// </summary> Info = 4 }
2、定義ILog介面
public interface ILogger : IDisposable { void LogWithTime(stringmsg, ELogLevel logLevel = ELogLevel.Error); bool Enabled { get; set; } }
3、實現ILog介面並且通過程式碼讀取log4net.xml
public class FileLogger : ILogger { private log4net.ILog _log = null; private string _configLogLevel = null; private bool _enabled = true; public FileLogger() { this._configLogLevel = GetAppSettingValue("LogLevel"); string logName = GetAppSettingValue("LogName"); string configPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.xml"); log4net.Config.XmlConfigurator.Configure(new FileInfo(configPath)); this._log = log4net.LogManager.GetLogger(logName); } /// <summary> /// 獲取AppSetting的值 /// </summary> /// <returns></returns> public static string GetAppSettingValue(string key) { string value = null; foreach (string item in System.Configuration.ConfigurationManager.AppSettings) { if (item.Equals(key, StringComparison.CurrentCultureIgnoreCase)) { value = System.Configuration.ConfigurationManager.AppSettings[key]; break; } } return value; } #region ILogger成員 public void LogWithTime(string msg, ELogLevel logLevel) { if (string.IsNullOrWhiteSpace(msg) || !this._enabled) { return; } #if DEBUG Trace.TraceInformation(msg); #endif if (string.IsNullOrWhiteSpace(this._configLogLevel)) { this._configLogLevel = ((int)ELogLevel.Error).ToString(); } int configLogLevel = Convert.ToInt32(this._configLogLevel); if ((int)logLevel <= configLogLevel) { try { switch (logLevel) { case ELogLevel.Error: this._log.Error(msg); break; case ELogLevel.Trace: this._log.Warn(msg); break; case ELogLevel.Debug: this._log.Debug(msg); break; case ELogLevel.Info: this._log.Info(msg); break; default: break; } } catch { } } } public bool Enabled { get { return this._enabled; } set { this._enabled = value; } } #endregion #region IDisposable public void Dispose() { } #endregion }
4、使用log4net
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnLog4net_Click(object sender, EventArgs e) { ILogger _fileLogger = new FileLogger(); _fileLogger.LogWithTime("log4net 日誌記錄",ELogLevel.Info); MessageBox.Show("生成的日誌地址:"+System.AppDomain.CurrentDomain.BaseDirectory); } }
三、log4net.xml配置
<?xml version="1.0" encoding="utf-8" ?> <log4net debug="true"> <appender name="FlatFile" type="log4net.Appender.RollingFileAppender,log4net"> <param name="File" value="logs/website.log" /> <param name="Encoding" value="utf-8" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <param name="ImmediateFlush" value="true" /> <param name="MaximumFileSize" value="50MB"/> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <param name="DatePattern" value="-yyyy.MM.dd'.log'" /> <param name="StaticLogFileName" value="true" /> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%-5level [%logger] - %message [%date] %newline" /> </layout> </appender> <root> <priority value="DEBUG" /> <appender-ref ref="FlatFile" /> </root> </log4net>
四、注意事項
在Debug模式一切正常,但是在release模式下log4net不工作,查了很多資料,終於解決。具體做如下檢查修改。
1、檢查log4net寫入日誌檔案路徑是否正確;
2、檢查對應日誌檔案路徑是否有許可權;
3、檢查程式log4net配置獲取路徑;
最常見的問題是第三步,一般都是在AssemblyInfo.cs檔案中寫入如下程式碼
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", ConfigFileExtension = "xml", Watch = true)]
但這個方式在Debug模式下沒有問題,但是在release模式下就不好用了,需要在Global.asax檔案中具體再次指定配置檔案所在位置,例如:
string configPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.xml"); log4net.Config.XmlConfigurator.Configure(new FileInfo(configPath));
重新編譯釋出就可以了。