From 30f7c2ac47c8edd663bf937e34b488f0965ecb84 Mon Sep 17 00:00:00 2001 From: jhlee Date: Sun, 25 Jul 2021 18:18:11 +0900 Subject: [PATCH] =?UTF-8?q?DB=20Saver=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DataSaver/MainForm.Designer.cs | 102 +- DataSaver/MainForm.cs | 96 +- DataSaver/packages.config | 4 + Million/CommonProperty.cs | 21 +- Million/Data/MarketData.cs | 18 + Million/DbMangement/DBConnection.cs | 142 + Million/DbMangement/DBServiceFunctions.cs | 73 + Million/WebMangement/BitthumbWerServices.cs | 148 + Million/WebMangement/WebConnection.cs | 267 + Million/WebMangement/WebServiceFunctions.cs | 13 + packages/log4net.2.0.12/.signature.p7s | Bin 0 -> 9483 bytes packages/log4net.2.0.12/lib/net20/log4net.dll | Bin 0 -> 262144 bytes packages/log4net.2.0.12/lib/net20/log4net.xml | 31401 +++++++++++++++ .../lib/net35-client/log4net.dll | Bin 0 -> 266240 bytes .../lib/net35-client/log4net.xml | 32239 +++++++++++++++ packages/log4net.2.0.12/lib/net35/log4net.dll | Bin 0 -> 266240 bytes packages/log4net.2.0.12/lib/net35/log4net.xml | 32444 ++++++++++++++++ .../lib/net40-client/log4net.dll | Bin 0 -> 266240 bytes .../lib/net40-client/log4net.xml | 32239 +++++++++++++++ packages/log4net.2.0.12/lib/net40/log4net.dll | Bin 0 -> 270336 bytes packages/log4net.2.0.12/lib/net40/log4net.xml | 32444 ++++++++++++++++ packages/log4net.2.0.12/lib/net45/log4net.dll | Bin 0 -> 270336 bytes packages/log4net.2.0.12/lib/net45/log4net.xml | 32444 ++++++++++++++++ .../lib/netstandard1.3/log4net.dll | Bin 0 -> 241664 bytes .../lib/netstandard1.3/log4net.xml | 29751 ++++++++++++++ .../lib/netstandard2.0/log4net.dll | Bin 0 -> 258048 bytes .../lib/netstandard2.0/log4net.xml | 31018 +++++++++++++++ packages/log4net.2.0.12/log4net.2.0.12.nupkg | Bin 0 -> 2191785 bytes packages/log4net.2.0.12/package-icon.png | Bin 0 -> 40042 bytes 29 files changed, 254777 insertions(+), 87 deletions(-) create mode 100644 DataSaver/packages.config create mode 100644 Million/Data/MarketData.cs create mode 100644 Million/DbMangement/DBConnection.cs create mode 100644 Million/DbMangement/DBServiceFunctions.cs create mode 100644 Million/WebMangement/BitthumbWerServices.cs create mode 100644 Million/WebMangement/WebConnection.cs create mode 100644 Million/WebMangement/WebServiceFunctions.cs create mode 100644 packages/log4net.2.0.12/.signature.p7s create mode 100644 packages/log4net.2.0.12/lib/net20/log4net.dll create mode 100644 packages/log4net.2.0.12/lib/net20/log4net.xml create mode 100644 packages/log4net.2.0.12/lib/net35-client/log4net.dll create mode 100644 packages/log4net.2.0.12/lib/net35-client/log4net.xml create mode 100644 packages/log4net.2.0.12/lib/net35/log4net.dll create mode 100644 packages/log4net.2.0.12/lib/net35/log4net.xml create mode 100644 packages/log4net.2.0.12/lib/net40-client/log4net.dll create mode 100644 packages/log4net.2.0.12/lib/net40-client/log4net.xml create mode 100644 packages/log4net.2.0.12/lib/net40/log4net.dll create mode 100644 packages/log4net.2.0.12/lib/net40/log4net.xml create mode 100644 packages/log4net.2.0.12/lib/net45/log4net.dll create mode 100644 packages/log4net.2.0.12/lib/net45/log4net.xml create mode 100644 packages/log4net.2.0.12/lib/netstandard1.3/log4net.dll create mode 100644 packages/log4net.2.0.12/lib/netstandard1.3/log4net.xml create mode 100644 packages/log4net.2.0.12/lib/netstandard2.0/log4net.dll create mode 100644 packages/log4net.2.0.12/lib/netstandard2.0/log4net.xml create mode 100644 packages/log4net.2.0.12/log4net.2.0.12.nupkg create mode 100644 packages/log4net.2.0.12/package-icon.png diff --git a/DataSaver/MainForm.Designer.cs b/DataSaver/MainForm.Designer.cs index 2ed9652..568c997 100644 --- a/DataSaver/MainForm.Designer.cs +++ b/DataSaver/MainForm.Designer.cs @@ -35,15 +35,13 @@ this.label_ExchangePlace = new System.Windows.Forms.Label(); this.comboBoxEdit_ExchangePlace = new DevExpress.XtraEditors.ComboBoxEdit(); this.groupBox_데이터누적 = new System.Windows.Forms.GroupBox(); + this.label_종목타입 = new System.Windows.Forms.Label(); + this.label_종목이름 = new System.Windows.Forms.Label(); this.label_종목코드 = new System.Windows.Forms.Label(); + this.comboBoxEdit_PaymentType = new DevExpress.XtraEditors.ComboBoxEdit(); this.comboBoxEdit_MarketInfo = new DevExpress.XtraEditors.ComboBoxEdit(); this.button_AllMarketDataAcc = new System.Windows.Forms.Button(); this.button_SelectedMarketDataAcc = new System.Windows.Forms.Button(); - this.groupBox_종목업데이트 = new System.Windows.Forms.GroupBox(); - this.button_SelectedPlaceMarketUpdate = new System.Windows.Forms.Button(); - this.comboBoxEdit_PaymentType = new DevExpress.XtraEditors.ComboBoxEdit(); - this.label_종목타입 = new System.Windows.Forms.Label(); - this.label_종목이름 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.panelControl1)).BeginInit(); this.panelControl1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.listBoxControl_logViewer)).BeginInit(); @@ -52,9 +50,8 @@ this.groupBox_DB접속.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.comboBoxEdit_ExchangePlace.Properties)).BeginInit(); this.groupBox_데이터누적.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.comboBoxEdit_MarketInfo.Properties)).BeginInit(); - this.groupBox_종목업데이트.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.comboBoxEdit_PaymentType.Properties)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.comboBoxEdit_MarketInfo.Properties)).BeginInit(); this.SuspendLayout(); // // panelControl1 @@ -63,7 +60,7 @@ this.panelControl1.Dock = System.Windows.Forms.DockStyle.Right; this.panelControl1.Location = new System.Drawing.Point(246, 0); this.panelControl1.Name = "panelControl1"; - this.panelControl1.Size = new System.Drawing.Size(227, 322); + this.panelControl1.Size = new System.Drawing.Size(227, 251); this.panelControl1.TabIndex = 0; // // listBoxControl_logViewer @@ -71,18 +68,17 @@ this.listBoxControl_logViewer.Dock = System.Windows.Forms.DockStyle.Fill; this.listBoxControl_logViewer.Location = new System.Drawing.Point(2, 2); this.listBoxControl_logViewer.Name = "listBoxControl_logViewer"; - this.listBoxControl_logViewer.Size = new System.Drawing.Size(223, 318); + this.listBoxControl_logViewer.Size = new System.Drawing.Size(223, 247); this.listBoxControl_logViewer.TabIndex = 0; // // panelControl2 // this.panelControl2.Controls.Add(this.groupBox_DB접속); this.panelControl2.Controls.Add(this.groupBox_데이터누적); - this.panelControl2.Controls.Add(this.groupBox_종목업데이트); this.panelControl2.Dock = System.Windows.Forms.DockStyle.Fill; this.panelControl2.Location = new System.Drawing.Point(0, 0); this.panelControl2.Name = "panelControl2"; - this.panelControl2.Size = new System.Drawing.Size(246, 322); + this.panelControl2.Size = new System.Drawing.Size(246, 251); this.panelControl2.TabIndex = 1; // // groupBox_DB접속 @@ -124,13 +120,31 @@ this.groupBox_데이터누적.Controls.Add(this.comboBoxEdit_MarketInfo); this.groupBox_데이터누적.Controls.Add(this.button_AllMarketDataAcc); this.groupBox_데이터누적.Controls.Add(this.button_SelectedMarketDataAcc); - this.groupBox_데이터누적.Location = new System.Drawing.Point(13, 132); + this.groupBox_데이터누적.Location = new System.Drawing.Point(13, 62); this.groupBox_데이터누적.Name = "groupBox_데이터누적"; this.groupBox_데이터누적.Size = new System.Drawing.Size(215, 181); this.groupBox_데이터누적.TabIndex = 0; this.groupBox_데이터누적.TabStop = false; this.groupBox_데이터누적.Text = "데이터 누적"; // + // label_종목타입 + // + this.label_종목타입.AutoSize = true; + this.label_종목타입.Location = new System.Drawing.Point(14, 74); + this.label_종목타입.Name = "label_종목타입"; + this.label_종목타입.Size = new System.Drawing.Size(63, 14); + this.label_종목타입.TabIndex = 4; + this.label_종목타입.Text = "종목 타입 : "; + // + // label_종목이름 + // + this.label_종목이름.AutoSize = true; + this.label_종목이름.Location = new System.Drawing.Point(14, 103); + this.label_종목이름.Name = "label_종목이름"; + this.label_종목이름.Size = new System.Drawing.Size(63, 14); + this.label_종목이름.TabIndex = 4; + this.label_종목이름.Text = "종목 이름 : "; + // // label_종목코드 // this.label_종목코드.AutoSize = true; @@ -140,6 +154,15 @@ this.label_종목코드.TabIndex = 4; this.label_종목코드.Text = "종목 코드"; // + // comboBoxEdit_PaymentType + // + this.comboBoxEdit_PaymentType.Location = new System.Drawing.Point(83, 71); + this.comboBoxEdit_PaymentType.Name = "comboBoxEdit_PaymentType"; + this.comboBoxEdit_PaymentType.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { + new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)}); + this.comboBoxEdit_PaymentType.Size = new System.Drawing.Size(113, 20); + this.comboBoxEdit_PaymentType.TabIndex = 3; + // // comboBoxEdit_MarketInfo // this.comboBoxEdit_MarketInfo.Location = new System.Drawing.Point(83, 97); @@ -171,59 +194,11 @@ this.button_SelectedMarketDataAcc.UseVisualStyleBackColor = true; this.button_SelectedMarketDataAcc.Click += new System.EventHandler(this.button_SelectedMarketDataAcc_Click); // - // groupBox_종목업데이트 - // - this.groupBox_종목업데이트.Controls.Add(this.button_SelectedPlaceMarketUpdate); - this.groupBox_종목업데이트.Location = new System.Drawing.Point(13, 69); - this.groupBox_종목업데이트.Name = "groupBox_종목업데이트"; - this.groupBox_종목업데이트.Size = new System.Drawing.Size(215, 57); - this.groupBox_종목업데이트.TabIndex = 0; - this.groupBox_종목업데이트.TabStop = false; - this.groupBox_종목업데이트.Text = "종목 업데이트"; - // - // button_SelectedPlaceMarketUpdate - // - this.button_SelectedPlaceMarketUpdate.Location = new System.Drawing.Point(14, 21); - this.button_SelectedPlaceMarketUpdate.Name = "button_SelectedPlaceMarketUpdate"; - this.button_SelectedPlaceMarketUpdate.Size = new System.Drawing.Size(182, 23); - this.button_SelectedPlaceMarketUpdate.TabIndex = 0; - this.button_SelectedPlaceMarketUpdate.Text = "선택 거래소 종목 업데이트"; - this.button_SelectedPlaceMarketUpdate.UseVisualStyleBackColor = true; - this.button_SelectedPlaceMarketUpdate.Click += new System.EventHandler(this.button_SelectedPlaceMarketUpdate_Click); - // - // comboBoxEdit_PaymentType - // - this.comboBoxEdit_PaymentType.Location = new System.Drawing.Point(83, 71); - this.comboBoxEdit_PaymentType.Name = "comboBoxEdit_PaymentType"; - this.comboBoxEdit_PaymentType.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { - new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)}); - this.comboBoxEdit_PaymentType.Size = new System.Drawing.Size(113, 20); - this.comboBoxEdit_PaymentType.TabIndex = 3; - this.comboBoxEdit_PaymentType.SelectedIndexChanged += new System.EventHandler(this.comboBoxEdit_ExchangePlace_SelectedIndexChanged); - // - // label_종목타입 - // - this.label_종목타입.AutoSize = true; - this.label_종목타입.Location = new System.Drawing.Point(14, 74); - this.label_종목타입.Name = "label_종목타입"; - this.label_종목타입.Size = new System.Drawing.Size(63, 14); - this.label_종목타입.TabIndex = 4; - this.label_종목타입.Text = "종목 타입 : "; - // - // label_종목이름 - // - this.label_종목이름.AutoSize = true; - this.label_종목이름.Location = new System.Drawing.Point(14, 103); - this.label_종목이름.Name = "label_종목이름"; - this.label_종목이름.Size = new System.Drawing.Size(63, 14); - this.label_종목이름.TabIndex = 4; - this.label_종목이름.Text = "종목 이름 : "; - // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(473, 322); + this.ClientSize = new System.Drawing.Size(473, 251); this.Controls.Add(this.panelControl2); this.Controls.Add(this.panelControl1); this.Name = "MainForm"; @@ -238,9 +213,8 @@ ((System.ComponentModel.ISupportInitialize)(this.comboBoxEdit_ExchangePlace.Properties)).EndInit(); this.groupBox_데이터누적.ResumeLayout(false); this.groupBox_데이터누적.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.comboBoxEdit_MarketInfo.Properties)).EndInit(); - this.groupBox_종목업데이트.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.comboBoxEdit_PaymentType.Properties)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.comboBoxEdit_MarketInfo.Properties)).EndInit(); this.ResumeLayout(false); } @@ -250,13 +224,11 @@ private DevExpress.XtraEditors.PanelControl panelControl1; private DevExpress.XtraEditors.ListBoxControl listBoxControl_logViewer; private DevExpress.XtraEditors.PanelControl panelControl2; - private System.Windows.Forms.GroupBox groupBox_종목업데이트; private System.Windows.Forms.GroupBox groupBox_DB접속; private System.Windows.Forms.Label label_ExchangePlace; private DevExpress.XtraEditors.ComboBoxEdit comboBoxEdit_ExchangePlace; private System.Windows.Forms.GroupBox groupBox_데이터누적; private System.Windows.Forms.Button button_SelectedMarketDataAcc; - private System.Windows.Forms.Button button_SelectedPlaceMarketUpdate; private System.Windows.Forms.Button button_AllMarketDataAcc; private System.Windows.Forms.Label label_종목코드; private DevExpress.XtraEditors.ComboBoxEdit comboBoxEdit_MarketInfo; diff --git a/DataSaver/MainForm.cs b/DataSaver/MainForm.cs index 34dc4f7..dd37541 100644 --- a/DataSaver/MainForm.cs +++ b/DataSaver/MainForm.cs @@ -1,6 +1,9 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Windows.Forms; using Million; +using Million.Data; namespace DataSaver { @@ -21,10 +24,9 @@ namespace DataSaver // 거래소 정보 콤보박스 초기화 comboBoxEdit_ExchangePlace.Properties.Items.Clear(); // Million으로부터 거래소 정보 가져오기 - comboBoxEdit_ExchangePlace.Properties.Items.AddRange(Enum.GetNames(enumType: typeof(Million.CommonProperty.ExchangePlace))); - ///TODO 임시로 Upbit 우선순위 설정 - comboBoxEdit_ExchangePlace.SelectedIndex = 1; - + var exchangePlaceNames = Enum.GetNames(enumType: typeof(Million.CommonProperty.ExchangePlace)); + comboBoxEdit_ExchangePlace.Properties.Items.AddRange(exchangePlaceNames); + // 종목 타입 설정 comboBoxEdit_PaymentType.Properties.Items.AddRange(Enum.GetNames(enumType: typeof(Million.CommonProperty.PaymentType))); comboBoxEdit_PaymentType.SelectedIndex = 0; @@ -33,10 +35,21 @@ namespace DataSaver var strConn = Million.CommonProperty.DbConnectionStr + comboBoxEdit_ExchangePlace.EditValue; Million.CommonProperty.ConDbConnectionStr = strConn; - // DB 종목(Market) 정보 가져오기 + // Market Table없으면 생성해주기 + foreach (var placeName in exchangePlaceNames) + { + var createTableSql = Million.DbManagement.DbServiceFunctions.CreateMarketTableQuery(placeName); + Million.DbManagement.DBConnection.QueryUpdateExcuter + (CommonProperty.DbConnectionMarket, createTableSql); + } + + /////TODO 임시로 Upbit 우선순위 설정 + comboBoxEdit_ExchangePlace.SelectedIndex = 0; } + + /// /// 거래소 콤보박스 아이템 변경 시 이벤트 /// @@ -45,8 +58,12 @@ namespace DataSaver private void comboBoxEdit_ExchangePlace_SelectedIndexChanged(object sender, EventArgs e) { // DB 서버 정보 수정 - var strConn = Million.CommonProperty.DbConnectionStr + comboBoxEdit_ExchangePlace.EditValue; - Million.CommonProperty.ConDbConnectionStr = strConn; + //var strConn = Million.CommonProperty.DbConnectionStr + comboBoxEdit_ExchangePlace.EditValue; + //Million.CommonProperty.ConDbConnectionStr = strConn; + + // DB 종목(Market) 정보 가져오기 + Million.DbManagement.DbServiceFunctions.GetMarketTable_FromDB(comboBoxEdit_ExchangePlace.SelectedItem.ToString()); + updateMarketTableOfPlace(); } /// @@ -69,22 +86,65 @@ namespace DataSaver } + + /// /// 선택한 거래소의 종목(Market) 업데이트 /// - /// - /// - private void button_SelectedPlaceMarketUpdate_Click(object sender, EventArgs e) + private void updateMarketTableOfPlace() { - // DB에서 종목(Market) 정보 조회 후 없으면 추가 생성하기 + var dbMarketDataList = CommonProperty.selectedMarketOfPlaceList; - // #1. Web에서 Market 정보 가져오기 - // TODO 추후 공통화 - var marketDataList_FromWeb = Million.WebServices.WebConnection.SendWebServer(CommonProperty.ExchangeWebReqType.UpbitMarket, DateTime.Now); - // #1-1. DB에서 Market 정보 조 - var marketDataListFromDb = Million.DbManagement.DbServiceFunctions.GetMarketTable_FromDB( - comboBoxEdit_ExchangePlace.SelectedItem.ToString()); - // #2. 비교후 Market 테이블 생성 + //거래소 가져오기 + var placeIndex = comboBoxEdit_ExchangePlace.SelectedIndex; + CommonProperty.recentlyMarketOfPlaceList = new List(); + + switch (placeIndex) + { + case (int)CommonProperty.ExchangePlace.Upbit: + CommonProperty.recentlyMarketOfPlaceList = (List) + Million.WebServices.WebConnection.SendWebServer(CommonProperty.ExchangeWebReqType.UpbitMarket, + DateTime.Now); + + break; + //case (int)CommonProperty.ExchangePlace.Bithumb: + // marketList = Million.DbManagement.DbServiceFunctions.GetMarketTable_FromDB( + // comboBoxEdit_ExchangePlace.SelectedItem.ToString()); + // break; + } + + // 비교 + // insert (신규) + var insertData = new List(); + + var sqlQuery = ""; + + var insertDatasss = CommonProperty.recentlyMarketOfPlaceList + .Where(x => dbMarketDataList.Count(s => x.CodeFullName == s.CodeFullName) == 0).ToList(); + + + //var insertDatas = CommonProperty.recentlyMarketOfPlaceList.Except(dbMarketDataList).ToList(); + + + foreach (var data in CommonProperty.recentlyMarketOfPlaceList) + { + if (!dbMarketDataList.Any(t => t.CodeFullName == data.CodeFullName)) + sqlQuery += string.Format( + "INSERT INTO [dbo].[{0}]([CodeFullName], [ExchangePlace], [KorName], [CodeName], [Payment], [IsValid]) VALUES ('{1}','{2}','{3}','{4}','{5}',{6})", + comboBoxEdit_ExchangePlace.SelectedItem, data.CodeFullName, + data.ExchangePlace, data.KorName, data.CodeName, data.Payment, 1); + } + + foreach (var data in dbMarketDataList) + { + if (!CommonProperty.recentlyMarketOfPlaceList.Any(t => t.CodeFullName == data.CodeFullName) && data.IsValid) + sqlQuery += string.Format( + "UPDATE [dbo].[{0}] SET IsValid = 0 WHERE [CodeFullName] = '{1}'", + comboBoxEdit_ExchangePlace.SelectedItem, + data.CodeFullName); + } + if(!string.IsNullOrWhiteSpace(sqlQuery)) + Million.DbManagement.DBConnection.QueryUpdateExcuter(CommonProperty.DbConnectionMarket, sqlQuery); } } } diff --git a/DataSaver/packages.config b/DataSaver/packages.config new file mode 100644 index 0000000..15e61b8 --- /dev/null +++ b/DataSaver/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Million/CommonProperty.cs b/Million/CommonProperty.cs index 5619e57..1922506 100644 --- a/Million/CommonProperty.cs +++ b/Million/CommonProperty.cs @@ -4,6 +4,7 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using DevExpress.XtraReports.UI; using Million.Data; namespace Million @@ -24,9 +25,8 @@ namespace Million // 거래소 타입 public enum ExchangePlace { - Bithumb = 0, - Upbit = 1, - AllExchangePlace = 10 + Upbit = 0, + Bithumb = 1 } // 코인 Payument 타입 @@ -106,9 +106,22 @@ namespace Million private const string DbServerUserId = "million"; private const string DbServerUserPassword = "million!"; public static string DbConnectionStr = $"Data Source={DbServerIp};uid={DbServerUserId};pwd={DbServerUserPassword};Database="; - + public static string DbConnectionMarket = DbConnectionStr + "Market"; + #endregion + + + #region DataSaver 사용되는 공용 변수 //현재 시점에서 사용되고 있는 DB Connection String public static string ConDbConnectionStr = DbConnectionStr; + + // 현재 시점에서 사용되고 있는 Place의 Market List 정보 + public static List selectedMarketOfPlaceList = null; + public static List recentlyMarketOfPlaceList = null; + + #endregion + + + } } diff --git a/Million/Data/MarketData.cs b/Million/Data/MarketData.cs new file mode 100644 index 0000000..908838f --- /dev/null +++ b/Million/Data/MarketData.cs @@ -0,0 +1,18 @@ +namespace Million.Data +{ + public class MarketData + { + // 거래소 + public string ExchangePlace { get; set; } + // 코인 이름 + public string KorName { get; set; } + // 코인 코드 + public string CodeName { get; set; } + // BTC, KRW 구분 + public string Payment { get; set; } + // 코인- Payment (Key로 사용) + public string CodeFullName { get; set; } + + public bool IsValid { get; set; } = true; + } +} diff --git a/Million/DbMangement/DBConnection.cs b/Million/DbMangement/DBConnection.cs new file mode 100644 index 0000000..e7b1d6e --- /dev/null +++ b/Million/DbMangement/DBConnection.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.Data.SqlClient; +using System.Windows.Forms; +using DevExpress.Charts.Native; +using DevExpress.DataAccess.Native.Sql; +using Million.Data; + +namespace Million.DbManagement +{ + /// + /// DB Connection 및 Default Query 함수 + /// + public class DBConnection + { + public static string GetConnectionString(string databaseName) + { + return CommonProperty.DbConnectionStr + databaseName; + } + + public static List QueryUpdateExcuter_Market(string strDBCon, string sqlQuery) + { + if (string.IsNullOrWhiteSpace(sqlQuery)) + return null; + + List marketDatas = new List(); + + SqlConnection conn = null; + SqlDataReader rdr = null; + try + { + using (conn = new SqlConnection(strDBCon)) + { + + using (var cmd = new SqlCommand(sqlQuery, conn)) + { + conn.Open(); + using (rdr = cmd.ExecuteReader()) + { + + while (rdr.Read()) + { + var marKetData = new MarketData(); + marKetData.CodeName = rdr["CodeName"].ToString(); + marKetData.CodeFullName = rdr["CodeFullName"].ToString(); + marKetData.ExchangePlace = rdr["ExchangePlace"].ToString(); + marKetData.Payment = rdr["Payment"].ToString(); + marKetData.KorName = rdr["KorName"].ToString(); + marKetData.IsValid = bool.Parse(rdr["IsValid"].ToString()); + marketDatas.Add(marKetData); + } + + } + } + } + } + catch (Exception ex) + { + Console.WriteLine(" ============= exception ==============="); + Console.WriteLine(ex.Message); + marketDatas = null; + } + finally + { + if (rdr != null) + rdr.Close(); + if (conn != null) + conn.Close(); + } + + + return marketDatas; + } + + public static object QueryUpdateExcuter_Candle(string strDBCon, string sqlQuery) + { + if (string.IsNullOrWhiteSpace(sqlQuery)) + return false; + + using (var conn = new SqlConnection(strDBCon)) + { + using (var cmd = new SqlCommand(sqlQuery, conn)) + { + try + { + conn.Open(); + using (var rdr = cmd.ExecuteReader()) + { + + rdr.Close(); + } + + conn.Close(); + } + catch (Exception ex) + { + Console.WriteLine(" ============= exception ==============="); + Console.WriteLine(ex.Message); + conn.Close(); + return false; + } + } + } + + return true; + } + + /// + /// Create Market Table + /// + /// conn + /// create table sql + public static void QueryUpdateExcuter(string strDBCon, string sqlQuery) + { + SqlConnection conn = null; + SqlDataReader rdr = null; + + try + { + using (conn = new SqlConnection(strDBCon)) + { + using (var cmd = new SqlCommand(sqlQuery, conn)) + { + conn.Open(); + using (rdr = cmd.ExecuteReader()) + { + } + } + + conn.Close(); + } + } + catch (Exception e) + { + Console.WriteLine(" ============= exception ==============="); + Console.WriteLine(e.Message); + rdr.Close(); + conn.Close(); + } + } + } +} diff --git a/Million/DbMangement/DBServiceFunctions.cs b/Million/DbMangement/DBServiceFunctions.cs new file mode 100644 index 0000000..e2b948a --- /dev/null +++ b/Million/DbMangement/DBServiceFunctions.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using Million.Data; + +namespace Million.DbManagement +{ + public class DbServiceFunctions + { + /// + /// DB Market 테이블 생성 + /// + /// + /// + public static string CreateMarketTableQuery(string tableName) + { + var resultstring = ""; + + if (!string.IsNullOrWhiteSpace(tableName)) + { + resultstring = @"if not exists (select * from sysobjects where name='" + tableName + @"' and xtype='U') + create table " + "\"" + tableName + "\"" + @"( + ExchangePlace nvarchar(50) not null, + KorName nvarchar(50), + CodeFullName nvarchar(50) not null, + CodeName nvarchar(50) not null, + Payment nvarchar(50) not null, + IsValid bit not null + ) "; + } + return resultstring; + } + + /// + /// DB 거래소 내 Market 테이블 생성 + /// + /// + /// + public static string CreateMarketTable_ToDB(string tableName) + { + var resultstring = ""; + + if (!string.IsNullOrWhiteSpace(tableName)) + { + resultstring = @"if not exists (select * from sysobjects where name='" + tableName + @"' and xtype='U') + create table " + "\"" + tableName + "\"" + @"( + DateTime datetime not null, + StartValue float not null, + EndValue float not null, + HighValue float not null, + LowValue float not null, + MoneyValue float not null, + CandleTimeType int not null + ) "; + } + return resultstring; + } + + /// + /// DB로부터 코인(Market) 정보 가져오기 + /// + /// + /// + public static void GetMarketTable_FromDB(string TableName) + { + var strDbCon = $"{CommonProperty.DbConnectionStr}Market"; + + // Query문 만들기 + var sqlQuery = string.Format("select * from dbo.{0} where IsValid = 1", TableName); + + CommonProperty.selectedMarketOfPlaceList = DBConnection.QueryUpdateExcuter_Market(strDbCon, sqlQuery); + } + } +} diff --git a/Million/WebMangement/BitthumbWerServices.cs b/Million/WebMangement/BitthumbWerServices.cs new file mode 100644 index 0000000..b190909 --- /dev/null +++ b/Million/WebMangement/BitthumbWerServices.cs @@ -0,0 +1,148 @@ +using System; +using System.IO; +using System.Net; +using System.Security.Cryptography; +using System.Text; +using System.Windows.Forms; +using Newtonsoft.Json.Linq; + +namespace Million.WebServices +{ + public class BitthumbWerServices + { + private string m_sAPI_URL = "https://api.bithumb.com"; + private string m_sAPI_Key = "f248c48ba6e8f68a2993e7036aed3d13"; + private string m_sAPI_Secret = "75eed1ee3ed5d8b09050e54609767f53"; + private string sParams = "order_currency=BTC&payment_currency=KRW"; + + public BitthumbWerServices(string sAPI_Key = null, string sAPI_Secret = null) + { + if (sAPI_Key != null) + this.m_sAPI_Key = sAPI_Key; + if (sAPI_Secret != null) + this.m_sAPI_Secret = sAPI_Secret; + } + + private string ByteToString(byte[] rgbyBuff) + { + string sHexStr = ""; + + + for (int nCnt = 0; nCnt < rgbyBuff.Length; nCnt++) + { + sHexStr += rgbyBuff[nCnt].ToString("x2"); // Hex format + } + + return (sHexStr); + } + + + private byte[] StringToByte(string sStr) + { + byte[] rgbyBuff = Encoding.UTF8.GetBytes(sStr); + + return (rgbyBuff); + } + + + private long MicroSecTime() + { + long nEpochTicks = 0; + long nUnixTimeStamp = 0; + long nNowTicks = 0; + long nowMiliseconds = 0; + string sNonce = ""; + DateTime DateTimeNow; + + + nEpochTicks = new DateTime(1970, 1, 1).Ticks; + //DateTimeNow = new DateTime(2021, 4, 18, 0, 0, 0).ToUniversalTime(); + DateTimeNow = DateTime.UtcNow; + nNowTicks = DateTimeNow.Ticks; + nowMiliseconds = DateTimeNow.Millisecond; + + nUnixTimeStamp = ((nNowTicks - nEpochTicks) / TimeSpan.TicksPerSecond); + + sNonce = nUnixTimeStamp.ToString() + nowMiliseconds.ToString("D03"); + + return (Convert.ToInt64(sNonce)); + } + + + private string Hash_HMAC(string sKey, string sData) + { + byte[] rgbyKey = Encoding.UTF8.GetBytes(sKey); + + + using (var hmacsha512 = new HMACSHA512(rgbyKey)) + { + hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(sData)); + + return (ByteToString(hmacsha512.Hash)); + } + } + + public JObject xcoinApiCall(string sEndPoint, string sParams, ref string sRespBodyData) + { + string sAPI_Sign = ""; + string sPostData = sParams; + string sHMAC_Key = ""; + string sHMAC_Data = ""; + string sResult = ""; + long nNonce = 0; + HttpStatusCode nCode = 0; + + + sPostData += "&endpoint=" + Uri.EscapeDataString(sEndPoint); + + try + { + HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(this.m_sAPI_URL + sEndPoint); + byte[] rgbyData = Encoding.ASCII.GetBytes(sPostData); + + nNonce = MicroSecTime(); + + sHMAC_Key = this.m_sAPI_Secret; + sHMAC_Data = sEndPoint + (char)0 + sPostData + (char)0 + nNonce.ToString(); + sResult = Hash_HMAC(sHMAC_Key, sHMAC_Data); + sAPI_Sign = Convert.ToBase64String(StringToByte(sResult)); + + Request.Headers.Add("Api-Key", this.m_sAPI_Key); + Request.Headers.Add("Api-Sign", sAPI_Sign); + Request.Headers.Add("Api-Nonce", nNonce.ToString()); + + Request.Method = "POST"; + + Request.ContentType = "application/x-www-form-urlencoded"; + Request.ContentLength = rgbyData.Length; + + using (var stream = Request.GetRequestStream()) + { + stream.Write(rgbyData, 0, rgbyData.Length); + } + + var Response = (HttpWebResponse)Request.GetResponse(); + + sRespBodyData = new StreamReader(Response.GetResponseStream()).ReadToEnd(); + + return (JObject.Parse(sRespBodyData)); + } + catch (WebException webEx) + { + using (HttpWebResponse Response = (HttpWebResponse)webEx.Response) + { + nCode = Response.StatusCode; + + using (StreamReader reader = new StreamReader(Response.GetResponseStream())) + { + sRespBodyData = reader.ReadToEnd(); + + return (JObject.Parse(sRespBodyData)); + } + } + } + + return (null); + } + } +} diff --git a/Million/WebMangement/WebConnection.cs b/Million/WebMangement/WebConnection.cs new file mode 100644 index 0000000..5a8907b --- /dev/null +++ b/Million/WebMangement/WebConnection.cs @@ -0,0 +1,267 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.WebSockets; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using System.Security.Cryptography; +using DevExpress.DashboardWin.Native; +using DevExpress.Utils.OAuth; +using DevExpress.XtraEditors.Filtering.Templates; +using Million.Data; +using Newtonsoft.Json; + +namespace Million.WebServices +{ + /// + /// Web 접속 및 Web 서비스 관련 클래스 + /// + public class WebConnection + { + public static object SendWebServer(CommonProperty.ExchangeWebReqType exchangeWebReqType,DateTime dateTime, string postData = "") + { + var returnJsonData = new Dictionary(); + + try + { + HttpWebRequest wReq = null; + + // Post 방식인 경우만 사용 + var rgbyData = Encoding.ASCII.GetBytes(postData); + + // 웹 전송 타입 지정 + var webConType = CommonProperty.WebConnectionType.GET; + + // 1. WebRequest 객체 형성 및 HttpWebRequest 로 형변환 + // 2. 거래소에 따른 헤더 파일 처리(POST 일 경우만 지정함) + + switch (exchangeWebReqType) + { + #region Bithum + // 빗썸 캔들 데이터 + case CommonProperty.ExchangeWebReqType.BithumbCandleStick: + wReq = (HttpWebRequest)WebRequest.Create(new Uri(CommonProperty.BithumbURL_CandleStick)); + SetBithumHeader(wReq, "", "", "", "", dateTime); + break; + // 빗썸 종목 + case CommonProperty.ExchangeWebReqType.BithumbMarket: + wReq = (HttpWebRequest)WebRequest.Create(new Uri(CommonProperty.BithumbURL_CoinGoods)); + break; + #endregion + + #region Upbit + case CommonProperty.ExchangeWebReqType.UpbitMarket: + wReq = (HttpWebRequest)WebRequest.Create(new Uri(CommonProperty.UpbitURL_MarketInfo)); + break; + #endregion + + } + + // GET, POST 구분 + switch (webConType) + { + case CommonProperty.WebConnectionType.GET: + break; + case CommonProperty.WebConnectionType.POST: + wReq.Method = "POST"; // 전송 방법 "GET" or "POST" + using (var stream = wReq.GetRequestStream()) + { + stream.Write(rgbyData, 0, rgbyData.Length); + } + wReq.ContentType = "application/x-www-form-urlencoded"; + wReq.ContentLength = rgbyData.Length; + break; + } + + using (var wRes = (HttpWebResponse)wReq.GetResponse()) + { + var respPostStream = wRes.GetResponseStream(); + var readerPost = new StreamReader(respPostStream, Encoding.UTF8, true); + var resResult = readerPost.ReadToEnd(); + var resultData = JsonConvert.DeserializeObject>>(resResult); + + // 오류 코드 예외처리 + /* + var resultDataList = resultData["status"].ToString().Equals("0000") + ? resultData["data"] + : null;*/ + + switch (exchangeWebReqType) + { + #region MyRegion + /* + // 빗썸 캔들 데이터 + case CommonProperty.ExchangeWebReqType.BithumbCandleStick: + + var candleResultDataList = JsonConvert.DeserializeObject>>(resultDataList.ToString()); + var candleDataList = new CandleDataList(); + foreach (var data in candleResultDataList) + { + + } + + break; + // 빗썸 종목 + + case CommonProperty.ExchangeWebReqType.BithumbMarket: + + var objectList = JsonConvert.DeserializeObject>(resultDataList.ToString()); + var Payment = objectList["payment_currency"].ToString(); + objectList.Remove("payment_currency"); + objectList.Remove("timestamp"); + + var conMarketDatas = new List(); + + foreach (var item in objectList) + { + var tempMarketData = new MarketData(); + tempMarketData.CodeName = item.Key; + tempMarketData.ExchangePlace = CommonProperty.ExchangePlace.Bithumb; + tempMarketData.KorName = ""; + tempMarketData.Payment = Payment; + + conMarketDatas.Add(tempMarketData); + } + + return conMarketDatas; + break;*/ + #endregion + + #region Upbit + case CommonProperty.ExchangeWebReqType.UpbitMarket: + var marKetDataList = new List(); + foreach (var item in resultData) + { + var marketData = new MarketData(); + marketData.CodeFullName = item["market"].ToString(); + var names = marketData.CodeFullName.Split('-'); + marketData.CodeName = names[1]; + marketData.KorName = item["korean_name"].ToString(); + marketData.Payment = names[0]; + marketData.ExchangePlace = + marketData.ExchangePlace = Enum.GetName(typeof(CommonProperty.ExchangePlace),CommonProperty.ExchangePlace.Upbit); + marKetDataList.Add(marketData); + } + return marKetDataList; + #endregion + + + } + + } + + } + catch (WebException webEx) + { + using (var Response = (HttpWebResponse)webEx.Response) + { + var nCode = Response.StatusCode; + + using (var reader = new StreamReader(Response.GetResponseStream())) + { + var sRespBodyData = reader.ReadToEnd(); + + //return (JObject.Parse(sRespBodyData)); + } + } + } + + return returnJsonData; + } + + #region 빗썸 API Key 및 헤더 사용 + /// + /// 빗썸 Request 헤더 데이터 추가 + /// + /// + /// /public/candlestick + /// + /// + /// + /// + /// + public static HttpWebRequest SetBithumHeader(HttpWebRequest wReq, string sPostData, string endPoint, string sApiSecret, string sApiKey, DateTime dateTime) + { + var sAPI_Sign = ""; + var nNonce = MicroSecTime(dateTime); + + // POST 데이터인 경우에 Key 값 채움 + if (!string.IsNullOrEmpty(sPostData)) + { + var sHMAC_Key = sApiSecret; + var sHMAC_Data = endPoint + (char)0 + sPostData + (char)0 + nNonce.ToString(); + var sResult = Hash_HMAC(sHMAC_Key, sHMAC_Data); + sAPI_Sign = Convert.ToBase64String(StringToByte(sResult)); + } + + wReq.Headers.Add("Api-Key", sApiKey); + wReq.Headers.Add("Api-Sign", sAPI_Sign); + wReq.Headers.Add("Api-Nonce", nNonce.ToString()); + + return wReq; + } + + + // 바이트 to String 변환 + private static string ByteToString(byte[] rgbyBuff) + { + var sHexStr = ""; + + + for (var nCnt = 0; nCnt < rgbyBuff.Length; nCnt++) + { + sHexStr += nCnt.ToString("x2"); // Hex format + } + + return (sHexStr); + } + + // String to Byte 변환 + private static byte[] StringToByte(string sStr) + { + var rgbyBuff = Encoding.UTF8.GetBytes(sStr); + + return (rgbyBuff); + } + + // 빗썸 DateTime 형식 변환 + private static long MicroSecTime(DateTime dateTime) + { + long nEpochTicks = 0; + long nUnixTimeStamp = 0; + long nNowTicks = 0; + long nowMiliseconds = 0; + var sNonce = ""; + + nEpochTicks = new DateTime(1970, 1, 1).Ticks; + dateTime = dateTime.ToUniversalTime(); + nNowTicks = dateTime.Ticks; + nowMiliseconds = dateTime.Millisecond; + + nUnixTimeStamp = ((nNowTicks - nEpochTicks) / TimeSpan.TicksPerSecond); + + sNonce = nUnixTimeStamp.ToString() + nowMiliseconds.ToString("D03"); + + return (Convert.ToInt64(sNonce)); + } + + private static string Hash_HMAC(string sKey, string sData) + { + var rgbyKey = Encoding.UTF8.GetBytes(sKey); + + + using (var hmacsha512 = new HMACSHA512(rgbyKey)) + { + hmacsha512.ComputeHash(Encoding.UTF8.GetBytes(sData)); + + return (ByteToString(hmacsha512.Hash)); + } + } + #endregion + + } +} diff --git a/Million/WebMangement/WebServiceFunctions.cs b/Million/WebMangement/WebServiceFunctions.cs new file mode 100644 index 0000000..51eefc2 --- /dev/null +++ b/Million/WebMangement/WebServiceFunctions.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Million.WebServices +{ + class WebServiceFunctions + { + + } +} diff --git a/packages/log4net.2.0.12/.signature.p7s b/packages/log4net.2.0.12/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..93dfe3890f8459e45ae43e77deec1ad76fa6b474 GIT binary patch literal 9483 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 T@$W|0qS7x|>fx0hp&R}O2<UD>dGxK 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�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 Gf&T+=dSYJy literal 0 HcmV?d00001 diff --git a/packages/log4net.2.0.12/lib/net20/log4net.xml b/packages/log4net.2.0.12/lib/net20/log4net.xml new file mode 100644 index 0000000..b4c2121 --- /dev/null +++ b/packages/log4net.2.0.12/lib/net20/log4net.xml @@ -0,0 +1,31401 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Defaults to %logger + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to a with %logger as the pattern. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/packages/log4net.2.0.12/lib/net35-client/log4net.dll b/packages/log4net.2.0.12/lib/net35-client/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..40d3cdd9f2530fbe610dc6fad439f027ba75652e GIT binary patch literal 266240 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 cz!C2KVBP3zW@LL literal 0 HcmV?d00001 diff --git a/packages/log4net.2.0.12/lib/net35-client/log4net.xml b/packages/log4net.2.0.12/lib/net35-client/log4net.xml new file mode 100644 index 0000000..82df312 --- /dev/null +++ b/packages/log4net.2.0.12/lib/net35-client/log4net.xml @@ -0,0 +1,32239 @@ + + + + log4net + + + +

+ Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to a with %logger as the pattern. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/packages/log4net.2.0.12/lib/net35/log4net.dll b/packages/log4net.2.0.12/lib/net35/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..a7e65e70f38fee3ff9a4b77a7ee4731177f48f70 GIT binary patch literal 266240 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

iM#5X>5qPX8frh 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 + + + log4net + + + +

+ Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Defaults to %logger + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to a with %logger as the pattern. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/packages/log4net.2.0.12/lib/net40-client/log4net.dll b/packages/log4net.2.0.12/lib/net40-client/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..615e17f49d643e60ba5631dec43fac913015070c GIT binary patch literal 266240 zcmeFad3+p4nK$0*?&-NC+arx;EXlUyLrP~f<3rA2JBi~sw{wsZI5)Me zl=ZXMcUXHbx2>!|8$Xw0{yWupoint=_K&x$TxGI;zh!w-9hjN>D8UO6+T(w%!}5Z0 zyjJ=r8C8jr_fOh6dB3mghEZD0=5$pMK zobC8Ob1l!mIC}f{_-)Mgf6kXnB$w^~B7R}6|A^D^?U(V}8Cq@t^f^B+R?ssA&6 z>-Qf;IHGS8OF{*HMHrsHPQ;yR;(lY|ew&Cp+r*)bB%i#SI!AFoG5LPVXT*aGnW5 zEidDh^t~lP-wR{7aiT+4?`JgMTw}{uSzQt(AR- z)`2p-5_JIM3--QmOLwYfJSX^9*4fFII!EWHGY7lutne>W-rku>vzwSc2|mgn+vh*y z`rAd*2GUHOcDbGfx(U8%wVhxg0JW~@tru@2mEDFX-sBfLAR_war%A~G=!8nKfTE!A z>gi5(vj&4fB*~5TdBNh0<>j5UG^~Fz*j{zhoimHQU-CB~mF}?iXz>lX${4va zRD8A#6=0Y!NBKrslLg!8H!q7))t)-hWI+YDJ zI`uQr(0-lLw|N@f!1gzR1yk%0l`VGt6ueC2*+x2!lIK^02Z#p`a)_v+!T5B752B}_ zftWhjjC{G#K`&T~z+UuHJD+xf2auwgLx4%84NgUL?b~f?-_!<6t$sb>4v{VcdxgMx ztdFvHi9L=LbC<*4gaiQSiU1PWX^%6#6C4B;PVgH13PDh*5>YwBc3l6B0NbVA6Z4sO zV0GHM2)seV6wu&rWt=_EC_6YC6)NBTN)S0*a$Xy3!Rzkrl5J)L=FFRrHarRPJHNv} z2XW!m2#aF$%E2Ctwlh}6=s?S=R;>}$fu04qk@8ZdH7A0glz(4qsQ?D&CW`Bgin{?t zB(N+0K&*AtsMQSLl z%K}%0hiniDpxmC-DeE#k`KRsXlvf=UzLGfadKEH-U@+7nPQu3egde&M5AA3b;&nf@@!fFQJvbr{3E?hYSZ$l2q9W1M*pLTVdt&LK22 z!R75;S;3vP$65H=bX3+ji&EgK1xU@;^7aWnMu+fDx+FIP$=pJ4GIy%j_;3t=^ zdY*qFNPDorY8d(Nwhq3N-BbH&-PDUlS5%WCsAtKgHCrN5b_gj^rC4aAihL`wiVVz2 zWE+aKKf2b=>mzzR>t4`<{#8iQqtr+{#gswevpD7Js(~bBnUZGkx1#E!n_8o!)g|)| zNulwjjB;Pm?ohlM??az?nXV*1vz3VUm%bvR-H}Z+=!6#9DF>j4j|02>izq4Wt}99T(xZt)<{S$ZW!| z2xeuE^A~!bC_g3XiStLgxPP)2>0#IA%9UKHlCvxQ{we6Mm6i3Ep&6zmwvo8hK5>8j zV(@vtc>qtpzm7;E0C1N9dpSp2^T-vW*p>BzEJ;vbZ}(0>{kZnfjY*L(FpO8 zxniJLB!{c1Qxkop5&DZz8Binu0I>-`0su%#YB&i@+V%H>=*M~{`dMuKcvNX(fIS77MDgO?{HgX(n7{J8PAP6wgRR3+hDsqzare z1_wuhk2QN{sqF-q?&ku`puCx$+$0PF>y9EnH~zp#3nvaI9J@9yFcc zaf8&Hh>(Z$@vpD1feVy0)3gY<<|Ze`(bLnw;kV*gj1m7Zq(pQSi%*0D_U{w$<%w}% z7IVZnT?Pbs45ZRlXl&DVa z2q14)9f?PaeC4~&|>1W!`-44z2#FbK|tDdJ6g*~1{* zBzv%R=0FtTX)k*QPeb-#3eABi!K3!FXK+#W<|gL}WY6Fb*_)e`s7~!=FNp&-$Q;!< zavZP$j~GW%_6!{=dxLW#N$|D3>^0%R7Qr0Ew8fK@J%cBbJuDN>g(>1qd)dP%-XwcN zb0UiHw3j`Dry+ZoI?Y8z0Z4^=18czplz{Z;5N`EoeR5l6A-7eW zj3D*@4$Fg8J5!0bPJU42zFW$|ED|f%%+KeXOW23-uV7?nscW<|lRX$biV9}AJe0u}#Upllf<(s~P?-Hf z&**em04cM*FNWr51vcGyg9{XZ~s59Vnos3mW= zXOhaSR8wv>sH-_y4OXDc7qP5qVc-Ox(6`*$I{)`VLGiH;=gMlQq|SMg-pkJnV@G9z z=_b(u-0<0$L}vV>F!!CYoT?{@E5%A08qM_SjJ0IM>c^b4V{?ct@jd>PVB0PG&z~j}vH*OA7N# zNc}O?hDXG6q>21OyJ5G5^=0<@wTP0RT!_8)J$X+Mmev%!;5tO@{W-`A?oVTLCqf>h z?aX*eUZU)bltl(`@3)S!VBE|u%X3UQtDWK~%Dg@*s{TO~72JT=S;ghkvx`e>af+!%FiY078e*ifGlV;h$#6XD>f3qGL(acr3}k+gDyg&70`NE zaUDP(doS?A8YmP&EuoHVL+8`AWsd!rmqYgYjpQ#IAxff0Ax8J7_klCqLf_+m6A3%h zvTfZt*ybbMgXt?Yg8eSMaEaAR%unTyD-S{~)+#lZHGQ~jV z(C{MJ{5s@69WnmVz}top&#ZTxW@XQ_9LQbA21CB9o8_CQ!89X`q(u4|0v0Te!X&0C zZqCD=J$F-cdr^P8^Hu^gY2Su=$a(3t50n3n)h5r)hslFBfE^0n_N?x(Fp=Wj3$z`C z$<1|Jet@iOC%*GJYM$s_@{Sc7w{oZL_oCXi-;G~kQ1}9H$M#Ej_xBLR$4yIeQ!Y0_ zY-m&#jIKqTc4~qs?RoBmpwx9GR94mqN>eKlS(;jf-}2OI{Dv<<0sc>czvORcDU0wE zez*m=gg_jf(3E9OIRxO$!rU|%tNadoQnS{jx~)?#vKFGxcJxoOY}8$7z=l4F;Hy0Q zCrJ%o<#~s+RJBhYMJ{O6`%qlHhM%AdKb0+lu9_7zrN=rdrONyLWr(S+@CW%=5PkvV zIDQC5`J;f?3Ml$Zng8dScuW&7X-(`_^R5VWGOMduN8&Qy?+-VXIMXPxDkTaaE>RN4 zCAK7Pl$glcrbG;5i8}tVwL}5LB}(GB#FoUZB}%j@k#fVGZT;i!Z_W<(^4H&oU+L+M zeLbwVNMCHq^Q%$qtGb>M_0G|SnnaoXm?7VcJ+8Kb5;7P zZfv=AJ425ndm-f?2mGZqec6R(H*~P;wZrAX+-rm90BP5#SL_rK9Edgy zaE2)gH}5U1tRD{qQ*2M5vrN znK9d%V;qGZvL|64TPibN!AH|82^l>5|iVs%jIPq4qvVwXZ3KZU@tmmoNL9d9K z6GSOR{v=Av%?#xyPeGQDm9)bP z@GJYsX|p%r@D!HX{+(8~*IH7B{L!{~CvXlDXU%phc5o|@1yjUW-ktZtyMQM^6Xb?F zdslW3@$?qJrA%-elZs-H!ibww{|! zUsloDybgK2@YDF!U2!o5Fpg)e2Y?5-3U<-I9kf*Q;lgxux@(#ihrbD6TOw=SG)t3^ zDl6+BgA-#g()+zehF}9=Vz!@v02uOoB8OC#{VUn@b~u7!%6AV)_if}m6ubZl^Xa00 z2Qw^A7l)`|icv?0EbT``@Iw5+Oru_~t#eU_rHwk&vW}??&ZRka@FHTe%aAsItx}rD zA&wJCAfS$rpHEj|!YI`MmcSd=x)XSp5wDn6IT)#m%C2~d3c0#*utrd2)0ots#L6nh z&P=tC!Qn#|lgZeD@L?e8Lu05t`;h4?3&TAE=yPHt4z00AJ5G2HTLhAwL)B?#LQ*Xl zrI6oe+vT$VFc=yUSKBBJ9+w0AS;}EIor#Ko3KBbUStcq%Y(qCcbF}Bb7?Jszp-vT? z4M<`)&TK>{s9c%UXg_eQ9hXP_AZ2|Pv|-j!sDpVqOi%6bSwN8vUV_)oOz+xd>6#7x z*oxB2;-Xw8ScYrp{F1n zl~03z^%+cx_h%Mv@3b@7j277AIt4cvLfU;4@}5*7Rn2;ZloEoeYku8k>;jKKS@B2! zXJn8Bqf<_yPI(LVgwI02>=vKRpvY$ZpV1x@kjZG;54ChAbL_OoCBwL+9p3_2{oS0m z-UG>b4+4tM3Es!BByxfeFwCUXZs+icg{TP$Y(RjB4SKape-8d*N(MWbWtCRpGy*Zn zmiAhX3IUG#V1|SF2T8gDp+Ljw}=K-hVwH;q-X2qW^y?5m(imt$UrJr9b*eOswH%>mmv`jIS`)S z;qNA~&95d+C3>RyV0PFz6ZOnj>mD%sF1m|_Iapz|$DTX`xCRa?=E0#I3p$*^p;bTY z&y5Z^Wp8ls%AHr@Je{QSG!;&hVeMnp_i_;oy1{|+djXTm?qb76=xgzP6_PM-bYB6$vk8~L0f zqhOop!qvrii7m#97{j`Q8J5qw`+HHR9OQ#hp1+SZ9KVpsKo0YA-sW1+HJV;v!BbJ| z;P3DwiV)JllmaztO&%APCNH%y*589gPm5@)D#(2t+ z%A~wwZJ!OXcqPLAvp|r7bL&3G99R+yUWJ&!;k5%umG*W3!0}g-rWbC{t;4+sOQRAI zThSi<{p(}*m!qLbv{5I^fO0mnM38_Q!UJUql*UYM(l;*e=X*F7|p@i?mJBBZ+ zSXtJP5q-u2S=XZItQ%ahWqCx_LjwNIUD_f*7+NbidW}d23Z< z-&VoTQTBW3<2>i@4Cf}cqC(z;^m=FlzB$2-Kp_zrGhqpsF_Y|%^e0Xv%imyk9rK0U z)HcLT@+W)@wV2)%Ws=ozjp)uJVso2_MT|JDO~eXDoZ2R06C+M<6F~`@h6+@Q6NPVO z4ve(3B6czYBh{>kXE6c;->iriF=9)bhScvi%R=8E|IToK=5#3^l1 zJu+8>+c_&oys@zZ4Q3|LIK77E%S|*uFikFHd~hoT3L^sF#B`CsP8;IFkUxd^02jl& ziS0~*KI>Tj3h98n6`cAr5s?!K2<}Az`O&kJr^V}-AbMTdm-9Orax*LVHpMS4z&Pcc=7t`WukRVEk%( zjGQ+v0`GCc?UEa~6~pigt+5Ylm}4vZ2m2WBaP))o(H$FdCWl*6PBGYpYGB=(Z1HN3 zAOqKjV2kj4T0zavLm(w*d;aqzDHTF~2D39{lbT^MUhSp4wO}B!mmKR_5`;gN?Z;(L zQ|tJffWr}0Bom-oH9QR|6f#_MM~b7Wc*5HN76qm#WXhtPbOKCTpu5Q@*b%naXIQ3Aj8fxxVE~B8{*@$)~1dQmXF&h2CwN^u(^N=wh{4?_Ma)o4mqRSOJuf=_vY;?E6 z<@$obg?knMO>DS3q1Z5?YIk=6>GO@d6YSfDmdBWTD9SzOtq7ghARFnBdl4J3%E#K- zK1^V*a=x+7%k}%fp@}O@y>+jI`DSo}p3vZJh<`BZ_vq2Kx`@J_p+vu(O@Z_SW}l@g z?>i2k_npie?R8%%#7WCik3)2-ER6|(JusTWG<3-80IjSH@1dN20O9@3`UKKS zrYP?nS)*M;x)miR7P)=U?Hw`$&5dqJa?9{ZR8XhkR##T{0q;k~9v58779Vp)J4yu? z6I>_bKLB_(_y_zNmcDzYsQ2(>{UZ(gQHBW8qhmzL+IEwUPm$WW7r75pqhwu^VI0A~ z&1k{A=*#+tfM~x_m8t-f>7(LiYq==q!zAQL^c{55;gla$5Qj`?9*#?csQVb(K$bb! zq#r?~7km`I&YCpFpN}zdq`+j3i?M;{GYTbH&YaqbCY{E3tOMuNHF%Xp_o*8Z3f+0u zo?O_C-+Z_dzp_&Zksi*-?5VV7(Ij((7a%UvSb38fL?#!$EXsnblf&8OET2YPwk1n8 zpPsq__`Ip>@rw%(|48yz`X9$5_&*G9*6=3?_@qXDis66K@TVF648vlZVO$YCHVK2l z-GG_A<$o5DQ+%B{ene?6%}2dB<(U~akhjGUoVb_zZCb#c%@s^!39@RZJfups9?Sn+ zjMf{`ZE%*+l&Wu%Rg34xt3Kmo%$D2SR%$&}W)qN_&TEf274f|5V8}z)kWnFD` zKErZO6F95d%3PAL7U^7IeRe zbTXui!Izs^)+rI0SrOTh@C||tLlzi{LM`m(_xV=#OyM=cYplN0qwp51?~EvXjg@5^ zgtpFcxvpjhUqZpbm+>P7vp&@MEATv4>cgmMlfPO-2XlrsIozwJ7C>cUb%*lfuuk&794}Lchj#>8g7uMf@vwN=zj&zs*QEk zyh_JcS++=Rdi{%$xY(J-YKl90bGG0fq_&MRb6Le?KUZWpHm<%2rop(9a~{8ua32&j zYe!?M+!Gm7BJYTic1#t#&QYh}RSLMB$0<$rz^<{EWFi7H6}Ng^T*6a{!<6ts3HRA? z0q=K_Ed(wu=V#KwrV@4()b7F=uBFl5x1RA+9J?=RgXG&la!C^sl&N@JYss<( zo(3%!wL$Y8pt-0C&1_m6uB%(?P#^!hNNxuY;x{+bn^)DtlN!-3A-qnI2Z{s!QRhW> zLTn4O3a*J_pD-W(6f9QjRyKfh{=Y&1v8Pl@*B=7z&P*_aM>U-Zz9&UdV|dk)F2j}9 zbm3Ub!-(*|j~{Hq$wSL5T1$`By07$qfY|yEnFI|q;QxrBFkaZ*1&x8D0K54}O+20Y zW2ZeX&~X8d6XyStU4w19+3>)rxy9Vfdbj2}xtTGvyllJYW{%2F-h>R{uTVFqarHhe z$KujR_6RWLP!BLD;t$Ts9#zIGZAMs3)&}q=JiZ9#{20XM>}sDEUW!-QoUuj0=swM8 zrx(65iWu?2uSH=;;=`Xt?}+A@w_AOrowmaSXg@*Pw#(7A`ny2?2zEbzf@gW(~!a8t=}z-w?dyetAj+)SS=Sh)df1?#zadSz_c+(c=?EM!0M`9H@GR(+m980=bk z!nRTXW*P*@&37JEl$T#1NBr_1d^t{IoZy$qs7Ls+(W&Cdq2!~D8t41ZrhJb|QiBCo z$e^baSYO6BSZ>e7LPBNRRLD^4X+r^wKt(>o^@+Q@t>;_wtu;2p( z6>)e<(ByF!;hZJ;E8i{F*eQEh%3|;n~MF zm2?=*b|SKIHuDiQOz=sbUlets`!5??@?bq)awSh%GGqM{(Me0LF99!(PyQ2+PlCZV z2w?fkTW~eXhoO<%E9HMGK0nF2$cmo?!1g>h$D=1Kcc^tr%pRtL%%-e+fd53)kDHT( z#^)z{>mKq(P;+GR8R>nPEO8P2nl?u!pNaf`ogBZrwbMnS!zMSsp9L zN@;tgtS_NHC!s#jdcCB7u(RxiSD<(KCA@CGEDybQee~){zcVrYUbs7oxNLiRb;kCB z-w?Crm!l+|nbIo4e@i$HUY}!o*-X~#rxS?N2j}6@w_|NlLtVC%E|}nHAiS9!ooKN) z-ldqc(MJ91_hGYu*;jP|uWYGlNykm@MOCq5{r@3S&vinlaXk-vbJ*{fOr5$h)0LrX zplq!l{(;~O<|W8Mo1}MT7x#i-oWR#pX6#3B78ULVElcXZLy9TlNB@usz{Imzn4Y16 zR)Hn1G9>{3o)rNk007gA)Wv~Y2$6Z(m7tS(iZ{oWQ#4O&DY<)BN=jk72L|TJ}dh3(x-sR2B{&V?Y*s zACE(r)CsKUuS7N}D`jC|ls~7oJp3Z+WG7c98#antA7!3cYv4MNn8&iHlFUM8pD&Sp zP7Np4vB-=rAZGba0S`2l(0mNrloC~ldiA}AzUkv*b+R9VBdcap;|Mj_F@0>5#2*8( z+%ZxFa#GgU`v4h%v1It^8ujDU4(BA~O95f{a%VB91kU=KQ+bJ6b%&yRft zJgAO3RezE+C)^RpJ2b`{kf8bYJ}@r;PAoB%D!LazmuJVJX8sy&KbG+nl(Cupp)Fon zJlcl_usbug0eAyMM)Qi%omuRR6y569!<3z|PB>M|j>^J1!C}i<-&~fy{)J`nY{c29 z*JF>PZ7?)EYsGtAL|BaB!?ZlA?__|VKyeV zCEDJ?T0#TQ717k`61u-}ff8=Xx@NX}ehOhM!i{7CkI*IhJW%b`KtS_=o4b&k_xZMsPJ0-}Dub8z79S3>-Ur=P;JE@_lH1-sO3r!c7_ z+VG_Q1|AHWjyrTKPa2BXk$pQ^-y|NayMQO`@6fvou(NVHgbHduxQ%A3Yw*nG>0ER? zm)WLc{n1LttPvnuuW4%ItY?lgR(SnkF6ED<7+Lk@6SgB}TrvaESN}l}qA*wj62}>c z1jZcy>xhjGO!-%nX7GY@+AHxq3p|;e1iIQ*(YraB{YNCL`@WNC3v1F$Y|L4TpY1dE2v5tvb$t5qm2=Q^mhD5}5$%qr<2+Q{B zr$lcvN9QM}fF}%)IN_^NH9(@Ec+PmaHE*|dbQx{QzR2-DPkP5mjh_QwonRxd(*=tl z{t6LCE?DBVfynPfRQt`1Qy^2!rfulR-7@G?!w)zl6uyWtT3U0=^v5HSQg~Sob-r1k zd62?>5b1_ArbwJA&Wz+IpT`<69^lH3tW@`OD(E`^MQ35ru8UAP{GEHQ)l)@5624N` zd>V9PR8b8(MXV9s5D$(65#3mDWqTUBPu4fTQ%HoDMu{x@xUR!7!n`ju@9nE_+w3X` zsJRMp9WK4JQHM)+x7Gopm8k=9XdP^82P=#}e;(+nj>#jK&+tei94sK9*J*($s~3+< z-cCBtSY(#a9sk>8gS3O3i-^{WPB_6@OddD*ijmIHL=>cn`ehW)E#RxO4zMu|-u8==X9$vG!(XYa% z<3;dd)rZK!XC`BD`8JC6zsw5qR2F;o4d~|LTXVI+?eNB0F6iM;5kE6v(eufoTZxZ* zE6ps5_|x6p${$c`_{03lAJ@7G<-m9>)G=}La()fJr2x|}u0N*XX%TZ8&%aTiTo1w6 zn8v0np%{zt%WW}F-nE|9qEm$5UE$xe5fv#gk5_qGG#G84O(-9>W30cb$3{Y5<=Ffq zRIr-C#o;?h^W+Oz^WqX}o;&a>wue|2VuQj?;T?d&SD1T|#1F+2bT->^(^X7IuKA zw7nfv6&l(L0t%gA!)xi4H>hn160Le&ZGa7Sztqb})$TejBj%<^eB)@?6swHJ;#wZe zKMPZFtc&<%q=YbILcb6puA@sJ?nN&`uJAv|qS+!6>(r%7TV({2U}S^{C?jojHkLRN zIvY%P!za|)J1Ezi8|T-in2p=EkP!~xck&g3wLIBxk4D+&Q!d8Q3*};|<3m<+doc;H zJMHHZikqbnLAhD_J<>W?K3GOaln??%4^LhUmY0Eu`%Y?xO86FRe_Nhj|? z!tm}v$mj@qc?%ZOL2RUfPZGd3Wi_g*l~^~*85dBIl@ zto<@NE&_!HeRdpV;X%6?d{)_E=6(gM?5i#I9ebQb2e|c)bL=cN_!7uY*4>v%mx2$o z?#1A9!~_b-5UIBW03f3T5C!}O?z8Q+KXG#YA@HccbFy)KChYBwpHN2gn4?` z+PxKr>!os7#P<6^8IP0WCT4CI?sx6LUiK=xluye%?(N98P4cZ;5MF`mhIg>ei;#GK zIVUKv7W+>qh)y|5CtigD^tc+YzUC(W-W2$1KB?R!0N!(a#HeXqiZ-yv4QD2!`0!?AcymYOc7iTWh+Pgx<>o6 za>P%BkHuB98QeAi#krBJp6i>LDQ3l;ck>~%%rukxn}})x#W3wD*YkPi8c-x+qg?c#`%v@C{QoXrQd`n3M)*$7BS(xrCjHF2jUw` z!(vU@{zCu;3)q0OI1zk6+E)&F6nV&FFUgn0$)gxQHb~Myl4(s$U{m5`MQ#6nlC15s z*1GEDQTsTuzWr3Tj}T}F??b{yR|*^wY@nh$*};N$BT<`bun=1-1HI7)y&)ADE()4* z@EGD_-SGWp0v}-BqG~s#bAz>EuhRKCw!^t#t=VUBg88@?pJ)sx=medj+hFTj5TQaH z13s)>t(O0@m@=-57O^fWly!MoiHg@jf8tGlt66ejybZ9esc)C#`84v%35Fn5HCz}| zX>|6z0l8pXr*XKPWpPi^<{ArqExPz-~gZ4kPjT#Y5%84X}%}$^T^^z9#B<2 zbXxr*YG<5bm+vNd@ce$r{{@So_L6{<2c6FKsHpDs4?_Xw9qRCs=x}8Qx{wQQ#SQTz zX^6W$-RM9slKEZlw$&NCW2pX!<$z4f^XG`v_U9cS)mP`~Y~a zX4^HX0P6hRF(IlBv9(Oa1;I*V#JvFci}=CXKzG|zv>q#}-6<{I)S$f0p@rU0EU z2R?X%E7Rp2!BX^*u66H3BCnJUu;`PM;iCtaj>#R!;p+fn4QqW)eIZcv7_CxpVNIY* z4+zdi1ZPVpo`<`FnOdh~^exL1-LeH$xfb=sP2Cf*d5*=QoT!m} zI`|VALoO&Uf@RbXJ=nLF2x7oJQ$FPCq%9w|82cz>mVCSuc&{_E_VI>v1z+G?Bp-e~ z0s1^Zy=$>TNj>dIir~wrNe%}AUx{aRAp9+oYfQLeSyWqDio%5dZlnqR8Ay^CoPcQY zaUJ{y(@0VI3B~@K$gLVzKVAXQZ(@+`e@ZAg$kn98S1qFX^z{kZ!5v$jheJVe9!`nE zJk@JAPi@U7^VGTWZJyo^jQ%Dx#1zM0+=eetpohZ@dk5&6cr$}yC_+N;rXJ3b+tP%h&rW9Nf zP`z}frGI4Xe_9b^?QxPAyqj~`@i!t^%iHy*qr*(_ML|vw0KoeglJ-4F8{fz1vzBhq z`xv}`aXgB^vKw@tq0PAf2ypfHH*lQ_+)IedEWs?b$0^?M zKZ$NnX9Y7OSn_@xFXA^cH&dSJ$u}sCPP5Vy6h8DG&;o<+g4_*XM$Nnp zpU1C4%fW*H3+eIc=JIkq8Y3#5M>ci|pwIT_fset9k%1>=ZU@17Kt_ywt^NyooA0BO0_*f+= z9zqAl7qLZW_qkI|pQBDNHfnG5T`aL{xdg`VV;NKRhcknE@h4%bHg_rvYi3@x!diN| z+O9Sv{=Dr<+fK-%2>v`VDXqZ83;*)qaSKvOu7}&V3b-rU+7$nfo@i7{vsC87F01KkI@PuKIbQD6>1(Tmb zOn43fM?>B!;##k^!wFvxP~am?mnQiD-e+C?F}sKZ+3<-lgqe|Byo2muG@O7#2j+KtEK8*c`e3bwq3xPuV(rTGHDe9;K~IR{PcM1 zJ`9$^9$pJp?S*)D^uQJlMiE!u1c|o_>AgD$g(0jmFyI5t$w*zz*@cY13=%ndOB8u@ zo5-g|ks{EIoXeSWV-$HpbIxH#E{!73iy~|DP^Q+*KMF}eIEIqkh7({@&-9v4_w{58 zS$K{xU+;6mE0J3yvQrsR$9pEhS&CP5#qH8eqMf(c)9;AdDC3W!yuEzy$rW;D+?uDf z6mqg?QBnM_7yOTt=9562hzOLH?!{l#vGA6T#U;Gj)=xUV_4KjTb#v;o$;4~EuadMQXw@hGpokD?@Vj# zIlA`6@%WD&mh}v&BNx7e81xU`sF!eF%8JLyub?#C0>WUpF#NrQ`_gR&#{e9Mf&=%npHpBC;3C0`+dpkVemF#`(g-;`}aS z<@UO$;?XRy!r3#shk9_@;A!`8bukm-i|&!rji-z_ThXsw($k8z_9dfDM`=WDWP0*5 z8*$8p8Ypfe__mFk=mQegCi)kKg{DHM%!7-_Z56;$>y%?4$6)AQ{O^D~z(14t)yAv* zagFUJz&?!s8xbxe8D-~wgfU-3|7ggLQrl4_wPdZzCOfotOfUE#^q^O;i{bIs#>>!T*iblhUD!mZvBlA zR|Y|mclC3!p+IquoTqR-D~&FF9GdMxSEL;l7|cydd!t>tt>0xjir@!yamxBfJTc>h ztlfkHBRzFz6mHQ|Zvi~gQ(us8K5Q~5GjpC?omUX)|@VbT{#B(7hm;s|9WL+(V8@3#o zp@-?TqMaVzi2|bf?Uiub`h~9{A=)~}rXmyZy#T6-sI??AFI>1PYH)T|SJ&_>@a9MR zT$Z2GvhpOBuN%u{ z`^y3yFiPZ4_{TFpoDbH(30k9_{z~$s6Zks)D3nnPAhT|#-B(ScV^Zb`8#F}S}rl5QxY34<~(LTg;YE)18Ai6lW( zch43j_V7Z!ko7NTlK}mCoS?Lfc&~p5+-~N@YC%?xa4ihC8SG7k_J=zKJW$A+J1$M1 z6kwrQw~!yQhH%HdC^ta^e0?+b(8nP&DUs&e?gj ztXwDUDU9|Pd%83J(bNM@rU&r_yjCgAg+ifL5|YBLAjK?d#!@~@0`HYt z^Z}Q&dm+A6)#yp0Tp)3U*%HSQx2LC>FMp}TwUnHc^+Hdg1s+CaVu|ClMv9GVHe2G3 zv}&^@tdNwjncY3bwlz!$_Y(-&;i_0{R8hV$&Yc?~FAv17H_<@`(mMacRf*XsA7EUe-H zBb~mVfM?CO)nQM719UiMQ1nk?Y_}I|WGuEqPv%p+fh(S?f#+Fl_+0ogh^i|CY2Fz; zCfJ0O+@s%U&RGSgFl*Jc3b#i+xp`5`6;f%vgArL02X>X$;s#MA-pl`(+~cCZHS&mm zjr9>nyXLXRT;&F$D;C_avD^B!6MmZHB^F<#C*m41SHSeH^^4GI&qiH}O)CTGYDQPi zYAYjGd`lH$^%!eUN^gJNi(q3KQLMl>;g}U!&Dc|bi&8NLI4~yG)-dv6G0ZFWcn@`= z@KR^W41SlwrJ{`A=X)s~zR}X7rwEd`OMM-M(mFPS^TO~^0rV+N95t%P#yXAFEz*Cg zELL>QRC>}%(j7>nC_?u*%!%|XJ4uJB33=?vjE=w3me)q6RX1hWm}6o)?T1} zkn7!jNO=p|&d15jTyQFWa$f(+jJN2q4*hHk;(0#pLOh>?bU0P$RQ!JjQ*eHJ0H#BJ zbSUA{vNLjw3Df&5#Om6T*63U9?leVn9{RGZ!W9vUu{KX%5ly?M*!uX81$Kjmz+`ja zr~WPMOjov=Rq??EcVCJ06Q5?%$dR3sfZY}?p9d#kfN4Zvnf@sNj9{O^tgj!~)f9Vy z#5S`39ct8+;6h0d`5!1M3D{Bi3`rS*SD)Y{q^NvZA$Z04)?9hJyJJm0tgt>G0>=IJ zI7u%#*x+SGALmKM10xVgoi=0iya;&o)j5bg4Fj;pu?7k6JQIAFX!j6#%6<29@f<;$ zDO!y_unPjGfbw?#k{GL@@DSpXC>5N;DTN7==HYW-%?Xms$BAyKIQ0!?{MP=s?D}yi z2y3HKPfs6;S}Kd0F{2it_@zeBFO<Vx3 zdbm9B3`rl^TIkyE_i7%Gb8PwJmnAM1&XB6P_=eMej9#@^6X2DUIpysNcXmkC4AdoK zncOh4nTsHR?NvkR(q2w*2KfcI@%iwUhL|*S-V4q~qKNiuV%k+yOldoWr>&%tMj^I| z)Ut@S;jqcCb!aM>zCrPCiCzC1d*O(pI$Z#>bkZRRU}< ziaXqrbPM6dX-H35b!%ut5$qkKrbp$R(wOUbYmN$!Ivz)l2=Ljv%68z2SZUd&u`MbS=MRHTB$c09(8`~} zSDfB%u%hvX*)%%;e*_(t^7<>2$}Tmbei1Zag9xr<4llI~S z`vXR>#L?lVqtwi5T)DHwT24_%?b2;6S{bb!+j1vylJYSNlbo2YuLpsxh_roOYhWyEnj*Lx#qhx2)KXAqP4>*%7QkII^jW z*4i^88uVQ3)GQii*USlo0?Z_uk8Enax~+kl;*7>)XX2mP4j4w|iS|Mb? z3>ve;onV819jU$E4&RO!^OZV+kP}Prf>WN%Cjr_>r-PSywh1nQO4|A((2x`Vf(-V! z{xa<}uG{INvVR7~un`{V!Hm`oA4XYC_x`YFfRVvkvPRFz>{cv3F1_SNa2!fd`nyQ! z=ILwEB>pC_W{S9Y^x$~Bpl`Vr(pk?l{2f{!wK2W|l1h99#O0?$JFw7>BMq>f_Yteh zi~SwgD?HcTw*nz9URHZC6QR~Y_HZ4r1utVcu6UP~smO8EyojGQ|>V-Pl9gT6{oEyr8Az(+H0e#n_`iwk4ToN9dag%Px`H3FZeRJX{} z6g5>s0?>;m|4M-XeUwpbLWmM4CjWhFqwT zQ9{p-$-+^mQ|;F@X1)jKP}0a;X6#>F=req4l)R~AvZLeT_oLdi<21S^juUK%x9 zHq_7~`H*KpBBxhEi}8)Wdm7`5QA=#(dL0#=lHy*6®^<0<$6JJGK^8IUk_wPmG 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 + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to a with %logger as the pattern. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/packages/log4net.2.0.12/lib/net40/log4net.dll b/packages/log4net.2.0.12/lib/net40/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..91ed9cc85405df13ecdc253d5a69c3c43252f563 GIT binary patch literal 270336 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 z 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%0DaQqwbOeCI=8HS&H7<{|?d`Zz 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 literal 0 HcmV?d00001 diff --git a/packages/log4net.2.0.12/lib/net40/log4net.xml b/packages/log4net.2.0.12/lib/net40/log4net.xml new file mode 100644 index 0000000..ac8ed2c --- /dev/null +++ b/packages/log4net.2.0.12/lib/net40/log4net.xml @@ -0,0 +1,32444 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Defaults to %logger + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to a with %logger as the pattern. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/packages/log4net.2.0.12/lib/net45/log4net.dll b/packages/log4net.2.0.12/lib/net45/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..e74861d2437fb14f7d8c80fc6a1539086fe23a79 GIT binary patch literal 270336 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

od}eOUu)lQt$ylGYaU>U1W0fxZSQC>GS`A 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

K$V;#)}dZKS$hTp+$DF2u;{ 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%0AdC+w`*$)?5BuM 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 + + + log4net + + + +

+ Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see
http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Defaults to %logger + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to a with %logger as the pattern. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The event ID to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + The event category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + The fully qualified type of the RemoteLoggingServerPlugin class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + diff --git a/packages/log4net.2.0.12/lib/netstandard1.3/log4net.dll b/packages/log4net.2.0.12/lib/netstandard1.3/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..f46b171ecc8ba93372c42408a2ef7e9edc985af1 GIT binary patch literal 241664 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

d#euC_uX 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

  • #L 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 literal 0 HcmV?d00001 diff --git a/packages/log4net.2.0.12/lib/netstandard1.3/log4net.xml b/packages/log4net.2.0.12/lib/netstandard1.3/log4net.xml new file mode 100644 index 0000000..9e00707 --- /dev/null +++ b/packages/log4net.2.0.12/lib/netstandard1.3/log4net.xml @@ -0,0 +1,29751 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Defaults to a with %logger as the pattern. + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
    + The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
    +
    + Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
    + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
    + + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Format modifierleft justifyminimum widthmaximum widthcomment
    %20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
    %-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
    %.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
    %20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
    %-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
    +
    + + Note about caller location information.
    + The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
    + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
    + + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
    + + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + diff --git a/packages/log4net.2.0.12/lib/netstandard2.0/log4net.dll b/packages/log4net.2.0.12/lib/netstandard2.0/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..a6947f2e5b300c4fb1e31c89168438d32056225a GIT binary patch literal 258048 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�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 + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + This property requires at least .NET 2.0. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + + ConnectiongStringName is only supported on .NET 2.0 and higher. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + Database connection string. + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to reconnect when a connection is lost. + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to a with %logger as the pattern. + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirecctory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as . + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appends colorful logging events to the console, using the .NET 2 + built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + Gets the events that have been logged and clears the list of events. + + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + true if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will loose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. The default + implementation uses the underlying value of DateTime.Now. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + Value indicating whether to preserve the file name extension when rolling. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses + that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. + + + For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + The file extension for the generated files + + + + The file extension for the generated files + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
    + The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
    +
    + Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
    + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Defaults to %logger + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
    + + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
    + + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
    + + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + The fully qualified type of the CompactRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + The type that causes the trigger to fire. + + + + + Causes subclasses of to cause the trigger to fire. + + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initialize the default repository selector + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + The logger that this object is wrapping + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + Gets or sets the local time the event was logged + + + + Prefer using the setter, since local time can be ambiguous. + + + + + + Gets or sets the UTC time the event was logged + + + + The TimeStamp is stored in the UTC time zone. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging + request. + + + The method name of the caller making the logging + request. + + + + Gets the method name of the caller making the logging + request. + + + + + + Gets the method parameters of the caller making + the logging request. + + + The method parameters of the caller making + the logging request + + + + Gets the method parameters of the caller making + the logging request. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + returns a stack frame item from a stack frame. This + + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Create a new evaluator using the specified time threshold in seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + Create a new evaluator using the specified time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The global context properties instance + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern + + the pattern to use + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Format modifierleft justifyminimum widthmaximum widthcomment
    %20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
    %-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
    %.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
    %20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
    %-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
    +
    + + Note about caller location information.
    + The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
    + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
    + + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
    + + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + Adam Davies + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + The string to replace invalid chars with + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Contains a list of internal messages captures during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + Total number of bytes written. + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + log4net.Util.LogicalThreadContextProperties. + + + For .NET Standard 1.3 this class uses + System.Threading.AsyncLocal rather than . + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The peroperties dictionary stored in the call context + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method has a + security link demand, therfore we must put the method call in a seperate method + that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + The singleton instance of the . + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + The date the first error that trigged this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that trigged this error handler occured, or if it has not been triggered. + + + + + The message from the first error that trigged this error handler. + + + + + The exception from the first error that trigged this error handler. + + + May be . + + + + + The error code from the first error that trigged this error handler. + + + Defaults to + + + + + The UTC date the error was recorded. + + + + + Flag to indicate if it is the first error + + + + + The message recorded during the first error. + + + + + The exception recorded during the first error. + + + + + The error code recorded during the first error. + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + Write an special path environment folder path to the output writer. + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Write an special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + See + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + diff --git a/packages/log4net.2.0.12/log4net.2.0.12.nupkg b/packages/log4net.2.0.12/log4net.2.0.12.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..da339fa8ef95df87cabf676cfdcbc3be4c215623 GIT binary patch literal 2191785 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

    ~xN+eF{>BCN1qKMHOs~|aO!S?{ zI}E8e>E(?J)OtvF{$wDd7KS|EyC-Md3{EsNMj!0$d=L+z13HXHq&d;u?v0K2YuCr{>%sc zs|$TqC>#G_O^BVmZ;K>2M})9#QHL_<3uk8$0dQ6{s1s%F#du=GV4SJ_J%gb*y&2A* z6~J)bz_Y}5eyUpp^>X%bO!kJC>@PCeUjoT+l94b@_L@xgS|Hg5O7@ydh1UO)s*h&x zMro9RPW(smaq@oL1^xvLsKPXR3E@Pzb0k?)Wg~kw*+-!*mLByb)ls}cN-IpCp56|i z>_WWN07`mAmBja@q>Xu>6Rw4^6wi?CWskuqKBTCo`9T(hZjXulOd8014^rJ_IKM~Y z@Pbk$)mP|lEigygEXw(@+M#+sbE{|7@J+Md2Y}+ahVxqkjhrF*s~$H{0Z&Dp&wE|yR)##}K~7-E7d%Lr zArHC`Dv5vPy6J?_H=5Y4exa77v8`sLtF-bI=zjx$_mqRIQV#wmNBG~=2v>l=D*(Ni z`PQ-xIP%Iz>h-iQ9uS+AGO(bsEX3F3937$ykd8ryz})ZwT=cOov||C}U-(J-TgBwV zdEM70W#1$vqgu;-SoQ{;p8T0Yyu9Rab!sGiB}R3D-}|NvAOz$!P76ibC_i$z43x%k zmnMiW5q({2l%IFg73DCV5*Wr=nfrNfEK^1v%QFIFc`~TVE;^O*cZa*9n=`&9Grktc z*toDdBSK^<%&3=pF-cwVWza-7xE~sgyv;~?)+EU1%x1iZ^DPN9y}aBlt45^A5mKJ4 zI0?gKk#AsHG$cs}o92F))DH5?MVT^25j%;96g%%nu~Xizazt3_gbSyq!ak7$Jo$jf z6OuTlPa|DaB`{1+V5BW69W1|e2(un}Cy0jdAw)wmTAZpr?P}A@54dF1N>nKs&T%C} z`Du^n{{z9`?$f*)+H^e2hUFa(SVH7-mE$16(0d!!%OHi}T6-nh z3MKs5(c?ElolmibBWr{*0?&qSAlscV-XZGVoN}ZjWU^Zn#yYD#YM!p8#!XUNK|b@) zL^Lk+GuU6=y}I=6uv+c2J0~Gi7uFPwVBGUlMX#x5EhibBt#93T>;W-~?^qd8>pPYr zT;H)6Lf^3>bO_(El(4?l6joD`TjfE<($fS)E z4jgBe%_CG`tyv!L2F_8f$Ys;*DuLFO@KdT=UBcIm0$)E0{8Sh2>N1U%>p|9XF2SC& zTxX%gvLzr1+^8?sM4{;TOWh2?6;v&*2Wz6**v$}zzfH5hTx-?leW;GG!f}Om6Xa_& zI}i%t1_uqRvt`@iRbDYQ%^v4EADwDtr;i)duyb`Ef!+41BLb#>nnlR+oa7No(y%Cy z1Z@Q#fUl=6!px$N z7rKHBUg9#v8K|e{(ng`l?^A{E@rq_=fJ)1S_P!Ktp4p(A5$~WducQAVE4p5y^+$Q5 z=2~~uU|sX)s&3@X@2=>5k}U~x14hX8bqY!&hDd3o7aV5`fG>M+oNarU*ZWZoxG;>_ z%SS=2h97o!wSuQ*<*kd<7RA%DCC4g)WQ%$fxg8!=2iFO$H;=I&^7r7{&;Au9L@mkw zA+{8#Ms$V!nIXjyTyvw}KTsV~V?y>>5HUv3gH<|d3zT;0ac1`?4sYe?i_~N zOyw$pSDqB7N7z0tJEIHldCNx2Lr~2~%Gm3iji=%2RyLVz#*0yBCw16dl;2v`w>alu zO1^v}4l45VKtlP(MQAok_voQ@W{iB-hOx`uw8-bX)_3=qDTc0f{nWp}J;2@a9m1?i z2iPS1K731|eC>!TRu3o(i#8V5A5bO@C`z(rah(Ar*bWMPecwznnuh(C$QMu1F!z)i zIrDRi)t6UVKjMV3Qdne}dp7l&IBp8FOlxlf)Vn2k(cscBd1^Wa6@Fxyb1tya%Fc-E z<;_dv_73KyU zg2gX%T~+hUszl7+tjFI=wEmV5IWgiFz7A?&tYmdo)iEmpIR(f`K#Kyjgyi|KhBlmh zH$`wCgI2k8W5ywBX&$IYb>9a$H;3Fu$IxxJi_K@Ok7p8t6R>T& z6O@BB*oqur5<0P{eH(tmL7?Buq+_+V|@Apu%H zW`)$3VApa&>PAQ}1;lMZa4;h-d7I_PM>>?=1Ij(ymQ`gdxt-*agOTMWyZB&Tu9^tX z&}1SqVgr<}_2VmX$9|`)YPr7YZligwGZgS?cdsDdbO?=DwpGukU3I>Vhs@{Q`z6mz zCx_ho;6V_Sm$-*(tAZz3C7UAk@(1xZaIp60B>`(+sP_~=I@pC%^fgC{Em}W@>t8R% z-&gmcXIo5UcN%K10>5o|zm!i89$9NkIyt1Qr?w%fouzE~nIn$}q*( zWf{S`)G09&uc;Vbdn;>p^ihGD5r^Gxp1ydLca`JMj^fYvf)}pUd?;wJ`xGukcTOiy zpHw`%bkQuQV4%-me+9XI6U7~mcy_-X0xj+QHp^UzRj8!bu~#0G^Z1YU(|c?3lD%^$ ze~-iTWu1wl>UuGu@J*8T)3|5eVaUz%iH2Mov(M2xePe}vj-F2Y1_tSfA8~cWE;(1) zhbu%24Ym&qi+#bdGcDx$(#m_Uh5w5YRm2fB)f-X8LyRc$935Kf_Z*E`?B2lm`oKZP z*R+4Z_*w`uk%mgno@tOD1yjH>3D=6LAb~U%idCa8Up*4~KwJxE!_=kKObc=#oG_9N zMiG{XOJ2+lGL+|6FqhDMo9nT=MA^{n3ycUVt zvrs-X81p}ceMYzJ1qQi{u@95aK0{j1re)*4uoMko+n1^D9}QmJTuia>@d_RTzZc}sQNXH+#y@|D z2<5^r9%OCz!O`~*`o+5eV4sHn>f#ve54S@2gY{)&u|_sdd$Y1p>n{Y8CL;46f)XRd zCu8PuL5@DQ%oCn}SSFn9#y!e9(@p8=Nv8ljwt63A0ohnh`;^X zs(p7@rHw&)|5d_%T0q#(Lt&qEn>(6cOnM==9caVUeqP(L-2YHOc29dta{t3MdH*rF zkKZMuF8>kPkN$A9-)1LuOs#a|-f<@`HP0~oorM^57<&J5nT;JxF?;4Q?6$Kyhugpd z$0)9|Yh=X|Dr&jm@4}R^`^dWGeB~JF&E>QjM@tGXQD9WvB&zg}DdOqZgFd%;{wvj; z|B!!M@#}iE9z0fYOa%L#5}M9qQd%BEZ#GJNe=|1O%D-Mj4x8ulf7v>ZE^2fR|9A93D|hvpH3 zUsgq&YcagSo46UmH-^T-99mV7b$E3-ZnPmNP|CvN0`45sNlv{Fz^*H&#nN%{7$MYM zKthNAO;V++v>PLpv~NdJMoQ^1ocOntxV}b|8sqcFLG$;CBDS9W1qkt&h(0AI z@_Sn-J}o5Qj|)xP8k)lIcZTBkDEJ>j@xO&ist;Zd*gkg1KKPwFeQ*u*!By1zmSXQa z3wxj8oQc;(IAPqQo((@EovIIBx=LNT?WqV!c6Ym|l`;c^gy$+qL zfX?HI&c#S4CP`{h=kzd6s&frLjX3vn%)w}U*iYk_HB4i0O<$_J7f?FnUVxWxBU@a|NaCuySR>s%ph=cn8Xg(38c zzk0_}_1MAl3VaU_9FMutn8L6xl$*&bB;w=b^LY7Oq3Vo&9_hY?ZTHi8pWIL%!&yxF z1!7@MiGB)PRMdv^>*tMVrhO@vU;Zl)?7vyPY_C=-FWG@DWNbQ@qUD2O+@lMG(fLOZ zq#~rE(q9w*gE$Nx_bCVGS+}FPH1+I00ZSE^L_# zo8rRolDUpX=y~PoF6g-)ZYx8|_sW$9`(8oF=)PAlA2|}hWPaZ( zgb;nNyq}JmFerVm5J2l+6(ZLS_>j@{e6Or@qoog#m6XlC!^J8o+*gH?!Q^`dU)cAG zKY^e5T9y*IzE?i(mR;Fykj(|v)8vP*vL?TC5saU(*Y&-End|so!MvmTUJ2$ggL&%u zUb&q(b1=T?972aC#CQ2Xzb3>=<$Faoikq2g8RTNE@0DFfUEeEy&YR9|_Z%VMdqwsP zDs4TLR!u6>c%lb)eXn3kX8rxa^}XUJ*7d#etn|IY{PBFRe1dKGsmKUF$@dDUQ@&Sd z4pCjg-y1ZO$5C)#i)!C1L^+M8K22Ys(l7V^C! z3vSdrAeR~}(DS{bQjK0zmG2cMPx@Y|sVDnhp%QC-uORoFYmGzsURfC$-S-N{IX4^1 z_X-Y+THh<&)e3UJ{FA;{sET-$&ULN!y+X9Ctt&FoIm){Yf>#; zY`{3WW(H3#(bw6)Ng?<1?Ov@PL;NAV>*M8<2l4T8QpnxY!5SUZ#|x^I8T&KtnS!!0 z4&v6?ncjE;>E*R2;qR`K0!7kQ zQNPLX9KVnYyrIxKenEr2Fhc^9r(vhl(M z({i?xtwFIN;`HO`?hdp6jqucF*u52RRWt1vDVHdBnbaun`P(QPs*z=O}^3o5AzIiU4aXxH8L=SD56bKwkW(3qlk-b za`#Z{$87sLb7axEud_w#KZO8e$$)QPXRFq~h5+Nr`%gl^c&&de0Va@fAMYztBcLnj zQ{h?GPIg^E=f&djJeH1x|4_d8Mu_&%a9u{e(ch)!7`V z$?~~IKG(|UDe|e(VQaxU{qycR{Zx*y|0Jcc{bzh3vxC>%x7UU5qft8N3j+`CgC-t+ z(8Y8*O20>O;{v#df%1zU7YShh6a@)+eZOz5+*OO2^FM;SuyWT9KX=T;%`E%yjE}S> z7}cw51Lp4$x%pugFU%w@>0%T2ODOS*Q^Xdl%J$XWFNqeLquXG(YQ+`4hw^#=;RVm}$;8*Fvwayu89=3U>)yfL#gLbWmpTqw1(KAbQH}A(hM7LvQ z_M0z2?#flz^{+k`KCZ=SmI-x_t4{Ha>(->Q!t+uWBYSVT>p zGpq6_`{w)6H_MN4B>*x!VOo2g3pC{(3Y5U#9gJNU9D-dJ9D>~&4v~L@yz}cBgRKAR z;K?}WNUh2KA->#G%f0dIf?0Gg%a7bFLFUzFIU7@UQ^+|F-&<*T0dZ(+B#QtXdcHXqF!>MqR)_;Bg zdYK^W)E$_X4CV8jBEJD}pHB;s9r&;};XH7jyWaAB+nyV^%GEz1(*Vs!;ekP(kA^5{ z4qSoH9WZkn;eoTkl$=A3Q2whFj9ef`95rbojBWjH0kAU0Mv6m?OY#{N}P{Yy*%t@J;w)q$%UTl zgT9W?UGfVA`WyjksbXX6p}5Zni^Jf+1wIs0)+@vte9$>AbfXWt77=y^5n^y)voFy_ zZq`jc=yn%+Awr3*%x1j%wL$hR`x7Dl{$dk%O$@@)gK+ept;SY}oO2NGxqV+Ue7Smk zKsPV8LViRBu=*wF+SqKMHxp3n$DUC69Axsbhmztb7?jT|+i9bv@DuF$HXJ8bUo0kVpnAgld&DHH^W!otN~BVY z9Ql$g`ySlt@MIMw0xgOIDA{lxa|6)BcZB%r=upVVFk zO$t7F{YIAdiH-U+#3-|4SQ9+nHImaCx*N*awk@(s{C(PGhNy zH|UNk`mS(AA7(AsD#;bD=-XJ+5xt3x%0psluK!=sFLh{iCZ59nIKi^M33}KA^xe4B z0CaBtbM&*~R(9cUA(_>BRFW`VV_VOrSH)ikkwVZVC-kv}krXOxyjO zKvN0KE-g!ZkaHoLaDE>3-%ACZ#O$DvWb%u1Im)dPUJUDeOVB4omT56`BSC)@LYEH! zjS!RuTQW+HFPH)3_##R!G`Ly>Fr$>*v~^sSKY~A(lM||eekmt#zCl}+FL?6}_U^uq zc{1+~dc_PSQ?m`ME`{*>My4c2Ti@}*F@Dcy(vum@hRJBLC>@^RM%6aZ3^ei~98HCt zm4@_z5jCSJgXorS%065F4nL;TBt6U9H(w-9zLouy{n{_BntTD>xi&-}L)KPCcPw2;Xnc3?rlP8o4ceb2Gx7SXh2*e}>wFb3 z_%w46PkWuuqV{zij!Sd!NEfh^0gGM0^$b|#0(LQAfeW}HL@N#FMFKSJ> zj^H{m2FE<0Io)XAHn}DRDFV7t`3mq;qQQP16|;+(}%a;kfWjD0~AgkydX$MjKf zw757rbK!b;76$Rm9tF?X0G`g4h9FV9zd5{;l$N zdM$si|3~;cy_Ub%zXkqIujTLchvM(9QTe+o$ln>Y{N43t_&cMPzq{Tle`nP4ch^6{ z-x;<1-SrmuJENAryAH+Q8%E{t4MG0)*7Em;H^blFTK?YfR{7go%ikOR5&rhp^7n?f zz~A0l{@zf_-{qWuWwUc~0JO6fbbT#oS1srU7sUH-G{STr z!b7M_E)eK4oUVDpuOQI432%v;VOmkX4>n-y`*=ib!H7M$Ge%zV=^T(RhMV!kNORg4 zggB%8pRmewk629aenzJmx3~--BJcXhSiVyE$mpkPz>~;dGW=zi8+$@N^U>D9n>aXh zQxH54{Uvo*7DGijit740l=8*u^Vs)>+~d}p@wI}C9C)7xy(L8EVR+maZwmQ#I^N3> zbSQZZ)l@K#oCna{mq?M~&hf(k)C-z=Z+mCyId=dH~Due$t4ieVX^wO52m z*r?s!+p%`E9XxP{%zJxCnnv6nQtJcu8S$k$cDk5`KJ1rg@`NgZE(j2v{T|8vo5%_m z6JIoEjIX?0awMMhe@n!Ae218O3ZKW{CqI|GGvwQ%{s0C*r(Tab^@*S_58Q>M;yPvk z@;uD<(`E9Wp}?Kg&ZKgap+FbibyAu}$m9Na{>(|L?fric*q18-tL>WfK!>dq=`k4zqUjQJi3*i0~4cnOX!X}OrL zfUo|JCn8!Wsqc73kx%Qw@>J(E_Ss_ZCtliT{6F5l13s#v>wE6q-MgDj-IPs85B0Ly zKng9?5NfE>d++ta20{r5RRjerC@LxniinB|f*r*MHUv}@6{4cpK(QB8_~x85bN6l% ze0bjP{XTwVcK&DDnRce!nKPsqxO|JO^)1#eS*#a8rIx@dbi4!a0MQ$l&ziC)=p$S! zy~7D*qUw|2UWhw*z{#l@GeA3r`5sVM7U{7pPF#Nq?u~lYZTeV?d>hGspEJ{-h{H?a z?T83h;6vW?jQKWr10D2pmyXq7CG0YiHMkUzqJiRK5pCEu!AtOQ6E&2VNY=K5c{=>W!H+&y~F?B!G@BH3WFD|}3?1LZq?goLw5p2kYH0u);3^6CA}l?EPO5$jk{a^hx72jpRFkyX^uNipZLaC< zF4K{0oUN@^_S_Cj8Eg$Ll5IksZIdlq61GahR>j<#fj3?5$8UMy%S}HyQRG>^Kzekv zEPkOyJSFh?DD(BtOQS;WmeNC^_?nmRON!5*5|}g^?qvh0cAmi}oFF|5HJ!3!$=1Ch z7x&6sNWy)RfREVCKuax!1hHNA*tQE!>e{C=x65@V5G zYk$hicT5wRhiIt;RH;DK}#?g7I7dU$_4^d|g3&cU*aVcGUG;BcC-J z*2IuLViRTgFYQ%t9_0CQV^H-X{I@X(?$LkAe_xdC-n_62Z1Op)yq}yDh?_(gcK^d| zaa&FdI*EzKE%-^Ub%ZmgE`_;e5(t@1idBBl zd^+Bpd4cn(-wFzdm@{!$gK%%tr!{|5-fysG8lu8=_eqNA1B?ig4g5SQM8Adn1~!XD zEMoaHQOCd&EbN7#PLj)&>+Sz#xn}Vm_R@bY*AA1ftX$*u+o1qO>5iBjEZz4Qp0l(W z$6=&_8>`p`eDQphxEYJsC)(cr$(PlAA;pB|H+YGHT)7j98gF51#$9wwHQ8lsfrF@O znCK3{=bEiuqsq_MjF@29l*=Y)E+w)2ilEfWS=cIhw{$m)e4gH4Q`x&L>?D<|%3fy~ zUy~h5H~$yrj}zZ$FIR7O{8#m6M|}V<*ESCHn__KAWFO5$9UMNCdLia(jS_>;7QncAA@?tlBqV_K#a=ocyAklCbG3qJwwZ!0Krd#qb zM0)ZGhr~P|x%@U2R_#cObHqC6sDJLXP~DOqyVtm14o@hBOx<1sS=cC9-W`~48m;TE zP-brVZ)EW0>Tk<`+3!B*zpwny<=MVzwac^brkPqZNyb+0P)yx#XeWU~t4W(eN=B>> zuxN7{zdG?Px*u^w2)a5$PtaG@69f6U>82#BaWq!G%QKVpctWbz7|X`I!0OSxVA8Gn zDz1G+E&5$I*`(~IezS<-Xng>kX8j(j(I}y4#`D#YU;>6k?8rTwz9Z(7n zz-|$=vv6La^I)kno%F#$SsXoVPV*j++Y?j7a&)Jhs_qnX*9RrxK|y#(5+0Ikf6#|; zuzH({k3fw95h&bT{zw;IwAWFLy5TJJPH1uQV0)-q+p|;K6LYC(=1P<@Dw5^356X}z zF2N4bcW>kyv?9VUp1Ela%K3?XSoA+A={a>7PAT1|_^`pkD<6hJZaz~^`c6G;2J;%c zRl75qH1VpqsYFzIxCLxx4&x#zmIr19l}5PylU+9bF$HGjW-!!-;Lh$9A7>|Z3ihf7 zaSjUn*=$Gw*bmGxf;xYMN(G)bP@xRYA`&Md&=#WFH5!l}6fy_mYveDLOAdihS8Spgq~nLh{D+82r8(CFWKJw2#>?- z(NNViI9n2mb2RWcjEA8AJPd(Ia8#RH`5a&Kvs3z*q($CZIgT1(77wlJf^%sO#cuaQs$AlEv zEeX2?VUHy25roGj;c-FOD+zlAVV@-I6ND!u;R!)_L=qkmgeN88NkMp2640_))jLDx z^ylD-5|65PfE*dcu#3MRtooY{yxXRCL2qw4HcMkAfZ37U3pX<1HAZ>dyeRi=aNL z;2lPranJ!9qmRL4CNIKi?3R;7)$nru1HDT@r%fL_tcWc`cRU3YZR8H-x|i9gU0lmz zHnR-U`E@O8`m}r>wR{&2k@!u5`hHjL`wc9QCwNqa@B}egQL{FlTf(<)3LixmWP1;8 zYzc3V!$l@le+uk-VRGhoYBpmZPz_$aZaZk~m;jIHYQ~e$<(|T=YGA}@2c6NLoh)8% zns*d72Q}kk2cD`q$$!KXNjay2?<2vH7ANn&w4ybh=Fv4Yb$Z-dRUUlQ$HH!$X7jr| zf-z*N17|7Dsd}8oA?}HHdaUwWcu9L))rM-1=5b*@J=K$YwkpDUXhz6nmCwB!ZDR>E z$IfH7zai(_pRu8ZN(7B-Hpb^V_%^L-)Y0Ij9Z}nla~_PocJWNJ&-!vLdi>W{acK_M zn0Y%;ntg1vO|}pwZg%4t1$E0)KX?=C{Sj!9sq`yeCWx{H{^3mYBce~$_dv&b7N*GU z-~kRdQH=fcU59(mn8&?q#`6$;pkyBO8}JdBF)vgfoc5={=H?F2>B0_!PJMS7o8!i`!bzs6vCMeg0W)h=HQvBZ{2Jup zMTZnls?iQUV~D2sLiOcJ$4KJKoLNsT!<(nqCOz3bYnbb%ya{!o$b5q0rp$wF`)8HoJ7P{PBEHZ({p5miN%rOQ6 z`8KGD70)W>ha<249^}}ozfV6W#GvxDl-*AYVg8IlA7d+?!O;if0Qz&%<8y+rUlR5U z!t;{wydbVI<$|A`^~+iQp@(d=AJ zOdZ`#!lgB`APT(*#FmA|x{EUjYm0U$J_y7Cmpzm~E+lWr~@0>6Z>{!}B<@goe>V!_=yO#epUBZ{=nq1WHY?)Wr|zHo>Bl`d37in1L~up`}<; z|H^NUTJ^73OI|bnbjY(tA^KNDyTH_jVQSS`1s)Fu>8AdbQ>1?-*d9#%D^_Mr{VOW; z!G^MYg8EmElKvG;(nY_he}()>{VS(P{|Yq;Yim$7>P4a5npM}of}CT29x9_oy(AVo z)st*)mS&F5GH;duwbYI1%AxvKFbL{j5edhrK_aCZnqW}>iu85)q^jv(A@+p+l^XdZ z{VSMaP5moSdd5$V|D=EAkissje+Ar(iw-d^Iq&YM_RAig5?=RzlNaS zLIeID;`oO+WI+8kUp4-ANF^>^y(l5|FSxPnb*K(GAc-e2;EQo-D%>zSOqB)m>6T`D zJPMPL29?M8PhiUe*c*8htieyrwD?We-~f%P=hA|R>YK5qP0e#UZ^F{= z$fskLGdi{$4<-5j0}P4Hw9wGu*U1SDp=j&LmCU+@pm_l|1)}+=2!T#o&Mo1dKs%N-n#I#TKs(kvAm0^n zvB2UW-+T_p-mS@Zga5?$DY~_StUFHOixz@=E__f?O1KTqN~XHPHpkgjzLv)iKjC*7hs}9j=!v1S*40Z1PUpA62=1 z$qT_Uc;Qg+Ojim2eUHXPoc`8_6*-){Gm>CxoDJ$8&*RHO3B$VB7&U5$$BfY+O zceYbAexOPHJBcKR?0i+m*l}^L@ASgpxjtx|IUZHDHE>rPftf=EHdnR$2#VYv>1E_2 ziabZ+5%H*Md}xR=>QJPUCnwTIkhCiCiHn@8z!v-azz67Ah=w=GR2McVQ`N#*-#gS- za(Je*p%P@nO<#1G2H^E2%KJ^D`R@lPAK!r}VpQ6;xC6w=J2>vVqnICf2xLOp;e9Xo zA_~(9pxSgFPK&@Ub~r3*oJ7BCz;Xu#^=eNP>mb2?c;E)ku++~DBx5{0dE0`Xo^)&e zbh-7AK<+j>?x@%_dWSNESPj9%B+*xV^j&i$4ARLrS`9n{iI&2R!1on%@n*gW3IFgt zSpQUd7WOSL4g+BbH95R)g!SgH7xbc*zmE-K8a4=Arx|a<8s^`<91+W$baF&lCoGA2 zGvMqd6>rj2oKVcm@uy6_x$i0=JwKMgKNf@&l5j#0K9Yow1mUD4pry5Hbl_3q)y9j8 z<({Kaq?z{|$1Zs6=VLrE<0g5H$3vtA>ZN_yBd+B6KIwwliEam1C6&OXo8Zn~6w<}~Y z)ykm1T3F5B%;Z259Efl!A>krJ>PnOmpB%CeVNQvyhEGjge7=WqXdAdJubwqfls^<{ z;qaKMCg$f(?m=~umvs6_<0GAJFz@}y+OFyAMfoSdUpW050ak0 z46jNM+|Oa5s_9Jr(;EiQ3_)BcYsBTZ*>ddh;k+9OuI64zT>k21N^!+nN|X19PeLYl zGM?1>m*>gmPZUu_OMXg`pCCu^J_}F(WnA;FBrdsG_(gEM!FA9;u&t=!$fq`NfLpa! zd=3JjzgiBzHTD(lc!sFPzG5Qjr8o+kcd)yNaquY@{*z^CucxF zz&H5H?`c~OLipVozv!cJX64HGm27F@GM3;5WV8a;0sKyv(ZEFqSYUY5Vr}{;*c8*8 z`bhXSj)`+T8>YoMym6Yxk(ig^v3ndz!!~9_7Q}-!kz3sbVL*#>B*tmPnaA$s6UeV% z5gAr~zsg5ojL@S&69EsEpK`;SgkE4o74jM8J5{)+PVyNT$8E%TnM0TU4sK&=`n&L} zkKq3F_wd_+Mwj19kHZz2GuY9BhIT|+vb6k$QvvY|`(2 z&GLtOiImMt{|M^=lW<@HkhjyKNBt0FSpOI%VF%zt`uCWvv5VQ9ito@0#}O*d(+o(T z6Pms6WNy9_+527+z83@x2n+l2AA%i=(|?p6e-s{nl7ycG;b%!e3w*zF^LgGUmbMB( zLqD2hY+iWVNnfPNk5-YymVT1H^2HJ)*7Q>fetQfaS=9U^oRl&AUhMB(`HNzC=WF3& zIx&WEz{jlz7SoGa@Nw%Uw5L$;T3+_bF4l57V0`9xvJ=(g^OlPzfhdj|M?T{tLh`2h zdxWstHY9gdSpP)$E=XR6#aFEqBC`EjPU9=~Z7nmZTofCjx$~7*%U#>@;B#oz-}cGl z(^Z-e&Mt?A8iWaCEiq4q()U8r;G3X{Z-(%G7%XAo+h9HZH-P`S<(!kzJ2!9#@){*b zm;ZQ&z(1Y`)alt@wUvGXXL0Ptr*N?4GezDdaIjmrzfZAGLi=>v0<$Z`JMQ65{}|_d z*nH#j>+SIC&hFzxRTd!0b6ieb{-M^279P7;vH3mrSO-1w?eI9<*{LGyl@)MGsM`9J zIzxmla8M>18Rj1oHopoJ4ciXC5!rphC{fL$<+$i+6V!##!lRjqYOzlJDN58CVJ3P4 z64k0D%7hdFHLe)G@^{WeUbM&MMH`(+a>hU8X?dBlrr~E zA%y>sgg*q~f+SoJguf)=FG2W668<5%ZHM#j?6gI0|5a0N|Ao>8Lcqj5$Ul-)qq_^j zf!*kYR^ZQHtm@aBtqr~x02Su}`c_WIOjwVV2p^Oy<1WZ^nhFlXK))B_GroZ z`%1B8Ywp{OW=Uo8ERtU8#JM*XSr1j8dSxt^@U^1s2Qg9~0u=e=$Q zkD)3;P>VSAq|bV$IYQ3AFBg916@^#uY;`caKhqLVLsg$wODr<~@ywMPjK>!mPnMOR zcvYWYTSOF30&}HZDL;WL;wN1-<~kX@K?mP-@w|x5Zft=8qocc;xLLF`_(tA(wAYDN z^;;Mn`o3|g6g671(VIk#JXhm(%X29X7S6|p&p`*>1>Q#d9lUO9y9~GKXJFzHa(^i& znOfGPOFJ8tmC!Jx5(Kzgt6mkVfwk;(S@*1AZ5@^oJTn$`p6Wiz7(-%5vyWtrHF93dQ3fPN^WkEsh3BGHe z30X5=QfLPPeyi_51i!r`q?vmV7$A~BDo4BM{_9iZ2Ia4H8 zxHs`-jr>^mCNN)Dyf^Vx&9VvZO%PXCyf;xxImcScnafA8|L47lud44SU{ukPpZ{ua z;y=W7MSBxB@d1_->?*GMD^#%3^2w%}%RxTsDXJLt(838!641ieKj7aywuJlrMRJ`d z#zpXflW2+#4ppIwMcxP{0awLfzXIb7IsWC8ZO2z8zJi3ASrh4ci`-6U(K$g`*+|5Bxp<84l#qvRWu784f-KvDYFuW0~Gse%Cie zN4PAIa3MM(Bq2f&+>+oHgh)w1%W2UF^yBccHzu%@_wm3+Zj}B(A8El?wFx%{WOO&~ zFqC8WDK>2*K~J?nm6$J6CY0G*0b|y3{17m(DZof}E$(pM$pl zKH%_?Z{^PEP|d`9wZ^aN9h?w7Qe1Oe@(DW+9s_Vq%N`+9;aA_o;8qqBQ#A>=8sYV0 zsx`JH5t>ziyGF(KkW0fxw8Qd`(`8j#yETqIahf1MoycCCnqK!40KXx1))&)C1f+2M z;wmF-WTSCX1~Jo+SeOmQPa{r&UlRHj54t9oxsleNWK?)bW*VI(xcS#D_=UeTZqTKD zj;<=Vn3rs7>;%&zsAJB>ee2 z5!0~v*>8jmUaS=oTn9YEh6|w?UnKsA3q4&-ujmz;014fsZV^bZZ9)^P zaT$rC$MvdrPo)ljk(ip!4ln8IcRwWr#BG-N`Lxd2SM+QgQNERfhhjUG+~zHdz#+FS z!i9!NvXz7s2xg`VWQZ>U>MPBWuDdHtg(%fVjB6|&%#%;UzH^AbuZP5cMVy6ZPC8k7 z(Q%zg)U$HTx4d-{^M7Y$*d^Gqe;X&-YF2aa7gM-_;w!84@Z7m$~}E zP(w#%c@RK-RQ@Ux9_;ynuJ0d`#C_kiIac#fTS)xe5SZwW-jNjU&Ah8;LLkwdK`2Ea z(_3O2gXV)3TmBcx4Yd**zM2PMJI-BUt8^b5$*1^V7|nkn=Aie6yWNNeP|)Zo+>MZ< zfoXkTfsyHM$U`7~Kam*BouqujJ)uOBF1yX2^dF)hHGYlwD^i02sqh5-;_m91KBhvC zup5ER(1(ar?cCgAuib^wACg=<ooCe41M%M@99@cQ*Bh>e0i6!}f#t_JHol2+WhJ7pC*8%MvYBMy zyRC>Ya$~->z1Uy1KzG4iow7HcPlEsGeclQFxziFg(ayJ*mFJw!T}*hXNl$cJ$jab^ zE67e@g(Jy|$ZLDTf2PQ_F1`{+GlLe?51)$sxN@r|(SBS`C3!*@Z0>-ljmQfP)&9=^T>ht5h3wXs`Y`A#3y^Ae4W&Zql zn*#NoHI>m2G;@HZMV>lqn-lT5EX+6Q?|xyubzd&QNNJ1`pNgpMFWxo7L^wj*muTQ3 zu__5}0ctDq9Fk1~1z;)?dj)Saj2uen49ws01NHyHu}U{5Pt~%>{Fl zopISK0t?Ctb)`~fKGe3DjzU8{f^6%Sr?7f~m>9~*Uv#_mZwbJhWfH$hcTQ&0T!nDy z;i9!T!b5_p4l zdv{F=lw0+x*GrPH`*Zt@f#9wn1bZ%JZOo#7cx06u-Ctav9+OKFv>@S%tr z%-b<5`xRvJE2Ty3R}H*|%wIcgJ(07Gu#pCs)h#lum%o&jq8k2LlN>W*KeT8<=pyX& zkQNV2I+2ZPCSf5S4CvR(FNtm6-q-`b4x>8O8_;K09Uxi*hZXH*kc`D5Yivc$L4Awn zSD-n$Exr32#2wGCyv+YXx2dK^Z#~RRBlyF%(0&^12_!C$t`o06;=Rcc2<3B?_8Jjh zti3~CEbMPug^RYA+HW3gdY%=9_$F1rrE}A`toABBo&+mb3p}}rSg7p9yj+n(ht z;4%M>9}*Ugic4(9BdOV7XuXb~Fe)q#LmWR=IhA3+encAta#G-Gs3ypU;M<34TVxgs zQr2cbLgfh4&5+Jzj|kOw1^9&VQ{G-cb!J3yQU}=&kHPcLx|>S(qaYvMcE9$l3g~q5S(d zj3Qsw{vVI5C8++}^Hp3K6mX=~Z$Z zcNfcHXsCh1cAA3Swp`7VTFe0rhUskB_(D-7 zAZO2Q$>bS&@}4*oRn+wykr@~=iZgb#63v7W7=&8doNj>1WgAJViu0{=I1FZWhjB3Z z-dcGjd7+_!%Z95|^;<3;&a+7THN^0P)b^s?Rx+PCB$|wV1ZCe{I2rh>QdKEDu%rq4 z!`!H}ofihU4{&wkqSz^UbW|#ftBRa9bdpB|c2aq(Z%2 zeanmh^eD`WZuSm~97+g(cQ4WeB0Wb^;p4NE4>E7Kn3OybXbl4(WXwp)MFPZRPA`-$ zNMA+aPxc1-ZSQL`k`Di@O#Af0>vc>no{@@XEwsc#fp>jj!TN5k3ZFu*4u4p1LCek~ zu(}`3)CwrZ1)U($-Hkw#cE$wh^e+699npL6+4N*Q$?h|6Q?WH32DN!F`dASoIbDTB zQZvE&M7U*a2z{@|aBJWol8RcnP*KmWm}{(vLES2242na!0#Bk){20*m0t*dvd6cr` z!Z$9^M@=ONzbnwsQ+Z~hZE~=t*?vM1ajB1N$&K;-8XD1579i>M{jT`+cRZ`W;;%ky zg{xd>jPGz|^Z4iO$n^TaI|C&ibH$kv(57!yx}OczHMnJR=g5MAwXuczPahK1N}po2 z5mI-NFHfVGy^s$3g+_}?9sl+wT~Jix`L5}L^hnh=TD7r?yI3V}=#~Wbc7P&OQ56LT zcDTX6pSZW>aa|E9T19;9so-a!iaIGcaKmv@7R1o>=Ydp>5`nnLuSQ@Rlx$vuI8gjX*JP~@(Ou7 zTNox@N0`hdCu;2SWJxa@)H2UOYe6!+XI5+*GbzZHcSWhr1xK5daQlSS)?`_X`Uo6t zv9vTLTk&Off>dIe9Ph&lqR zPuwC&nXFqn?eRN?79lixqWp^K_@ZIfq_}`wp$l3VTL@zOvNqIk*OW!QWF9If-qcH@ zzx;t*3ZX=AO`KVD$n@#3bwbgfLRJ==t$F4R(p_6L~%H zShq=gZV4z|T#)pwgvvrby)-cP3UZ`TS~W65u2sV&?xNz#S3UY48D#9;y6Vo^OgFy+ zi&EzC@*9Bps|E9SH=LJcEI5N=f04D%=BLl}87E@;6!Ph%C}VUERug!!4qnk}tu{Qv z{mKo)56IrZ^+q#y$e)@^=hobzeGY-WImtSzwR*}y*yfj^oea##D|M!ipl*lk%#Mj! zLJ~X@T2J?^%dCV;SK=dNUmbiL&h}z)VkEuU#dlu7itk-yylg{xiN2k$bh^;PV1w$- zkhnLoYmyuV@vlN>svQAmtxb5prRIf+3@l?WyTncUJXn1RG~6@YVV8Vl7b%3aY$Jt? zCYZUfRtIUmwKn)5HYnlP-x8@NN_#zY?g#jD&a(%kW-qN;nDkvx@^~EKX&_O=0x0%5 zk!brniw_Q0nUdJ6C&O^8Gle{1$uo9!?CC%B0;cwl)Dc9ib-`#40`~DARnJXf-T-;a z?N!lrNITtuV>dU=5~S1B=u(HX?gO?DW47Ezl|~zSAFeaQ&c3d;&{aC-X52`QR;t`i1tOOWx~es|8sCg%Z1a4_hbiX;;+hC(K^ns% zaLz8H3(>0iZSi8NSVW;%v$;6vDa*N25Vjg$k72t?yzfRQ zGO9FJ81k;rkB2UaG2@>YSK$4B<3GRe-v3g*?TWiB$YWa*=T<(V``#&k{~eQJ9+V>0 zWebEVYNvR@3C~YiP|wgcmpn_wkVZRj&{FatyM}o@<0qMU07<7rJg`#%A7GN4MBryv zdbvLvEaZ$4E8s!P%v61ADX+8&0gmw_f8Y0IbLB$Zw6};N>j_n)cFm?}VD)AF$w}xu zd4CQ)JC{J$2i!&HmPe2z*IXC}{^|HV_Sc7oY3Os#;)K(OVr~T+0GNJ{ZQbx-trB5+ zEe!6LlE;R|p3vdJw1)j|#B)!PD38|yCeVcoIJ*p?RLPOl*4LHUYZhURT{@>>|66*= zugOX{%89i(^C4hv4_ch(5kgMo9vAy-G#$Wd;* zN)ub8c8-;}WSZa~HaEHlog`r#i+ZF(#1ZxgN_E9fG`ok}ws8=Xf1`Dw!h)5bi@m5h zM0~2t%vh|T6uvly^*K*|PdeSTwynJ9C~+9~-M#V}u9j1`9**!{caj0_@~gHJgb(x* zhT+{wg}~*WT=hc}m0%yOq>Y>JzB4efqnCR@Y zY8ildf1v5@D|K~;Srdn=njEmnX)cn3_qC>_&7SYFq)ZeF4@ev|(1(;-!G+v~*`L$4 z=*D8yLX1n|7;7-NV-P_kKMCq26YkJdq$-|`;Elt&tmAAV|N zM^vs~*oUDgJ5N-uqXD6E+B0EM#k}M26XBIjt5z`ORX!drd|dkv+P29Yvd-wRP5Trscz6MDQu))HvuMA5 z9HiEB2;e4u_FMeiol+f39~&gp*2liI%5cCe?M6Ml`1a#5R1QDyLIipLp0rd@WyE}$ z54`b_$DS{u%a_;OQ9jTlLeq>>I{9r@+q9f*Wls#dfG=PQyzmsryzr^VhkxVD*qY_b zr@wfG)E!Uvsy$Lu9WT@Ao4(Q*FVh&GzSeLmV`Iat1%{@3Rg=d+zV#3Bm802<4;lNH z9nA7cQ8@wKJdV=GLae2PxYnbKi$SS6Ik5k{(@p%k&=AuV$Ox}ZZyO-zTp2Zdz-DRK zs_?(!5=5DCTMI_W(y-6NLEoS(03eYI6 zB7XF-lrz`3cZAUge54K<$05y|mqrD|W&~y4)5+!Bmb1uZFfHSaQU(>Zl#a$&g1mdR zz~Td`I?NEq&DU4|DWDyC@O~MEfi3&HDAJ?r#4=&_g zp`=Kfh9r9u4|i1TC=aoG$q@oQvJ>I}`H5j?Vj5IuoQFHBG|5w$zl=ZltAtR881M!k z;mvlaUiT2@Qr8U7DM28FQSyjaPKr-wZGt_l#EFr8t%UE+B_0bffEFWI&jls_h?43) zsvLygRHb(1ak4?`II5u5ebOCMP?e&~ClKiyxN1t+P%{p^eu`+;;$;nq@|i{qXkF}) zGOzKGNOuoJ{-ct+LA_mq5o4&MnLy*8Hr#=L>)4b10@(@IDAv7n=P-LR^rU^B{{i+I z4haqS3xAZU7USP;`(O)9M@Mo-f|^{~i<`kKRWlbI9|U`kDz`=gH!DCZW=%UzWkm{t z)iz(iGm?)+r>ojRJ+Uf{K^4-GEwM|HTBnGwqWsl3B3PVzH*l+hD{oNPoAcsg>O5Z- zT<^!ZL;KP|qA3f@m~M=_QL`6u4WS@hN%&tHALDmNO|H_`3BtvrOLM5#!(K&vE2!Ue z?Mn%LkR?u}6qi2bQjYLCNyG8B?&D$hgQMG$e5VekUwW`ple;a^N#G~>F<8clMIg$l zFHxNM3z5EBTMB`xJ0-8&Tk!y~?Uxt2)y?+X7R3WJ%Zff@?iGJ$ z8;#p9R?p6uM=(=B!&W)4(Ce{4!zB7_OVjic~U>Kx}Yg@HikJ@i6$itG8!)_lrMclA)F)wx~HB zouPp^Z#T;0z~4Pwvt0dsnaBE3&6IGOmIJX;i6MN;g7@~Z+$p$+KH8ZNOMdoj=Cz5z zTjZeIt5lcCfUKKSZ6-kV*>^Obeup$pOju=v%g1AdQD{722kNIem4?EZHA5GdN*7XV z0!AX5V>mr|pKTwz3p?tm91#J&eaU=3EY~D+{B+eBuE-*FY<1-W52Uc@2aL36jH3>= zBGTaf?OS<|Xx=krt!r?^V)sLw;|AHjq~+BZp>7L<{2raIhYbL3KEV}c8>*bb$v%M5 z**;ugIs{zw9HJ3I5HqNi!aRc@0O;4&BL5|U&Y)Sr1#!C<6;Jm4d(?Ctt7%wizqy!O z7_uMv;PAk`+_B$q%7?QOR=!>oqlkJ#4te7_Qh5Vgb^&XMpqkGDPB=GJA<@D$TSMt+ z^?{<+K)^J@Yr0(ryZ;~+37Yz~IKc>1NfXZ!q_z)X`$4$e(25m}!GJ)505`}t%s)^} zM9^3XS~8mW*`3nsBa&zqQH?ckn|8uI>9{1&ZYdotp%jL2GBh0B{qY3rfg-IXKr&i}xvKw=~S1|9Hp;vaFD5K^JmvnUz zr462gsCq1)^?5WASdYV{=`Lioav@+wTA&`iF?p&5S1`k}Gv7EU96Df{XH5|P9n{Ur z*L*RML)L!>Ypsh&8|dc{63Xd;+xnx(JbcXSHK!YVeU8W!ZoN-Y>a!OnMN4`FPa3|6c(K__Z zFybI5AMw>qmr382$DU7o;03rp!PpKbSlZN}35q_1RgF;dtJ$;-D81lz_)Ao|AvgQRVR^^HGagL^iUQFXfxTCk@U@w=-e zhX$J@hgAb^Jew#p^FxDi$MsGxQkV>w#A>?9&}sTpO!2X1-cMWzJY`E0%Nt*e1Ioj1 zCI#_DB>5`=Ie=E9rGT8VAOKW-qIJj{dWJjEAJWnMY;aa0$&Ydypz{?}?(2djHDhC^net7 z-RUQ?AKTfDsTf(M!3nT*Z`PK(IktST_~7>y7|szDaNh#|8t+Vs<;$L}kZgozj}N7J z*}!Aj_6BFC0}~KlYtFv0`jQ*y=fatJT{H>ev&xvAE^phtxoaY!HIcFk$=-*VsYl-? zp1jIo^=^AQWm$eyOLM4Ak6U)C#2n{GHE#7px-_TBIth3q|Mr-o)D(742bGe z_04(9?j)>+RQ5#Iw)AECdrN?1i7$*YHxu^j9%TCaU0%8}!f*qFZCs?XYBY!-YPG2>tWhPv@}DBBJPieBszlpDcf>$gX|VJvT6SO5tj^!@34?}k8j z;0EzUP0wtWOFZQ>#CqGtcfo+0kIQG7D?trAy5B;mPN6^&E7d0oXDj_g(!uh;-z@=~ z8bRMn&*l%RUJiyBM%fTPM_pW=&sN@-orCKp&KJiLuT9lj8UlkTOL0VlOe9C<`Q;W? z=csIBi-#T-nG@K*Wv)(b-Rz}7{>sq@H)1SN*y0HUBVnCx7%R>#uy)5sjSKaB$Q%ee z3g>=}otc3P*7!j!w|?FHWc<^TX@y{Jz@q32I1YqG;zu~egT^r+B=kKrWx!K* zh*OC)gj+LPTW)u67C22Pqf~pPQaBxpfmgw6sQ;^mEq3wh?jU2N;dELpUdA$x3Pd;j zB4R9<@21sLwhj_a^7Rl;y6Qc2kP!b~)LG})?~JMZ(G})&NI7ff!tL|q-|S(%aVJah zqqq*1o}2n-Uh?X9x|zh1E%pqBFg+B5r>BAg*5q0dXBQ4G_9IH<%)$x3m^bDTHYkz) zJd?TDk6j1X6GBu%BZ_-mn}{&#G89Xnj^ln7wwcKyjIcGsc3?MQdGN2}s-WA~ijV|A zf_a)kpS^f7iv;RYn?w*lgAT=LNs9+d)u6+?u8 z%ySXl22W|UifFP~Yq6&NIP^n=wErY9^UR&bdDA5QreSzvbwG^t4@4-eau9ytjdeF1 zJe6)J+~(Fo7fTv{&rXCUB%?5lh=tvz})tJcLa1qwjaGm$3WXfADE$OHjSNe zAuO_GgxPriCo-+eR15?U)&fExwPOUtgxR9e!qEK=uM`)pGdic4*OFyzcf5$R2(3k=?cJbsL<`EIw z+*+`GWl8)^2ZIvY$nARWhC+>|>KtJIIkyb6dg1zG9$o1`H13S<4SnJxf;n0n|JcF^ zG#xY$f(VFhY&jC5rsLnxl_)?4FF*y7vM71iIKL5nQ6LvPD8NN46bPeh` zc6$OZ{&7}LOIoB%`ZMzZzWAd7V$NX7n(Jcp_@y)6&$YXl6f4sWMt`?csQ3LzZ8)vL zaiONG?P9ee1fx74Hur0xNV@<7XA-@o41I_CswQ{*-5+IGl2-Uf7qM#G18nhd^dT0{ zE6%W$JBOyC3Wo$DwA)XF+wGcpg#?3Wk`WgpN(j}Vfn7*Bou-uFv!&o&NKj?A95Mf$ zTMGGDQ`$eahdb%Y(G@pCk{M*ABvft!>(2uiwAj#}MOS1d8^xV!io43WRdQ$~&$!HK zI$D3jsdY>)bLKT_$#F|K`lDUMpILDi)u4Ut=BWrv^gmH>;3XS|6Na9jxU|<1A&)*i zjC(2W&o9b6y)CQU=~l)`Y0xfM@W+i>KZG=kSt3Msw;~q`O^Hd6CtrR~1$tG^j`M>P z6kfFqDisPm=3ok9!R}p75xU9?RJ7?$QC$4XcsuIUbNI>TxIvIzqPC|4T#FGZ zuur~FfqRu6Qtd)nQQK+xC^F94@M%lLQ<`Tl_@FZs%R)#wGml*uzi`J`HX`#)&Hj)* z)y?8K7m+<Dz<0d20y_nUf&Adu9?Ekic@69J*%WST*`QVRCH86E(XJ1LNZY=OYNb5T zhYi(kRtqKPj^WyTyng7d#xFQY{PBmo9&|ZkRVo)sIKz({t?vuBvG5jQdiIo{Uzn}y z3!4Z#C|*%Udj{DsOBaw&-N3xXYWItK2%~Z@XOw;?oY8trYhCh#=ZUOHU58Ynl&`B2 zhn#6D6gBgKFFI!VakmmJ4xeci*SoPTsm;I6=b(WCU;XJd08zt^Ab`?f7*;a>_M#v^NOk0}P?hL&+}>I>vON9`yvmg#)M- z61d_R)vc=Mc^n1ij1lkvr88=YW(@7-49%;A1?NyDnqAmf+7NmJyDgvzS!WP4U#vVbur`qdTo0-DK`?w+_WE zX3W>4pgqR+dOxak#*=9%KzE3}{n7U#O;j{}G(h8O0-I5e8TecEi+z@Dv)!Uxmb$?E z#|bjSFh7CFB=hY(6t}ROc#QX{(Da)#0e|YaFr2T`>?}_0;u)k>uDnmL&&IsX901lz zpQGC(yWsqRF0p7*gJv?s+?e~aUcF#g;3`=%Pf}29mzaIpIs(G>t5{5+VKdQP`1>re zqf;3D^{K?yn<9%_Gsw)%Z60jmyb|8nrNFZX&8yzpswt0?_|>zi_0yg`RX<={+>$#) zukt2mlq&vp(&5oG@4wTRqrC6Pwsl!qRh_SBHmCpKc>}bMxYX{Cha5D2nNPti)y<<17IpDyi>lPS77(%8oT*+JbaV;;xZ1ttAJ}2Xm|?vhoN-15r7o(3IqOr% zQsw9a1#d@|HloWRY4aLu^@`u{a@LFAkTYI*o>Jq}E?M(YlO8z7fGF2divo!te2%{( zOF^Z0Je{sEY3W0t>NTSQ*BTSVdtQrdnRUmvqF#~Zn?p`cAKhEYFEtoue>&8e{?jLU za9PeQfRb=2=QQed>Q#+iXrO{_l3OCFTF65S`RLr%>)rH zdd2y&5MjfzwV^_TE9^1#{=zu-y$0~7WOt*9^#lqU z*v-W9s3&sTOwg%#kUn+D-&uGQJHr7198{|Uv(mVH^A|bINW;lbAI!IAVYyHZjZ>uTVAGX&OR^0vA`S20(<(w9T4QBjywxuCsJBjphS00 zd$IT84n8Ev^WMaX5ysv5XV$o0XlEP7%)f??E)T*C;-twMGg!0r-YRX=F4I!|2_+hy zuON3~!qtrXmn_1>{4VQq$D7xO=cHOn3#mIN_q?wNN`Nl>HKP}8);Rr-+bDIiHu6ms zzuDNqC+v{7X)+en<8(@SS$@Am$jLRgN1%1LgF-T;LYX3^^2rYSLtB!YmX4j!%8G`O z-&clUjo9oBA^7uZ;kcndeg{cTQV3h3C;gysoKq8VN_Y?S_M_|cL~EBt`DO|3Xh?y1 z-9T*txqnyQBdU96BFOouDy?;QaMn|ZNMH44c0hwpeXwO7(%ofhcxV3ge&L}R7M601 zmnhj?&C7kASxvem+&6T)!gnB`68$c~|9rWp?*>(b_dfx+Pf|x1A!Fyy0J(lk{z!d& zw@V9qd8a|Qts#Rn3f_~f3^d6&KmiR>M@zq$$8i?az6Y;-)y#I9T}dm&9_J_Kk9;}>j!PtLGDiuT>-HO!iFDr^xb1*?JvyNv} z1HB1`-o*;QOy}cZm$y-7ChwVU{Pd~rK5fNWx+#Nob>OU^G87WWlB+mS=&lBpM0_QO zm!#aC5Lw78LONN%K%6=$Q461SEE(hdok}iqzG#nx+SwE5y^XbA9^oW@J1FeRG5Z9k ziaJilttph{zz_fO2OuH{X4_)9saC^|FvZM~np9CP_QW1s;g5UCk3XHL*M0b#RT{U@ za^)$2oQN7!CUGmS(1$X3n13ukPZ|*PDVNLAtl&1F+ zBhq`W|Mp80I}GUZ_W>W_tTKcD7w?~Z<^Ns$wrp;GuaKMaT#mZa*lH!76t81OoVyPe zbMGmfcRh1=LoN`}#o{K{l)I(&o0C0hUTFMnEjAgzUUzmL>wA%aV}c?ByPOAWMTR-U zF2g(tzC0ENcTsMocX)pj(H>z6_c4W6=%?ST{ z%4O_Xrpto{8xS+L@lMB9vivNW2{3YbO^Q3Y!{-B!ddI$uZrve({)&Gr$pq}C%Bh9^ zVJ7;8avH*0^6{dP^y4=lw*L1t`U1hP2NB)U^DR2+4W$?yfeBv}0AhJQENE!ZE4WNe3Z z@5256iuIJ`$E^Q9p{_tY%e~<{W1G|-O@n*-k|AYsGXv#rnlbJ1H41c{dV4n!VnLcA zof`N=n5A|fyxJeJdhbsnLUh!JWUrQFxUEy(EHbPEyl^m29#67dc0gX|y%Q;R(qX>z zWl-ngSG(d1VlBqYT1Qbmq9LL?x&?9_zG+D2W(l162yf5Vo}Fl{N>EqyB-^zY4s*?h zj&&H~crbA8gbFFdb1f3*eKM?t8Y#uIs~)a!t6?&n0T~zn)m-WqN;qU^msPrb95J`t7a87GEa-jpo!bC z^%n5F2@&}+w)XzrijixvNI>|~Oq6*TojD{3+4 z@C_j;Yj#_E!|F5ti_!rh=XxM z`!Fe#6Oix`pjjx786-zMlmM@x;+9ZCw|q)kCBDgvX(&fL$CP!DYfGNZE?->PqRJp7 zKlUJfVWYJ!k*PM`WPs_rJl1T6SyrZKqMcnSx<$dIN7ifZ_JqYHTex--49cmD;)`Hp zQ%!BDa_AK4)~A+MHosI{5ziZQV*QsqzhVkm%ixv=40`2Ma!PkAuCO{%`Rf&)cFyZw zX=1j5&Vax8%4e;{p|^ILC}vG6pzREdQn;e>xOep`W-a>xPIb!=S1IRf%yns<7jo@E zwvX8r^&W)zZNZcPr{QIsM!$b!W@W9*eS_{Iw}z1pL))ErO5wGY-_QsN$_KL4h3--< z)TdzErvE!o8GLC<6V&A1Fv@6x{5jWSJHM6D#0*83lR?rO_eHUwjOPtKT)bD$%~Oc_)Na6_L9){G7C0hKhxBm znn+%M{xdu+c30^4nNo;TeqkeWttPpcu~(hk_JCFPSy;>EW{Q;PoRi5VdY#0-%O5hm z>zwURj}2r7b?Ui3@4$2~a(l|8hLb_K>@VVb7SFjN0>Y@=o85g%}u{3;jz*mKxf_xvk3_BH;dgSlJ-* zafI0x!7kRM&y?ZEI(D=pWF6h>AkLqAu zoniGE&EED_Lrb0^L_4o6xDlW3I|LG(INuy5NG$ZB-m5|iO0IuKh$3${MQuPrv>HL3 z{Rnv|_c*Xg6oEGf6J%W20Z9@GQZF>m>I0)Tr!!J~!ijA$910SF&I)On-*EDFa-JML zC&muk(^xhE@)0Ft5S+{(vDc=)5Uup;Ja&vKLDOwlu38K#s?&H0em{#z+B0WGJkb1i zjM^l~&ZIv!{IL?`i=kd9>;Z%hy2_1|(OOM>C3{m(>E9wQNe@@T~v`_!Y{TC_7u<-o$#k&=CMi%LxA()LjGu(V7 zV#Ig$v6mG>|8SZf-@g31hRdrOPTltPjJFGMi-OsdW5c;gB3$~NSNfH%7& z>}`<1AH8-avhzzR`K)kh{IThw>6e^9^O7;AD(w7Y{`w~DTgv6b6ZZz`NGzh>gZ_*v z+VK@52=^ba)DoO9ZDi&+&z%nxDS!LfDA4lHbfLS=I(7+tv0TzGOqFxHa$qfrYMszq zIyX1YR(e0>@dcMu%~CM8m-Wx$aFH8q?d%PNkW*A|H~}l3)lI$!#pgn}vq1zpj>v(gA0HC+AJfp;O75M}9AnjuY%W&>25wU}{kQV1(?Q?s_1_ z7j=emG$TfJ5LK0^hw2&urAS$^@l6rC1xO& z1XRt~TJmB=$yC^Fwr?v)xJK15Ln1{iCqnaLwr^8vgs@gO zbo~i7FLO{Yt1CWkc7LmavN=kbuKiR2H68nKQH$u4Wme!C*o~Hg46nvkMhO!{9suT` z3%a_ROTZ6M-?-wY@nq~?t0XS zuf6@$$9A@&Z!UmQi1Xxot%-!AoEBCgZD8>u9Iy1Z2Gg%692BSg1C2vhQ6ClBlZiS9 zNAlg=1ep_4OiG~5$t0JC`Rtn?gOsmm;b``zUED*2h^3OqDU{yeiG19HJiw$OM)e!# ztfUeJpEah}kp-1iPHfx6$vkbQZ3ThEZZYB`mwF)~QjpyY`#*lMVg8rtXl*69m7=2s zqz1Kq!J@+ibM}<9Q>f}p4oY%e{H>6MGgT?6oJ0EJjGn3pvuTwaY-r!A8V^y4BRRuS z5f2szx)GE^-P!gh0_Sby3C_H63MVW~ zJZRzF)|9d}er~C$(%Lu7V4SrTLnTbfRnC}5+!pSrh@JPYT>|1zrgBKqN~F}iBe4Iy zJ&h?ox|jTLr|S=KDQV06UqRC}TKO0F$7RiK0}{q%o?1q?wAMGndGjd#bO*g~z0=lFg6Vt^g5#&jy=hX>D2I4^`nFU%33qSS z&X!O`KrA8mtC~2RO5pI6>UM#U*kEU=xkh5-H0Ii3IllT zti0Cr>6w3R>c-&YP^bj~h^`m3Yes43kM%EnB7*d4W$^zHbsq-lsirgya$Jl4A4>ki z?;LS^)|xEja{DrUdP0SDx)v=i9u-7~ItQ1+waV6}K~cS$wJ8|(mioGMWGfrn|HI*b zr85f;|B$G7_JrbQHPS|2pFWnT*wLnr!7aM2rd6@PeG%=Nr2-;pX3uXKL4s)aFA-#< zov<55_l(OmFLfgZ^14>LsYFBb6n4?URz-?eoLP&0inXCs1;wb_yWWywl$J|}m$;g< zGmdv>U10-nybU!?uK|Z*Hg#1DWQlDGAF3tosoVv33x52Eh#D&#KmT{{foomQq@y8}O1=`jle2cbK@v8v+f*`Ne!fEDRP= zc26vi)v5#`S@+aq72%&IDIj`UMlwE=>b2#76X*C{DyVkYlyqV_Q8Rh!Rm6K^N6smB~2m@QYz>u=lwqavb zqh}9D9sP{pFvK{lTXAA&FOB+x!|%ms0IAlZ@Hrh~M=GlNk)~%ckTd zmZGgMpqkekdj#}Rp$DyWnDC;`SYA_Ynz|-edi)0fXsP#l2^K*SJ6uLzihKsCxBp^QBP6nFvvX?XL)ulqX=BTWyGnNF}qa?+F@11 zn=@yd169c^(s?>|rPSLs4(Yy6iHi*Nip-oJ!FBW&B z!tpo7-2Wr#D!|%!o_2u(1qu{eoI-)%THGm4aCa$AaHmBJ6!+k6!QI_{KyeH1UM#r# zm;S%!x#yjoyLT^pN$z%bZg+<3#>U(WU7_0M`B_&$(Z%GJ)|b%nmyvXBTh?<}Hhe+Y z{-vrOVl>GWmA(Us0ot9E z9Qev!-|1U!qk(GGlE_>A*><(QP%f+|EW>GbK!f8m7CtD;N8KTU%Z7Y*`A9cixYTcb zgz-E-r9iz;b&btRTOXkvr0lyg{Yy{RvW@t}3JGT2Tz252fqBch*IC+hTffoCur5?# zVU&1^T9Itf`KaqhG+^CT6&2TK?Uz$g$G9tPS7ksSQ}5+oAUKz`P~csD@T@*et2^e) zunYgK-*RyeMyToqX59--KcKM-oed+3fC8y=*$oq<92wrg#{XI}uUC%lE!ir%$d^eq zatO_5sA&xE>8`3LUT9S~m8KzdSx>-JUrHqlN)oE-7dQ)6wRGD!6E6~P23dAbmt5Ks zx@^XuHHOz4j-NGT-`w74(IW`jB;$79xhCTN2l)q|6r~Z`Vgem&0Pf@=8%wSl=)nRo zS*Ks9(;5z+bN1dm@~$H=WFyHpL~!&*B9yvwjMmA4f~#Pv{GvWNr9EggnCkSI8<+kJ z1sJY`kYQKSWtuu_Bw~)YevNU{Ux+ zZ4)+w3?(zORrNkr!&?Bgx9+3hXXBvw567!f)TFN1}(p;EJfA{UBZ6mFT5+-*83ip?C zP?DBVgbLLMaxg&(%ql3Kb3fTBSGNQeREl2H&vJxj8uSq!Gr?BJ^9I#(F{nN4g<5FX zoBem030X@>3m({{RY!Uhm@zjLfk<@y|4D;~v2BgR0*#3R4ppq*wK?JL2}NzZ3B=N{ zdaLBbZ*5_^OlTO}_owkIQ$n9qIa)hKSd{k1{W$v2C@-~rsxUZO#r6H^0EN}q>6+NC zvwUrI=pCla{_}^MOfk9d4|iwZ!k=EMS`_X^w6g@jKg@&U*!SFjxS^ofG-_*`-Wvj5 zSfKgO2vAdFhtTsu)Yeu{tPW17_)ZVBwT=J&6OMYxgv)c2!`sfHF=mLmz0FKh`AK0N zRx585k<-YM?Lim>vJWiGt57U_8DeY2ruq>2D0M?~}RcC2ajUc1fJPeL1U1FOI29 z1vWq46TX?3AtpLe1hql@iL$j(#3nWaN~0Nab{Og1XSij#_&y_#qM-IHf>SWDg3lKN z{)rN}V)5-12d-Fjcl=YjNx%y-mj5lpnW&R>`hZn~A!;40+O^*iicBinUV&Z4XN-Zq zn1omnyu1EK3AM&;DwOuQegq@$7F-fSy?`LVih!)PDAj=22;C2H+%|C{%!+*ES(&>v zc4E&MoH-YhN!1Z;LJp~g@6(-f%-i30Yx2yq+{m>5^a?6|?9Myv(snj(aSB*ad-5xNIOR8%iwN$=M@8PGGrC~ z>x}(HRg&%}pAAIG8yM@`Q8{>5*wLIt{pq=3NLVd#?PC;9UXktTwv7gCQ)>oR0WpANu@UoUzD~`h4NSmqP94=m*UisUX$1eauhbHjA7m zw^aV826@QJwlBq*;EMeuk3YfpZf6n$?Dlu_GM=Pj-PCuB&c?_@y3asIn#; z8^WZcCEY8gu8ZA|YFi?1WM=yQe@!%s-=cyAfFF)<#H?AeNCKYSaRdlxQWM)Y>dJ@62jVy8oM=EFjZ zVQjQ#6<$6&V~xrOsb}Q#RkC~!YC9t6NWj#1L#ZFu{(ri&_^4OVFRZe2Ztb%)>ohvu zzbUDMxX<%u)Kwcab-E*$WJ{NaBUBIhH43SQ@tuCH{uIcI1BOhe!7FHn$i zZLL0>XPBOdGLqMW@>4~ZF;oQkMoJG*Q`Eg?#ae_IC3Jf&y4*xJmMmUaA$z&2yrnrM za$k4*shu?` zqDrAb=NC>W3(Gr&`iQ!`RCg!M`UMsi!iwd>2ZBg$TeW8lDG!)xaNgZ9w{uaw=7-l+ zHNqvzgBeFw**5A9=Lm$&{c3=chlgwtAn}kGi6IXITFsnL1PLF7*Eoww!~T@=ZRk&94$+nbs~9SB%tAgv!C(h zW8K6%*PlgDiQn}{h@(rYpZj5|o+V+#Bs+>FL0_iJ_nDM28sh7Dmm*aEu*|}jM{F9J zSEyJ$8{%jQaZu2qA1{?z7e}B+Hjn1C7XK%VcZ-j{TC}w$HstP9LuZ%Gz%jRvB)9lM zVY%pP@$Fa>V*#4;dX;RL^xC6_z96wZ!93|MjKF=2bAeQnRQZ}qS{%DLfq60oskDiC zG7{HG4tCM-EghS|Iw+b{on9|r&E2VDN~5j0aX-mGU+-#^rBcY#oM4_Tj9fmvIl34| zfj5t%Q6F*iyL6-(GfOCtKeyH0DN{wf%{x=YrLDQLxWYhRYi6FMQec=D;ySlVh^Hy; z;hH_Lx^eHB;}$YYNS$91l86#N71vuDY^MH0dv=m!wR&WpL}(YFIl8uA0BAJ1X{-zT zo%0DoUX#ezB4(8ELt-{I+&QM0_#ywm-RXJCP|@XEc9v-%N=~{vJ!-CWMs)YM8!a-X z7zw)i%J=$?Z`W3A{DwJK?1cTkxz>b{SdRPw+VrXW3k0PJ6#HeY>h$81c5U9`lS=ON zA$jYa%K3bsbfQa}jp?3>hk4%5)E`YAp4D4IW|34E**hScvB6OVnRz98E9?;?sTbeAL|dZEFb zl%I9*%BO%(c3tM71T0W+O3hW3u`fdQ{H4TZmpdVA@tOivL!@wcRMKfcJ+*~yGlhYJ zpdoIiOEK@Yt+);X-Iito_tTpd?iXsOk8@u4|?B_tPgY zvEB4=-OLY8wveK{tB<9#YASPRvxg;Ck&xQ@*=gl0h~v^B$SN2z#%a&*sRX4U=K0Jl zkZYao|DU4s<4oa=J`v}~3PE}pZ2Ol|phf<4k^0EryojQNhH=RlxxRyG6=Lo^~Z~s2y)rrc2KowHY&4}5H(j({aa>1(~;ZJQ}Ivd z)J;F_UiY6x$#b;>qfwY8Z2&$-pTV z+wy&5FTt656#}0^;j6hnDrf~a5$f;Dp(DhugDmUBu27bBUDxw+>udh26TaEQYpX># zVh*|*Hh5B9{N=>?9n<-_9xcc~-De@#USHK`!5^_x)#vWLxi|HN5AOqg!GTek=BY$F z-)_J?l_AQp7`@ipgZwZz*4E349Fn2FR`M~HPwE{4HDnT8U26HxgqU}VQNuX(PXYyD zi1pV3Tqnp@O``U5h^`v3prli^W4cyqP|GPtSN^^7xeAo3H zdrbq67W@29jB|`cuA)?)l(g>dyxoU69-Dx1ECo*o(WS-aPh~)IE9Iowa@J(}#l_tC zPE}k10aqxG%y2o^pF_xLe0|Z}+p;=CfZR{3Gz+)c{7!;CMZT4*O7OyBZhEH_v}q^^ zpQl3^dOZo!^jLik&Z!d*fgfh=$OO2%?-w{E)896;)+bF-*)Lj^G?aJt+ z=ZY}!1SM&@=-+udAAA+JV3SH+bfMXwH7C2``^K@5t{&N`1q9yD_$9)%K-cNdqA=KG zX>!~@?fN?q24hpNq6o|U9DMKF=OH@}}ZcU{8_2 z@QSEwWbn(r&%~1Y>u3(`T+?+GU{xv%9^$XkQ8cb?Dz*m#76hK`uD%DBJ~Ygx%b1+bG)?RMPs~q8HqZHfzM_!Qx9Re@ zqL$LP>>7VypsK7h(t0)mF9=+(UOOPC%FxbloIJPzeKQ5=SN)hcvzMyhT~Dt2QSO_n z-EWXRNP{1)S;;fXt2|9e#&R~+9^4hB$82vErf!9CZvI=Fm7DsUg|2(5{FPU-Nw{HA z!pxCeXg#NS!__B36xb7ZEso-bNtT!GTUt&lcl!dYZ`EtD;+3yr8JhQ3xl+m#z9Dr; zA!7~ekmQwDdImPwrU=WcYA!Od$@^(RH(EOaLk`-gqYCHgdaruH+>pZb-~(Ff8paso zho6ccf8FlqCWM=1V%k&^j*L<^OCxd5(amHQUo}^cBZ_>;N^MJnLI|xGhp9 zR807>Y%Rr@I++^2OVbFMDgrN5vDIE5fw{4jFvjOjflGYeYz3AX(H9=5Qu|7Ncy=}5 z&7OSMGpLj)T?=qH&!)#}RSyack4yschocolp|q&+kI~0KH#WXLJZnWd_XrrE5tb>v zC@2dSRdz*qcSW|@la+O`9yrd2_-!}aOKo|yx z%M~ih=kv@m0jmIbg}+B!@Cx|*RPPTro0UbZCi&L;TdC@&@YV}FG5^sSukhjYXYEtk zFdt)!MB()u4yy*=#T>F|o9j1b`7WI#S1%|A=d0xt@qL|abqecNlQ`?g4`2V)%|4iT z&mZW1sL~qc$$K*A@}7UMO-TdI3bC-%6y zx}3H@&ony9fwPVZO=-5r`X9X&V%Q@Zt2?@6ViNmqUMPhOahD$>t^mLjmh^y#D-XEI z(j{{W(&YMdkZMs-N9mIwN?dTyPG0_k`{_sy(4sL^uR8Ij~I6N!CUkHS*~5vt8JS%>5< zx^Lw1Ix&4q9e9dUz$do(Fm5)Afuuzq#C+>fsCAFVi zrWkJyF0*c6tkeo1ZV7+!A)ch}!{c$&5W46-#`OHFg7O*-O^W>cR-;&D9V)&c3f%uA3;c4+0<1(*J@(s z{T9v%w_feFk%ZFY9fVX=;mbQ|Des6APH8x{X;5n%i>8)5&BswV)>FFQEmi|!CNmqFPKCF8J zGmRWK%(O#NR@$1C%P}t|M}@02Xy!kWd%BL9o|D~~(AggNiy{MAOO;xgLnHWjOcFSf zU;FJ-B@0L^fuO(>>|05Sl;=bR%n27L=ySGKKimp%Ht|W-NYgg09-5a55kE97gZOBK zapAAusvX;g`d$7*swYXzvEo^-J{7R1`c>X1T9BDLzSZxK0ELO0ycsD~*Hk9>%(fkV$Q9}_crG|G`d`UthSb6sAb%vpJ~B4e7jqf8_CCtu zp>|j4vITWDpY2Hje^^C=f4OTnq3ib050y&QeO7EN zow5zNL{5#Kwt04kx7lIXQ$_bniS5s-$(uVWp#SbsbK^j^tTnlYa6QtCyy|K3L*?f) z1icLD`^o6L6bKpFwSmA^9oX<~*W1&L5%Bj=sS<6~saW*f%rgU^$a}QHtH^1UiZs97 z$?+dn)j7UBTw-k-c0Hxit7j@Wmi8G*k|oNjWt^y6HK{{V^Xm2nz@)tj9Vc>BHx|?lJW;FwgOIe9L;PxZuU=Dt6#~Bmc8@wOIL+mOl z*JI>tvgds)_PB8>;q#PH#o9?PBS3O%^UdffU(`VCaWjW44xD*eu=xQ9%V5RSN=(pU zq~^rriLEcv^tAF@QH#BqOu*xRbDGen=!dc;24^{Z!NMT8vb!jr^lvVM9Odfd2ANA;#;&+^uB1q*V!hmb?8p0beP>@|3i~H~sSoU?A4S!w4HcB9Vv%#zs_P)+!LE5uh5>iehb7HS zMS4#jA!<(W-q+KF0qY~Ah9|CQ69Mc#&Bu+YM`i0OV#bdZ@rhA;XM=r?h?iD%hOKNj zM3m#)33x#NcJx0Ub6KrDu@R=oQVbKDBiozP10rMY2usuW$YnX3lt3zgK`}nk-z{~; zpI=;*CvsZuf<@6pFC7J5L|_=Bwl`fN0&^c4>Uj9qdNXZ`owR>V+Y~Q$z1f>pwi!fx zZ(Yi@;}dB;jAy$8p1iGzhwM>lDPNSANV!nla13Uuil<)8q!3oWbyw(zr8ms^1%N4rW5fb*;G!qMxlXGHcHDqI<0w zFOg<*Z? zU#i2S^~e1 z`7m4ZP6w?=-;BGY(&sn!*Z(l<=^y$U#U2=VKL7l{n#dV%=ttIP1CX39%Mt%k2f@E$ z*#EFb4Z`an7l_0LE{UEFU~N-5EJ|H^?&EkX{;4S&M)Zcel}nkr=c(`03mnaOY`r2OJg4p?yHoWo6LTCwnHDw!K@* zt4~>L$~#9Nq3BtE1V|Xtd7~V7)cFOXR!J7$1!w*-z;s4`BsiIu(e@|k5a$a)mAfeN zpxZlp7YB7MbbZeo;{q^XK2`*U18x)|Fn&ZsxQ($_SU0eV>EUlK8UKez)Ipl8pWV?M z;y-DuhCtV(WLb?isiT5u76=AA|2rZnOWb5^H&VUDk7VK2;;xx`j;(SM04nI> zI1;hOsdu2|lYpffzN@#CEC{3}S*X{QOkTG_5sW#rAxiW3P)Kh6|q1GJS|xt}6CjiR>r z>piAvB`>S}Bgp4P=pN^~z>YsZRhAe^rWazXy?!)7I!zhX_@SfRuhzexf3b3_aXXQt za%$Ne`8+AQ6!f6}Fn8h7BHQ2!s1K-d>m}P54l}8I;%rn|5I5yAFe;H;pbB)?I{a`m zlhdC#-0~c011KeXj!dU1y}qctmCes^{O6dNnCCd-;zvDGPb} zmo+MLwReY6Dn6E1#k^v)mj^BN8f_>r&yc+!W?SdpoEe=5;ag+B;t@0|H+1#kFiWPw zDmU=R7(iGRn|PfIsQ;Q^oU3iIgY)9p)>5o@F%xdJ5KU7(whZ zg~}@Lxf>>|=$15WVCy#~>SDZfBUB{Nyg68sjbi>{43xDb#>r zl?u2^1sG?^4vd56x`*G$#LK%JaqWO~9~LyOxC0>fqrT`t2VBK^&k>IuZ+nv}c@Pg+ zmWe@k0W8NSRA$Oplgv_CvKK~;p}6#BpjnMrAvE-q7_$IME36|(fS=4-iQ*(nG9e*2 z@R>A?8s@F>n0Asru(ZLqQ(O zW{tRD7Tg#->c%9_4df?v9?E~eNDuOs!Kaf`luaYpk}T1N=BFfgr>`Xb-d{UZ$da*! zwFr)ew1a2XT(}A%u>yRUmNEw(Y%x(RXUh;D1aUd6xOOB%+gV@T8*MCvVV_44-f*f-pD;D?*hNu(iV zAi3KkCsU||8~%<_*c-;hHOT~MwMc%Yfuz3GK|=z18yYdsiXH|9!YXpdte2NI-BA3@ zxVe%xFWOPAZ3!jcvRdEga%ZtBnf7=|%&3u;z~P-t!vGp6acOL22eQvB&r&Y24kdk< zA+?gjC~JGwDD3Qravf}VfrBHObv2n zj-gbeb|VKP=MCut55(K)n3MX}#7pFa!T%FUz$Jobb8VqoDd^&UL_(v?@Wl|~SF>aY zDLJcb2z8X>5TZj|Jbc8RwMIz*m>u&*JB)Xr<{F-%TaCRsUV!KDi+u#2M9vBl$7b6; zloKJD3^{;_XIzUUpvYr+tL?}RqXOBg<69}R$fe=!N|yZn z(hx%pP7$>xmjj#!s;}#Pn0U`MpbO4;Ul5jLhDht=wg8qNQSPvl#J4PtvzOGg_=is% zv;5f-CL9{6K!{UeDQlSRgnF4e?mdedsEO-mO39&(f-grgZ#kC}nMpqRe@kFT(WlBv zp|FI$lf$L>){N-1#pDzI*gxQff8t(T;uvOINJXDnump{hAaWJi`OHoucU}B(arA)h zmCTa1Rt;BR;!vVJq;$=lW)~TRw9n;bsj35|Q>>$|5eObPO9i;^uBWcV^;JFz#5451 zb=$iybsFZ#v^!@i=P02nDekXIFbP3Bt`%y)7$PaWT1;%`kw2(oT(nm%%BkE*HV*bg3CH@0TjI&dY<6o&C(k)sCRQllu!Mc8B`N` zE{v7XDk}>~nvHwt8|p3-`HR5;LZ_Q z#iM6burK8}=hqhByYK8j>W6t!B5~;ZNfZG}e`e1egveQ@bN5ZdexoDU;L=I zw#5JWRkwj7LY>@HZjnYXf|E4=kVGmt<|`AUH{noI1c~Bb;(Pd=gHL~dT2(hR0DcPK zk|hDuw6)@xwE^6>kD4sA^a0B`%gH_d=~xX z6S!#rmBDR`Py40|G%+$r`PTYR3{o9{7qkd2fQ^8g##aElD6Ur?d+I3ox`viPZBQQw z3mg7)ktILW*~%7F9_#c^tp)z$1i|9y7qtiq!KNraA9fPlbKyW7#2%W7J09uxcPi_eOBXu-9O8Ja?{;t!iXG5#w1>K0HAi_F&(p^A6#j5 zgQe%zoR)D>?ggWik8mDqKYw}#JKYF>h&P8})L%hoFF5z-&LW(98Jc8DGWK=uXCLzb zciPADOW-}}vXx>T%a>d}YtD6AE@#_(9jl+&eY*=%E@^HQphP$wZB7y*7j4J6e8)=j z>^x(|LZJgEivW6EW~_W=r2fLGmDl3zU!|k|hL{;f6OUmJK}nbInCpEd=1A&iS`%QS zHBo;zW6jNUDz)o!S}gC-x9%%*griF~8G)S;#M|MGkF{q84c6r}Uh8-qD=j`!ch;(3 zO7tH$6UJo@Ww+;I<-iZq&0IUBkcZWQ;411SKm$BP6ExprcDOUTc`t0%4z*)kSGxUj zrnF{!e7rEYiqY8eNOob7UzL8sf`VCWJ`VpUw?H~^XV%rIntNlG?chIz{Xf<*nhWv8 zTh^5uA#uk#U>@SO#;tt3zl;A*VMj8nww3w!4rAG}nC#v^M7*%mOvY^uQXgy5G4R~i zROMN>aMQ_M22OjMy9vmod#BGvp|6U1{#`C-VZ7pCr-L6p$jy#dx#unuIB1HHAJx)q zN*^7AV@P{)Rk=O3PKrZa>&m2%nMP-AtB{$^|In{tMB=c*Fi zzn3+9LM!rj*%st}=X)X7IhF*E686!qkyGI5%~yr`MJS>y*~i2VQot7YT--&U-wkjeasav=2u}9wG%EQ4v-o%=G-X?*dfR z*yA^(p{3UFikR{Mo2<3&IHd|^0pGL7FOR)^kNKwfM3ra=?wlRpjyl@y?c%BlgCNW ztE-j98N%rsXiSmMqO9-J)sznh)FiEb5doSstbghHANt9wxVr~hsUg>Bu79yAt<56o z1C^F;qR@+I%sQsOmDk`}p^+;rCAN=eR@1<28sct)7eBkh_o5zKH!HLkl@OoAxlgNO z-pcfFYV-rIX*lSo&!sxPfwd?IjIx!I+oSRVpoHipW^qX>TAjP(Xn^O zZ?Ji|p@S^gUADUsD@1til(Ls zv@A?^;)%GMhNkT5`{t#-&Kdz$xt%>HX<*b0bf1h2@fT9)rslDw@x_H>13DV>s>^eg zm@RV{ngzvuPu1h)bjm9cd0WE8s8QU6rk~bs%((?TdY1P6eXuXi z>r1~N?s3)p&Gm=PDpig9McDw^o#)376cMKIZ*|HbjGM@GEzCu-uF zFe{@DQfHJcW3XLAh7dS}(}dzSKW2YSim z-g6?k*=aOzV!}AZfAAF0y6h0&SH25+N?6vuXD@%g7GO&!;8x43!e;8TkTj5b`Z*lp zEua2&*`glBM$D#LX z=sT7JY4(D5I;)!Zx!Jn;+M$|arP_MOH@-E|pX>FeUmodG&6f^+Tq+(<@A`?aMKsbn zy0DE%`rW2h*SxtGkNc^%W-D`_{2B>ft47ToYHqX!1yG(d?Oqe#lb9i{za;46|S{MK$ZyZ+EpS7EKKu!a7iXKQUsy&R+X{HR92hlQl#Q_YK2m zVSA#k+J6zQqBANh^fdFEHL&>&?KKrvH9Bi}KucB>Bz<2EdgE_HMBQ*}!MihW+sJ7W zV$PWOyh>hQ=l-t!`G*loUF8MmFX=vMfEOqdgiK zl?W;Ivlqp4N2-0DWG2%?9=(a5+`D?kM+cRx|C4&@fH=)Yksan3;*Fws!l70%lll7V5+IpEEqHo=+&D4n==! z4ON_8{%S+nb0<~#{2J@d7SpaD$ITeg)!zJ{MtuiEisjQV%4DB=hq<m%-q*UPIS%;=!+rF3IV-?mcJF=IlsW@KTYljuT8*J?eh ztG3mT>}5jEMP5Ve?|-a+=S9$BWPF6?I-ky;N>3R(8|QCp?(Jv|u6<-5)>lSe%IhoK z3!d+Zh_`C^Q|6v0Y!;Wog5EdiZAzADGlA(PLw#WBFSw8N>pH{N_b!;&PZ6s(*%>lV z@t^NS+Lly=9&V)vUWhj+x^7pF4cH}+NbZT7Q?p;(%7^qWL=IoOERC?7d<`xSi6=DE zE|z10P%1T>bmESG9|q9M)%8Uz29|`?)_1icJ-1DtzFxteMFiYlClqIbd|$i`7buZ+i-p~F->DnQ~XV%pssY5Oq=>$uo&^mq#u8wps-XGe^XNmjR zA-VP%pSAterTem~3p<|kMcyCE{-{uu18Mfe;cm=c_afUlcs@R9>610-@^~j_ihJ>l zn7F_ymYyhYS~n!(kXV85l+EZa^mtz;mLqR^+7xZd9yhTyEtuTA)MRAbmzg<8{gi(X zT1Ms4Xnu#|i(^kt`ILRx)-@6A{M^+q)|Z;79k9w`=VLf9P=UH@6I7xAws~FhJx4Va$?}t#~0dJ+jdsBM=WwKVDvTl zwe;=d$6q|lPg*rM4P8Vmjz!a~EG{*y>2K}Ns0UaU* zg?2DoB^Q{>b7JtZv?k;e@sGN$8=s-=iN^6uKDQE)%Lv-ApMt+D;Lq977osR1zSkYB z`B2Q9+w`?BzoMOqKKy#af`RC2FGUjY!C*Xg#<*@haXXjf-jd?FinWZKItP?7lyXWFaI(~gzFn><;7ApAj{K4DdR`!o?+OnBK@Z>4Iw^O< z6Bt!1W%vUAmWfW!zLm_udM=ZDJ)G(ybPRmK^KaTWB8_s8eZ}23(wo$_!T6Koo>Mf3 zGXwEE*QH%*RQyf^1CIRL(A=lG%qj>7a|?dm>+);oW4>WLSSRKUP2x#$MtL5A_?cQQ zNIdXlzKkIOuN*KllwOm5!5!AmdRUFUcvlY83urw4`gR5=f7x`C16`xK-kIB>T#g(AmUxgiFGIB^3hdef&t@%k9qz&F1qPWkzxOQkQ4E-M$1F-R3qd0#2!;=ETXV`q4Y= z$s_doEPK?XTQ7|IX$`)gN2UyG&*;@P-w1O8eh<_3B$hmJ^MQv$3YXMtZ@+ohkLuQ_ zpOo~AwR>{rve%Nw!!mIc1W4vHWN$1Y3Tt?D|D$+4wNQ6|o670n!EifssIV)pMx0pw zB!BElcNt<{>!|5K^D4Vxkb`ZD!4#Uv7UCzlMf$zVD67}22KhbV*U;#xOLiSt*&JTo zw@R`!ej@p)pH)&DYX%{jjWjQH(%qZpa9td9BMTFH!pO9|s6~BIG z_I~ea)>KgI>Zo^ySnZ+7Tx}7Y-za0*z}D54R0f|SJ@mY`S9rXaMQ6Mna8}L)4mt0W_ z6#LZTDxSIX2PTn8{}@DO5V2ZG3iiY8F&kh=1Tj5|U6XE{+^P#e>Y6xHxwC9&ueO}A z&N6%#J2(Y%MbO-TfpoQ7WMliKRJ)GOtWF%>RPB>vf)I^OiaThEjx!BeRHCe$kr3P<&9P#E)Hz*A;ZZTkbaqbd~WD0Av^)snnEnHC6{$@(h(9Oc#?9p z$xoWtaG;A3%0|*7W4~+*;bd533f*zJM;ayZ1;91Lk;p+uliTX&5q{s+=-SqTOCD1vdUdC#%Qr zUSnB9CXRgbfG<3T$oGCygS8%%qFc zdn=_~hRM`np_~w5WY(i8qwGKq8}ohP_AcS-09pf$jRS`An=NO|@3h`s!({dE*2~#6 zElt0QPRy>$W|gvT5$Cut1Vk~B_+T?LHVb^muhsWMSRm|pld3SM{2J!0m@I-PKU)~MFqb*~S3RKoPx4n^!Fn=}hP%6dK@*3Uw zF4Uonhx{=kc*T3qqvNB|BLBG|+rh6?*Zz>Js}rY`3Nf35hibZVJjGxTLWh&hitFf` z43ypwvrU7$`!f~ZpJyJN9P za!Eeg{Q8nJf$&6_4cQ*_g!t2+iD^<~{WlUBc!K1x%{vH%;Vyiv2S zke#nlt#SzUYZo?pZFOvICIK{d@AtSw28mC%8I78?pYg?HjvPf+?<->pYFMNzm)8e5 zUA{|}GvE87B^Ko-7ikW?^%Ts6&)v2g=6AaM+m)IbCXL-L-^mi&+F055w(`yj{#rG& zWS$7C!~KbS-yda{iz83vJ#B7y+%%kJ1^O4VNQz zG4{OWSG09gaDwj3PdIu~>^Wc7EGkCab=K)Cg){b9^i}GO?z?2SDUubpN3?BI_+Za= z5g}i$CROB-6=!SVCr()1+tOC-q{uJ4;6(}C_#J$T+DkL!w?o)IK*tZWlx*WG0*xKK z)XF`!m;`r5RK77BZ>yIU?i@$+c9+;9GLN`RBRV0C(w0fnq;(6pq|}}%K}ro+o>?w$ zkV;&w`$l7Ivm|q&upV}X>{_M<%K&OWycMiDr`qG~tK{_lj5=HZXur zUS?&fqo5{u3`qpq=;}*Rp1Kc5icbL z+d7g++;-?GQt2m6XI17p^BFuR#k*nh?s$Ru zA##^VRjn)A?4h#shx+Wc6V{xj66AM#cB$%&Wg9N%G=Cc7ia%BB-(QYn1$o{)U+eo! zG>18&E1ql~wgxSw7abY&bwYjLwaglu*Sggbrs_$wo>0Ot*4y4aCf#E6buK+4)||R@ zeS^uZ*tArTQJy066EdvZX_IcgjEk zDf*-XCW}o8V7D8MVzW#ihtiL;)kA>>JnlhP;Q{04agf=`@7RqOX8X2p8NEIojgp1C zSy15fmcI(R&|t>gd}nkI_&=_$I;yQE*b{;km*P&b;_mM5UaWk$yGxKF#f!VUyE`p~ z;skehC%C-4_vbq&b9V2Z+x3BH4!_LJS5$@MTa0oJ!_l3zD@Vl9UMKi> zk22cYhM&xCX78p+7_Y$X0!2thpnm>8EECBcZzGq;9zn8*CBJQGg&$h^2CW!n3{&3Y zd6Sqq1&vVNFL*&Kek0fVgb_=t>(H;wlSVAPtTvONB#m3{VEU;FqBlG=1&~a}`yS6k zEg&hDuro5JpyJ3ptAE%WiZO(qSm(F=S;;Q__=RO$Nl;%kVb*^kJ9~#ncy5y!5Za|l zh{qeLpz~sY_%8Cb@75LmKQSpAU1vv3-{-{*+G7UM^VL^V3<{t?B^Dk}l8K zF{E>Z6z-NTE*=>_InB5kGR=&lw@HO*e<7Ps1~4iAOxaQxzbi8=_S0%Pf=J8PP!Tmd zNaG4!>9S?^joZVaO9SAM? zuD}!NeamFkeNV2Wu^emu6hAB{$`$1|_{f$+J^{(MvKd~jT(tLnP8zuOVS2bz2z{*>=uV;O z#fxU)?r)M2J$R7e1&9-OpJloBn%~(|tRUQ4#?Z))gg^9y5VvZ;eS}SStL%z>I8DiZ z*XTOv%98&Ex+*^SMEb`D;Hyc-|2$BMh`*(=S2bV;$y;FcihbKrV$nQSF;+X4AM@!7 zA!tl_?!wm5WvGyS>n|WfTO?gkJHB9>UWF4P)ia7huim4M=+g4^;1kz8xK2*8QQ*`& zV#^+*K`*lT%R$zwk!)%fsH#b9ppyJGV$2(dk#1&qjPSc9Gs%CJ0ohY;C>=qB510Fm z)7h$S>)YE86G|BI<4PD)|4S3q4t3D7Kk-=H%iP!5)7)pBRG&pvHuc|XqRr}J;y#+Q z`AVw*heHIvO3D7n&E4hIosrLTu8;+Cyz>56#4AI>?(BlN>U%+<#em#XtSLy$h{&Oj z$@N`-)c$;q9{;3DxAy=02n7(Rnk+}nV{dasKidgRSP8frNLj?p$yQIOkZUe4*`Uo; z&dD&~WxtX8 z)GdtSIl9$HcR38;uboq^Z)^#9&56fWj!(e4tdXKUJA1)CmY*n`s1)rt zPFb=d)KopBUSJ(l(Hk-*A5#Z0t-}(=C2ala+=}-Y_zgBveF{f)3X^_(m_?%+RHmdd z_QJftI?ptOZK|E#n{MWD^Q%trOwTqUO$ znVxn}+g^N!U)M91pck39)|=l&_`H}1Rd&a%*dkG^zf|uAhkuBByj+_)zq(U(owcg! zG1)cF#R#tX3v8GmrC93})yOK9cZYVd2^rH`n3~QlWpw` zzaklNj{-V7wCz%^&yFf6>XRJDWXX<+(Bs0}2y$K-?idPf`6cvaayMwB`6=Uc>w3o_ zDjbHL6snExY0AI$6?v^XQPUhZ>}`VFespPcE<6n~CphlH5B5;5gMJL6|5uXLsFvC! zx3Z5o%Tki{5R4>B&%ggge@df5^cauX;+nJ)o(bnUKINh@c09-EJl{RK7)1ov5#;_~ z$*N{2|E$rU^?&o|3T=n-2QpH7&R%*_{Wb#)W$>Y#A;8|xjx+iPfmnb^_C@Rrx4e$f zFKP0;hq8(2{C;UecT>Ud8OP*sWY08CNdE1pbdvrQe24w7@rs;5jTpCOE?DfFfMG zw&u+i(vJ|%(IoIb{iMeTsJIZG`QYrjt+&j*}&a4eR z)tQLn+dGYPzMj>K^);!$JQ7(>d%zrr_+!RQ<4@96WSCxTp_M_bcF1@V%dlBGj_=&K|w0)}qw zyH{hu>DkJJr8A`!rMRU=rJAMxN~=n4IHIERp>GP!A(y+3erx6%Zt=tA?6{Y6&c5$x zwFeq1QSlY4F!JYnG6BRYhTR&R&mLZ`{$I>B?y#;Im|6t8D7>6~Chzj`BiF6+qQ>v# zejN1p^7!~UH@Tqs#^(hqun&N+>*&NB?Uea?WiRrk5Qp)B^fzf~>v*}Ub|eM~>c*L;jW z*VTPoKcny(Hhec5YT|7tt|WHcyz1jw>)L+cdEE{dUA=lo%iFj*3cqw%>c0L;Jhj>G zw!2TCw^WMn=sQu$YyZ4b z>g4czQ5sN2E+Fjo?38UR^hN@YBFmo+-!-p3UQwre3cjpDJ8`hZX+I>i`w0@QoRu~1 zH7r#9(d`T2glU_P+?kJ@)umMM%RJORa=k?)jMLrxN$3;{4@5q1Q!GRXK+a7y}bQI+MQlAkaN!bD|1U1~E!0wJp>K!V$#iubl>ia!S?6}p2W z-6jEW9ndf=<0JFrVv*hI!XYH0B^%Wup=%=1Sg-sLPlyi$9b&Qfj0;hLruSiiDDS;9 z@4a81te>bu$RM1_33A=4G&q+LIZuEVfopLOgB?j*<(=JnZqb4Tx_7*V13DWAG2yS* zUm@V(viToTQ{~avdD=ZuQv=Vhf*#U4m*0Z|jY$<=Lpyn{;Zs!n)zPSXi)$5Mi-;6o zajJLf%CCoY=goKQPONuKzzxHFl~y#pwWT;8r8iMd|rakXnzJWXH9=bcC zU=*B9od??9s&}s)zmt@x4;^UmvSQeZ5;kGalv3u-plZhp)PnMET}{j{{b90RO;CnNp#suZJ*! z9rd_ZGjI4$SAUlU0lY#G4iz8%E%!HuxB!7ICzEVIcYWH{#Ay>KzS@NkOw(uHNnN0aNQPf~F3@fjwn7a^nEOw)yil9k|Ptr!0^iC*j9(*5W2w zdxr$~M;3fY-IB^x++k1Tf0wuaVYu3D_NFKVp)YQy=p27^zo&rmAjUv%%gsw*D*E}| z>OIbH#B!0TrQ^Qc2NexRyAEX$2$OBzq*h+euU>*tX21>cFWxR)L?{x~-;6 zw0>}{Ses^wHTzb@cK#4k=#(J@h}xGzHF-Tr^{R+!cPIqcPA7fkokTB4Xv}#d;#;Kn zj$EJeM1M%wZPboPUP^M42Yj95{5ruCUS}xF1~I=F`OON8zUdA=9M5|Q`ms{;u?e%e z{6P*ntfoQtiQF{OP*_#)jdBR86b=x0F#)xmQ#|XQhLQVC#>0HHD?P3{(LG0`6MJR9 zlIL++z{%_9`8Y1BB*~b?r;v*3Y#9Cd5fdrmIUa_6ZI+^ z-ImV&_~!d5=xG|hAHy8!BUU{Gc!=HnRj}40H6La16aHv9zulLahc%@uNB~@(o6z4U z55!O_(bMxKo2_^+?EU4m*%##ZHDK7LGgW@~*=#;j!I{|@K4I_mSFWFBhIFmMbIboc zGrjPi8Cx|O->&s@3_L!tYZzXyj^6D+ss}FsFE^2g9Pz6%py3o9*7zOP>!?<$1{v|K z9hK_=-0cU_ZQorB^AEiAq@F5Av1h@93LU3Ble^6$Q69B3VZ)!!?>v#QggRX&J;<*c67doV#=pW=fIMp}2 zXa?Sm)|ynmyq2uR^ImDTlwrOmj;yu(mek+nOupHzk+wZ2M*4W>_JaAa3Y?2>U4!?( z81sWc$wKN4IZRITVFd*GMa^n;i?RIhyT|=^UoAIys)J?KJMI@d#rdnOKacrcwU< zZOxB91d*xPtr*z(TPK!6!jJc8J#=!au?D&T5}RDt1lOe?gn_A&ulF^=a38mMa*eSpGO~pf2Nx^isW%3N?Z`m-PC;VZrSJcE!uF_@t`29 zbShVQU*+PtgE3W4qR00eImFtyJa`^mOaG;(Wp91232F!1AgrO6JgD}$_*5~qqKI~u zZS_juWqIR1dFwuT&eR{o_wW_OSw%k)+Vx4qjd%dXFDj^3RO*UQc2YJoe$8{VBw3Pm zt0XD;KsrV={uO0a;d4n2-HU{fEu@|;rFTYfnBzw^wE>PYPrCpa-;fT zoeF$GVsW2O`9Ks~9C}s{6~uiJ=)E(RYQ_gbpOVvn0=8tWD+~~jB+ptF4C#`rRmhF{ zA(NU2!clpr0C94S(IKc2`eK?^_+(NeRlvRtD9#t%z6-9p$xVE79-=kv2RKF_z7^{O zI;RMLTX65nfC4AUD+tdypen6~Q~zlrF#Dk}4 z!8xoye6=JZ-U?a&%XdQ5ho9rtB?K_ckrpHlR!NH10a%L3-6z#0PNL=0N)eG z@{`-3W8Ogr1_|Z^6ugsM&~Zc-^@}1M^~-dVJw_~BesI}q z$iDSt!tLLJ;-0aqHD%uz&opHNjMm{Eo$A#|A!yuakIGBs=uE$1x7t#o%X*>QyByR} zF8_dY_x5s>c*D;x>aB|dzGE&_6$Qe+;3D|#=H5 z9fnh)1YvmTF5vt%cAh|obQiGQ6fV45Kcetq997qV-s(HXJM+VeFs!O;i0z`+uHbEC zFhPtNiN zZrSg|g507IBOkDx5V~ou@%mkN9OU!??poZ}6jwy~MJm)A0Dr)=Ivvg>+-uEnmskh! zv^uMtkkr~QZ(bKgSe`atLJDt$);1vH18|tXzGr~5zLyjt7=;1sWw^%b-&FKRy@J&L zA%(m|MF2Ko?AFwSV7{%XJB87p8;6iW2^UIeP=e1@3xYc;Z|g@^EpLMrI2np!1%42V z$p*mbbQFnXQdC^A>+OAlxIkMFbbKTN@TS#GKo%F}LE%QZY9;NTb3sdiO3p0FE@fGAd_e6Px0y7gj84rla&V$|9dnLKc0+4d=zlQ9AlH~Yo zSL9(uR*zMvwa74M`{e^8}=6@++HJ|&n2crR)~ykeXb>Hl!P2L`V4 zgSa*U?qJsJP>{-vZNJB;B#1a^5!O+m6riel|7G723KE(OfDo?_!Bw|8-dznSVQTag z1WnPW{_<-Gltw2DsDti@K8uUV8YPVbMByUYe`UkvLiq+6Edt3Vjfiz%O{thc$2jtf7)G(L81jp3M|b;AL2sfc8J_5{H?q%3_4Y8Q$J=iN@?XutP%d{G1N?y$zV)YpTUpR~ zH>xWngLBt1S*!|vfaGi-5jW z2--noZU4XpHz=ZO5kPjl0h4~d0mrx2 zL-Hm;anbXV7&G~g(3O^*uM#tjt4JtxOafq5$d`w@PmTF+~9$7 zD-SkI>9iN`(F!Uf%NJZ%QviXJ%g&eJ4`B-GZ(azGqA(%kofyCmDvE>X3#Kbps8+OF zUj&G(2%|pcT&VY7dYWK7=B@J=Kao-RHu+&+m95JHf;IwB?>?ZwtIW*;)ggpAPIK;0 zr^%OrL_4gA9y6cgSdX?7FJD2OzvNa-6){kdqF8*2F>=%Qf-Vpk7E{u5d?F1>Xb`SL zcsCQ13(sAI4f;y4CpmQr>O;kRhL!;GGan$m6Czw0q&txh4KsV;7RH5$g0J#$0z`h| zgF+vKh7?J<7aCK3EbxKyXL0KWOdt`<5sGjuqk$_c#SJ zpe{`QB@T92X!Z8f76asyfwF=y>KY(SNL3iN8)aI3y+Rdu2{l^`5dEzx7|KJ$?8@qdcsLKVH3e>q6a@_ARmevDU*Uuk1REl%xk>X52NzV@EBpHCsNDUe zFZcl!lZUI3Feih`f#%a&&^pc>hJ+P|$4nX3Y${Wce0mVTPm=y%IDGX@})Ht@V zm_m69uzdh%5t5+ITc(k(1dy0a= z*>G^8Ws@+_={#r$XY{KALfSN~fEy_*uwzb8?p}a9`h$p}&lJFTL;(!kRyg#Vz#-+T z8o|8&hN>s9=N2n`*hNk!!PPq$y?;~w9M0dt7JrLa18Q`{Z85gUOYSM(zCls601n)O zLfl`46y_ZYGS?G|t-O+21b?p+%&ixVMc7`^6ogl?O7bgKO~PU*47tw1-}~ds8bLu> zo#=NF0CoY5AyA%bENmdVhwzqYnJdUdMHx1b#^duGG8kY!*eT5I$Kc;J#bP4CBwMT+H2r&(yCC5z29TZ3Jj`NkC$954 z1BUZkC0_0d%uzX~E;CGSi!Ihww)PZ!07`yQYi%dmBafK%OVtHTAb{e}-%3FMt1-l1 zjRg?K(s{ztA6j*R&}}=90#j$~fw9G1bs?Q82}+OF?SXs560^>#x&VqmmvK9lX+ST) zfNqsBfUoT&Q0)LfX{6hOeDzqV8>)d2W@rR4*s0a71KL;n3UBRH@>25-@~jn1Y6bmz z?9pDG_sjlgI`Q!XYR%uE*1XU49{Aqk26N>EwdCX;wFs~6Zb(;7Id%Zi<6?m5{v9yz z&nQgbBtPoo!z4O{3$nLo0kWcbfXPi-Lwp491@_mB0-;Mn3|QmzZlbHgJ<5K?UyHCJ z%ozyXT+0|sS>rGl%47)LLLHLlIzcI~J=(JKQ5T!%0+lMBeF#@R>zil3twg8Cx>Gv4 z!b2b&;UW<4ogs$zf2!zL8Nx{*-UkwRf1N4zeyfKyIKH_i$sQx4-cItXpYuZ?-C8pE zZd(Whv{*d}5D9=#Z*l67!=HT%Ky@~SD1$<)yvnD_A$BhS-da)wp@4Jxt)vBGjK{qe z{{E%~71-RSd-^TS1u~%j$x0SXTkU#*NEM4gmhPt7M+Zw?U?~xCsTS3B8K?@!j#s5( z4qJ6)sg8%naam6-;N||3c>Te2isoe_%Ug5m(AQD_r5h3&r94T@BhgAjrraBZWSI5n zc~dZ#WXpEFz87Q!s7Up;K8NKqWxKv;xy7Ho^ji#Uh!5OsyZ=!pc|muf_mG-nH0E+) z_(1krIefd=L)14V*X^`^yXg7lb=!kDFWhH~Sf2aDJ*SX!OJOsn1RSmU5&BDQJZMVr z&FfK7?)%EenN!*Py|j&2PN36xlhc`_>O*GL(L>kP%E$2L1DOA$4-9|OH-Nu6vWWo} zfdpMYNOBhh7RObRSAB)x+})^NKXAUjkpz7dA)nwM38#1quDqO&4VZ9T*Pkf(8+h#2 zAqG_pTY(u~YyNE7Jbp`h>^6w*^LYFg--q_Nn*K=Td#HHg{_5~&GwI3;;XOC|@uvVz zkk$6(8T3Cn{;0Yt=0`u|_etf~EMMCl;uE1)hu@n#uQ~C3DA=1?__Xgv4yyjLM#)Rb z?R+kj+>M=DIlpTHDu~oDDs^ee)W7A(g5$f$)$M%Af^{B{4oYOfp=AL>U+cCJZc3w{ zO1loXg4Y=~(^qT4ZGZUtv}G<8HNLed2yZ$QPi;u5`)LVpW^aD^bYFfz#;yKOC+p?D z^3!Xdnj-JP><`Ndoq&5|h2FHJOYOIPgY8FSAKN;Gw#?fWnPYw*g?3$Tk6{sR;T*dV zJvm;Yr{DH1;B39>u8vu^HOUv&w2<0%!`YL(H;Hw(A8?Q<0QVtJ866!$oz^1i;?J7K z7k7^dy&`wm%k&!XKgZuSJRMhnwhY#kp0cXM<}p+>Rg7Y~*;nVFJ|eOs-7k-VYjyWl zwcY;tAN{$(<0*dkWOA2%{vRnB?*Y1Z5Yl$DkBxu~;LFQHvDd>nzq9jYKd#@)^KH@hNsGJ;bzsK8-QM)D`{v%3sU_5{ zy@6c|ui$!o>rU#qo@lU1GA6cUWNs)15+8?ZiJ=--M%P&MMd_M+S5^jteBp>sQ`ywr zT_RUi)f_!Ojy%bJq^Zc7=aU+KiQC(9wMoa>Unxrxr$X0^cX^dGQnG(BhcdFo?zMS= zZZajm>0~)N-tY7}o#;7**?o;H;Rw+!BFfxwivE)$fScRJAvqvHkcpUE#=1x^mGkepF*sHffnrdLYHbSK4Cc9mMno5qq4-b-L#3M#}gnaAV{5^+%fYr zQ%YQkKa-4H9Ksp8OpJ@rAg(O2GZfeys>LY?x}kTcGI8vfn+tbBxS8k{SfS@$50tS| zq+6%@FSI0y7fhj{V39VIV$){$oyiRrmQ~k|8`&{v2zON0oo(xAoY}Epw4h+c@Y5`g zlwkUtc!GEaqxK;mZ|MvhNlhxg`i)-i4AcHU@$5D!!#Uw)ur|}|lyhJlHAlz~!rNTg zbwcfH>Go5B1+Xh-s{4 zeCnuu%!M=Dw0in4(;qU|I&n&V3N9ye$<0`=gf+<2Z21~TUMMf_mV4%N7|Gmw%4FCE zmX5!b;k18;Eh)JB+oW;$S{Qa*O1i_#a5LrH`_qzHWxQx4I&)#umTP)eq^6xM2Kfu& z)z5fb{P3Ikj#RkzRIppWFp8`;cWTuk%7vcsFZ9$gJQQ@Z zY7XH`*_9U9O~79C@8e(t8k0&DoqtjUHQ^!bMp>i`J`)@6>>{rD!+O09f93xeeJu(i zb3!I@^={=_v~54Oy|(VvPZ#}FhxgAB$YlS^*)=C7A|cAUJ!Rz+uZW|N$<5jlfjNn6 zDfpLO2}MsB;<-%C<9Q*OiraX)sE#6DbzEe3uRAg*OBWFIhToS)?v6AYI#M##(F z#@eR;s+n9EOjasVx08|+2-8r^%_jgOl<*KED(a>>nk5x;2%|jB4--g-W0GL<>|WH= zXh`B8T2WS8!?Qn!!q71<3KgIX_Q*D>?gAZ`9b9`x@(bb?ZE0ai*)H(bW~1`09I%~V z$*E#>&J)P+hnVY@57B=)$L)?7t}}~KOSHsVEmBOQ09y2z$9Zk%Q;HX;CIZcdjri6W zg6&Q`+6>O}SW`-(th;?~TN=46F~@vuSR>NJRDA#~9P4-2{vC$j{;sW1kug+8$y7-6 zEe8`4py1wB{z~O32zi$-Y>vp>S3^sL6L%hVuvG^yX6AShD=FbSiE~O6w+FC%w$R-W zgB1D4qJz0KGA2=Gbt}hC_YLdeuKN-@a9W~#bT#$GQpYS}RL~`FRCk_aOlmC5j0nDx z6tLS;JEIA7G?dGCC^V5#YL_yGB&>rah{wBr?EaVT##g(IXMl!rjL~+3_SK5%(g&p_ zeD4x*%;SgzDM!nZ=y(}MsQVJRM!Mq)+wdZ52cC-q*CPa zeFeYqM~v>;?0({M!=vS6jZV&*CZifEImFjibo9+!mA+)@VEij#(J>iEP|rq4~Gcl}6U5tYA@>Iyf~=$Qka!gn#V_M^C! zsb8^d+5U5z9v>tDdCK&G(>YAoaFgJRGe6jRast8b<>Yh-RE^ga#!R?HU9sU$8zU7b zcp|WjdL*JE^WBXp`_)EC-%-~!xXVLH{|J7gbW}t|60IPgHvH1$MlUajtB@xyzZZE3 zKK+*ccWT*3Tl#7I`+eo)@^XtT+ell|*Dvd;uhj$J*@?%qI3aRV<6LVvG_(5=cJl|_ zLec_pDfoL#5$5;EgMYC)9r%yD*>Di8W1h6wdEQR+#PxW^#p1bBIl08M?$n9m+cBm4 z*zASTQ-R3=i@E6Do~DHjax9V!sR6bYo%{OnapLcxPc?@_pEYRDod?`IRW|v)TP$F# zFYhLlyC~b<_5KDa-KPwo%yqcd5bo@*2^}-gwteBQvw5B#={fcZbshSzl;IFRG_`H8 z^VD8rX0U^om!g zreYBpKp9jCOgC~3Y)lYTQU>!`#lAebrc1ri4<5*8su5!FPn-2vt+Al7&w>*zn`+B^ zrF~2@Y5c_P>LkM~7--bd-!O;icZJH@QDXe?(0i=IZRSwegl$pCsK%rSDztreY7wyK z(ozSpI7O6;tn&#)4YJw;i3F7jCx7l&j07co_C~j67X6#3tt~3Yz=!Ba!OQj^TAJk+ zjyRE$#lBFKMyb+xS~uGdtzK6`9_|M8Z|zTi%=qNlKT9BT+x;-e0J7Z4$v43SYge7z z70X=LH?9mKc~#@ZsQhxCwKu#+D|nm))Zbp@kbo7H{{6F*cQA|+ zJJ3)6o3yNXrLyvaa5H5kzM{oY!ExGFIEVP{K%+yZT;}t#(&WTYq(+knPx#N7I-a^@ zzG!RouI>{azZW|+YyoR;*GOcP)ry3NSk#8r;-09;Z zOi1+Wa8L)^OY+O_1z?hz0N3yc$kt5RN}zKtQIO?-u|^TUa|Og{zu~(1bjVAo8`)G> zDS&>3>IzbgDdj&&Gmu^*IcK$SeNDXf2h|`fdkM^8i#I1lZtfflYZ=VRCg2Beffk;H z_6t;s&fAGlC`V_RMi?<{W~y}-B=g%;8~%w<2FEPqA=BJ_0*mHq8SbRZj+qg1Fzr_z zh@Eqgg*l+}?duu0vW&i}6V)_At`Z>=mg`aA?|0rC1UBAu4~$RsR$^+IH24HX0I6zO ziL7z5o|ggdU_P?5Ia5b!58lX|26@*|IQRRvDfQ6s#*Tu$6bY`P0_EgP9v}B``%X*4 zL7CnootxNQ@z0NpNF)cp?Xe2YZT0z+6@65>jzD}mjuXq@S8o7b>R!#Vvp?Y)0L**I zs~Y=%I}B`D;yPj#Mx&=F%~=pwsM-CIP47JY>FkEk5W4@Gjc-91*yD2aiH`90Y?6Kv?=FPN!xp8eaB1o!c+r@8 zqjHIXOR|S#u^jSS#>R2u=Lz|ky7CzH-Wd-kF&XW&IUeV<;doZy4#x0+3#JG{oIOqSu1W8yTpKKW#$3G)6l}-qx$dZBaB+g;<8KFUIZCBf51|05F=DVekoAs;PMHF>fKSsUuRBeoCt&H4Huz&D&Ko`0L z_;>MvEk*XROHQA`#)*j&SkP*>Ca6 zxSCnkw@XB=+j~L04te6|4(_9UhlRw2C4beSWjR9eWncyKZ7l;18u3n<3*gj=Hkc*8 zd(4lO)ae+aT3}J-V+@Kf=65z4NU%L5;kWCyPwzQe0x~3(vCg#=Q;w|Ch`G_LY{6~` z40P7Z1>K(!AQusMw^i6hmC z{aV_uOnPJa!0&?ke;D^p9kFmyN)1%Jl%w2`{s;h99mJKLyf8WN33jJcrMqO;!tb?S z!1@M%o z>tVTftUc24#)ef13r*J|1`CCnbo23qa7q)VR?%;>)Q<1JP=?eR9RcnG!*h|;+rL)V z6D+u~HPy&Uz-iVXHGD_>npX6_8`7d5XW8_#XK1+a3FTQLzm*>ySgUR~F;T^y9!#aj zfZHZltJ#VwT^T0dTnTln6bi(~j*xaUesK#X6}EV?W@>Ngk?+*yk!+X%Q^~)`=Eb`@78G`z{Swc$+M6xfpe`! zKSBzv*KJnUm<5MLg=+|_v|DX+VIbofFnb$Ep22%j+$C3)=frE6KG>JR^KJt`4qIGP>04 zNHBO%=^YFz5-KW}j=y&w4Cs z-;c)O9<+lT51rB4D2*Rh6`^@vV|pNUEK%oCes_TD_6})cB-Dz=+oUU@X^~FIy$S8L zHK+)MR4Er2N9b%dtEv7iYDp`LFg-vjMV)nno3WqxM=G&Ri^;vbR%kS<19pCt|xAb8=Df<^CQI>o2}49KeT;l+O`S zNhA#8E>`R=vyn1s<&YTL>@%ebi_1M>rZr9&uC2v62T>IO%?ZyX+Wqfuq6A8g_MD(q z@6BPe+?MGgw6T%`x6c{hTA>F_>Z(%$a5((ZKUtwvNBQau2QZcI%Y#4PQxRov8X}rg zO#>!u1&T*<(b*T%-e6u9X>Gd|_Hcy71&Ea>SnXiE6o&W-n(U=puYd9TFpiI^(y^HP z43jgEbocJJ8XBkz{X8&Ji0Ze_@&5_VH4Gu5*Ir`L`7+@uEgpzxhf5HSCT{MMLXS}3 zP-tuu_hNu#u)GCh-b{+x9ZFK{gC!c!V%a29a!^GUr8whuS3ys>-5fo-X^Z-~6qRpd zLibDK1fH#s=HZFhPtN4F6B9T-4F(B0Mj;@<21)VB?Tw;RCgiVCow+2%W$F)99q`vj z!sNG61HFk~oQ}1X@Ts2?BiY;U1)_oqwa~({DW3uVbskIYu+E2yBeIQi%b>J}=+A|f zPCqxu*rbv;B(n`_D+k7KVLw#SgmP0>1(g_*B1I!_Q0D)4637E;gyivj|8=QdN1u^^ zk36%IofEewbzq+4nRnd${U;A2M5V%cjIXn&Zme{&b^oWpbuOaalnUPq4bGLHdz|Ia zJaYQyVkSv^v_*5SGU1gSKQI)gDaSZE$UWASsYX@&s>qS{?reWTl?!Xeu&`+(*#^?l zC!CYMW&L~A+vp}#`1kMUADhz=5}wsE<^Xyvm1Oj$eC@WV-q)r|iAf+HJ)V3SjUQf91WRCUJGY_(oeS^Nny{@hsR&hM>Rm1^-qF@&x;%P}RN(v^N=m814E* zSdSaZ77G)Nm1N8Gc!sAfu6|1q2>1UiRHpO^s#*ORDPTPAsm1u|tBh~MT%jd{hXLej zh-=|hZ0Q5%`t|Q8fT$Gl*E6{wFBYI7E8)yB|GVU-8`A0zC zMv(2y1Q)-C-LItf1?!atj^(k^>-NWBS3<1Ny?>2lJ3Pv~2L{a(PR;WqIr}~H;>ff8 z-r8W=33$LQQ$+_L<;RZ{`lVkMJ$$T1vkS-8sLZKpiqbW;OYD>YQ+!$UbogiqyY6kg zL(&OA#bL4@!lwh{r=FW*3sj(lV_Zi2g z#&;dDamfsWMruqLj)WJLv9uK}7yc5+<_b3vU;bi%{8Z3#zEk!2mtx(0k8M)-ab`XK zr+*@xf*$=%_nhZi{LSRDY24YZNGmt=dOXjLa~)4QO-PpNMcU*kWH+HYiUioKuZ!k7 z<@%j0XeLyD{}B91hh|mkjUx%Hv^*X`Itq~7mo^F;@R7y*?;i2jy9Jy-hZ426v_9v>%g$;|5($7m-EryM^s7OJy6CfoW$v*b$u)=sK@wt-Cpe|1 zf&`i13@SxPsZ`HSHewh6dmayPF@)C=XB1I%z3Ca%=N##My)ncxcTH}TszS%+s z{jg~siqSE9?i7aO9z7CzEbr3Q{P8UAf02I|YiP(FgcDH{B0J;l7<1JyS{ukQRg!>) zH%ebV7ruR`SxkaCmslr0lgBa3)!ALG=-gbPGIcB;)hQq|ngc{v87_O2D7*u#T)Pvp zRMB`&>lIHElv{S0h1Saf&-a*&v9EjVyqjuo7U8!rQc108Iz{K#*x-|PX>rAsVB4!D zEKe;CKilM-RH8#>^Oy|nuT9#s_Q>k`$3CJYsC;=`tGN;=TzLn-XT~qY^Jc&Q_p^nZ zL+@z^s79g0qkzCIIT;3#*Vd;?Nb+;9&1#q8)?YgYSzl^vs>fz74~&ZsjMBPZJUt>E z{~IU}0~exWlk4Bv_)4evPLv%>UL*vhhei9AzcieQBjp|nV+2m;kBu5e#jyHmn_~ zMpr64evTfZT#W5qy>u%5ug_Q?URKp!^7%-lm})d1Q^aiTBBg zPRBCoo7kswALPHjEz}f|=@^4Yz_;?0G$u}~Xa{!R8Fq!zpmg1G&p7H!u@SjVZ2PGs#9IxA zm2LRr4T{Cn&vy1j*7m7wE?oG#GH}s9S|fcU8vfhoKX{oQN}2WcX$r&PFkWLhxZ z#N9^GH`6*VDfrdBlA?RIfkPP{+JS8ZA}l4OlS$7kEuyGtC%ATo`;HxA4|f}<^53Uf zj)GP=LK=@eECK1x{G_LasK=Q%%ouI*2i6RUDBr9*W}-Rb&EfYXV49BJOZ{30!czy( zfE*!SdCsy3uG!`yya{P1Zm$Q#=7i{tz0mH|cPyFxV|RN;@(Di7M^KCxi@=c88_O5! z@XD;?LgE$sA{)8q{9hzCzoOLk7aE~;`tgWKrOFa?v&u;; zW=O`If5&f1*3VSISYhpmq4}&QKn>4Ab*isUwW+9P!?Y2>q}ZmMhx z-!T7*>i^?%`*-FQOR@+VH5SU4$dTZrEj>>KQ84}+e27|+uIU-GZP#ITL1S;>zLwLB zjxwmCBqk$7x!K-Td*9D5c{OY~;8ui>ZH?}05w1!h>eUsBL)~OEh zGC;&g!&V}N1K-1kl;!H?wTX6TkjmrR?1^1f7znT9y}UPjloN$8cWe%zAZ~#bda2(S z?s7y$FqIv<@D09an(UjZ&4`6F=?^+VQMeLeWF{YXk@rtj+Zc>;nF+YmHj6iz3s0u1 z%zAt+)%qdze^ZXTQ)uMtDo5ic?R_nq!r@XgB7FKL8Y{fgfvptG6_C!{w5ARh zhK%Y0;jtO>l<3^?^}FG?)4Vs?{@cLY&c0D<^qV`EnY6`yl~u?AJsnY_*IJHU%5Chp zyojg5atpcc)zqS*N>Z+!L%{90gA66n=6|0Hn-^E}8sENe5ke+#>u_6cvi)Y^5N_1i zu25*TsGa0#tZ#fXRyTKs+Nf1V^KIw#C7N-5XA2S1_+6WS7}hGI^5jZ$mf~8gUSE{h zuk!)YOA)z`-u+@&4oK|z@yCjV`n-Oe0(w@$895S>$a5sJt|fTTHQKKfxRbP!NQ=#e;3bewh{^^=WTQVW1cqOH+-L_rXSYpW4^wJH{gpISX+`N)#!-3z@0jfUtCsV zUgs{KhF*@-p$;9>Th}q9n>0fg@=ZNzWtuZr?(2|t--Z2c?3{zm6`{sE=X5n}ABloXg(gGr4Gf2pR8@;D#8XY|kfl!PZC#}D8A_Iqro#k$65=ZrzQ{dK^|L*p?m)%~o45c^0qZua@<`BLB4 zUNH}Kh@wN6u@Q0)L$#>IFIfTxHFLWO^ZK_rzce~4Q@e>Qhe8lc25r=8KCbVH$Txh7 ztA7XFLPM}@)nH=0^X~A9d2`a{!rKq50m0X%*9t8^_2@#?ZTJ-b)Tq%eOq*$x)e7#Q z&MsQM7Eb2R<&s%@o2*%vc{t*`vCS(p?v_fTzbawusK}EsF;Zr^<0G+gK`9ZdEVjH3 zY4}qXouloFEnUhosmAp|@jxq3d;@5RVk-@Fjd<8gOwoeK@q$qOL*^(~JG24E)G|zz zxAWo>M#-YG3O<~#!T=1m>%_5)6&uemR)Wej8J>J-lN~NXZTgp}Ljgi_j6n#D)k?l3 zA|=l!dF>>l2>JvqdB|q*Q~0>sh4tJg+eH1$q3I{DjgnJtmZ4FLTK%tmh2~+1%KCiK#h`2A3ziKOdb98etN*{Gtd<3 zOGfO4UD>oHTie}}O?}ZZ5V{zSk(^vEZ##C(ayj2eY@V{i!EMDRHLUaW3D}FQwE6|L z5vQwBl8E{spH{gXJnsjls|FPv33I=$2whbY>*iCu<;4UB4y>&*Dd>{BTxt)uM-_(xPu ziU*DEvMv?*BSJ;@B+n$6GbZa2B;A*O+0|!mjTxp})s((nO{SvKNxiA?q&dhvt4SK= z!`ZVs8kWB-pAvE;U*_Myb;q&`3Cu6)-GYm%BDi&>h6(d;ra~WPvqN{LPJ+9+C;2@}hqkbm#F zAuJ_M6X!2Thbh)k;&7zCH^UFN^Lb>uM{q2|qGhUHm>}6&1Y<#1q_#7rR)bkY zFOGQFoGP(sk^64N)#8O8vO?lUvIzFE67inVC^4P{LhUOgEsCJ!01a)N5>j@IR5ig5 z%U3-lAY#+r$wXA6-bkn(3b_n@C%t%mx&G$6apSGB>-ltVdX8uEFjd;x^GpL1rZ)&_ z-mm8im<~1X>wt8$9}M5`ih0YAsaSZyAhr6mIRrs?w(6P?PgF=$HYNH2QS$vDbX|jr zZg7G;Xp34Y&;fbI4{|5@p~JMPSK~D6YgDGjQq9lJ5132EeFCiw_yL-zL&3U1Bg=v6 zNNH}Kw#bl!2Ml4h(27=P0-hZ(2U#X+KFR1-L6VZ4Pg?FiHaS_rtVi0=XoF=SALh_Z z73>N(1oO!mpCDdGKN##GSqwG;8-h~X%BrU3)a9zGT-8)psUrw`z(!PFRX|gz5jCLt zl{#Be&Z!d8&Z&$#f!HciszZZFTT*3&i)t$8;~%Anr@5*D%1uforpI6#jt%_Ft3}`y)#93OMQn|KXOMC${wgT7i8Sg=ddmfsj?_c#k9&iDRpz#EJJtMx zxTh8nTLSJ%n(isptJG!7rJOZ|IZi)t% zM@>C|5OMz8ic(+C97nNg=klpDcq6KxI`yvQc+vD$z=xD(7U4PO=)C`2j*DyRlpgbD zKR2iJ)*=rz>cd`8f?T%pZ&?o}XrP5WDE8E!2$}7NJxJdhenZ9jcq&OH{2Rc$nb!QL7K6l}~6EH6jhQ%5^H!Fm8d%XmG1HLv8D6 zQApS#vjho9)MZ_h1?Zfx&l(Y@G+fl7einzOq(Z1xl#ldifpe|lO>gnbMP0W~`QqFz zVJi>1x)~7X+PM&`$_TG=SnXK8Rnn4A|5RHY!tIpT@^p@e!HjMdGx>5JXHMw>OOo28 zK?_~o&vh&_7uxM^>e}S=P2B@!U6u^^3&C4zj&h!7y5u0~YLcmTYrIb zEyR=`hG~|YMm%qQWLdFrsjs<@@fMqWCi8dO@{~k@MJiA zhP;^>{y2;w*t3FN>ZxrW0Bs=aQ`=e zU81hzG#FW%!s<0io*giXTz~dFqIiWHELXI9V7>;NJ(`bV0Fvz zbe`+5Rp+~vmAtBonl}}mwS!(z>n=fx7Hb!%;g%8PKcQ$2xdDG!XcuYB#Y1?@sPWee zO+ucV&>E{sXIVar>@V}|YDQ}`ZCDKysX+3jy^I=5trJ>`m^sKV^ZKRAT>9A#bvSij zj)&}VJvqBE3So^6l9pC1sJU$waV|8N0#&5Q0*aA-ijXp_u@%ie$K57*Lx`Sw zMbu*Y^{CdXaxAh$WJ`99Uz4i6I!;3=Dq|2=w1f_ddaOlkWuu|4d&4|!&zB4QdS!p? ziCiZG_<@ymr`$uNimw z+NjlaqYhkT)0Mh5u9Tu4OOj{Knz(HRnbp3lAOG`e z^Hz0DsK%(z=4;etQQEp|w0Y-IXal9N!rLgk;*5%#Rz@H9o!n;= z)fTdT45zQ_fwI7F0+F#Z&IXcppm&S)YnTZEax5qPc9w%6IZ($e~D zm3g3T6_B2(`_s1gDoR|*s@3>W51zLI?RJFo&-nQpbqJL|{>wJRO6y4t z^}1iJuH3X1V8l^fVoopdYnPYTk)NAmvY}@g; zygmGKndfCucATqayyZ2nNRG9GGFQN8T4r_9V}>hRexqh?KSMh^@d_A==V z;h#F&Od=%g$Cb6jzRflj;wC?JaYb9#B`#h1r3ie2MZ2qH8Cx9>hub}UyD+hkIT%jY zt38}0CEg`h?eM3nDwnm3hx(j0ABiIp{>B8V@gSSVrghaJ5)+iObfP^K3zrFl9AUGn z;hTlpINKySTiYnsl(nFN8nIzETo(KFWo8iL*OXwd1%=dxO@Y=q&u_2J2=Wg+oa($d zYHy(bUKUnpg#BFIj#O6gy!hJQF%=^fOR9ab%Fd>!qKkY(ezwDk+}vXE)*{aZ>FsKG ztSZ;FB^;L`P&?5uTcYlJt9dTy9M`Lz!|Jl-tmNRt`Eqiw*+LaOobgqMBG+y?5XS^VmcNH|%B2%9`I zsLh55sf%rCTPESY@X}hJuK$3NT_*+W9qC`(GlMGZCo@dFb%|%fKCkxD_?gwz3dF_g z=rQgevBppMvw-o-h;TH*G;fL0Fh5EwFcT;`|QvkXA49h-+wB*EBP8W>Sx|rk{Ip1vysrILk{e z>sq{&sTTm#SyobH#1d!OvGF-ZOzQ)kx3xrblO-kn+~iWvi7Mgxlkcq7P}(=u*zHSi zXUj0P$+X{`neaA6)djUFDlgUMW}7mjcE(M&aY_%~Y`04e zNh)7rS)69mTbATEt5=xNX%-HYV}g{4|;98 z@syi4j_#xk96P4|dQ;EY(eigGd8fqwH1lpgi~r_NAD9 zW%gRAEn#t5wBs%qZ+o(Bhu6j8A{>w8(v~j$SX_2d5zjg7ipybE8_R9wZ5oQU>c!M% zf$iB&*Y7OMtmekG0v1-z;_T!0r)hY^sV0E}DK;hTpqf%qgT=PC!+G2O z^E!)sqrj;PCUyJSW>mx;+ad$Hs6%b=H|J94KV3weGk!@?c3#pNh5CGlI%?iuTI3!&X@|7txFqj->-3xyLiEqq|UTd7O*i zH|ULa@MW1X)jn=}+a$=UJCSeeZs(t|fxJuF&bd-+ zRm@Tcw}vBL?@m7KU^bC;LQhvRAE~Z!1cn!|3b9qDo=vo-I*ex77}K)Mp7{4MWd!dP zo-f4F5y)HS=5=)ri8ECl9@kw<-DdO~8OJ&1b{P+2)-zYJbTSfg5;|=b=FQ{DM_n5? zN`{r3Et%KzV#Ckb$QO|`$DyZ0HDGadtM2F037zh(bgE+V@od3bc2wpc`%aZd#s$pXsmhsF_TaVm*9adZ1Zph^xxo|%(KDp}SmJoaWpl^oJCk53XL zD}2yXO3X9=tK={^JhUL31V1Fl&@y3tKyTGciW^MUxui|W>7dRC+PCSqui6$zl^wLg z$12(6vr@qVx=NmeEr?rzTS3qE4)FgY_>wnwq4d-rTpB_xJt$J*OseP=Tbu_NRrp0EqI+{5;XJd!%W**#Ay0csQVOj+-_V|kr3tx#Oi?uIdK`IkcWkS$X$ zQR=`B-Sbs-u`;&fa!0UxRpJS+3oQIS=c}*{Thz}~^jsFLg-X)lc9AM(=^(6?#LPWw zg7j()ok_h-$!R{chL`5LbUJR(X%9z3iI>sUUOSncY&qI#sgd?R1?RGZxo9PA8a(In zQls>TZR@o4cIlTdYb7P2FYoAdZGw1C<3>faW#Y>8LQ1e%$`mUpxM+bEFr{aEp~LJU zZ3Z&{EkdfD;ZuHbzFmK3=Vbh~2P@AZ_DY0PFInzRgmjw%8?bepSKo;CY{fR3(0DK+)972l{vm#GCz$K4O-MjbdIVYEH&xwdmInU$7jmLX!#W1P`` z+Qzsw?fP|mlgn(^V0^03yQMoD@qy9rE>+@z55t- z^qxEA2y}iWZMZ*hc?G2|`_#es8*WUgOFVffST_sI4tJ$JczwG=sla_v*Su)lK*1Vw z`&)%_JTIQ#&6~(Jy>{tiU7nEbJl2C2vD>L*+gv-PrET!kW0C@u<#;K2bT*vlW326_ zDEEtNIDB?2*aI&+_v6-ugPlU=7;t-kwD0DKbAPH+AF=OTsAwTw(i2qta&xc=W2Hr} zblBS`ne8D=%MrAo9y>^EX^{br*U!5MH_n?<$Y{m+37W>T;IoKJfQK@ zXlNoXgwMJ^@u~r8pCfNoaMa5zx_3GZa+rJCXmqmCylpx=BaX?{#c^IAv!m5oC+7*P zx6OMj+JB&N_qN?h6MjaWdUafZ(R0JHNFE$}l60MS1NJJjEFZnBXX)W!F1pYsL$ceSmFAEz$oA*^eUqyohf?#M<)%-NZ7b*F1%Ptxpk?YKK1!0 zuGOQXMOI!qt+T|9p)@yPz!Xs{Hkjz`X9snkjoB~e{_6O`ZoW51x!~8UuVoZURqy`Q z^x4Y#Xp(0x5iZNG;@Ybmq9ny`hFwQ9fp0Hw4)$^c{<YqZ(HM;jcws$%Q+=%Z%=R|#R@LHJUcwtte#0; zg+cM9C;FU|IRX>C%5c_ilI4#ow%_9r@1!zU!fcJX6b1^&oe#IaT$~KJ#J{Pr!BcqL z(S;!;Uf=;G{(6$rJ66yz^ip%$B#}mGKR0CSci}^-Mt^Ltk!dEQQx0<;dEYl1E#(qj zTcgs1`6YaEDbG*V{H8Xsi~4=#7-Q$U88fV@?Sia|JEs*cQ`P|HG?TQK-0qx;w_u`k zwVGSW3aY4Xf$w-FIY+F4o0cmlknoSK6xylsIO=n4Cz+jHS-Zu$8U49td$=z;xV%zg z;zzGo3GD$p?-D+5mSKnFIB%ygE1Gi5#O%#dXW0Di&tz*XiMC-_g;t)! z*%!W@I#{L@v3x?0l!m>n^FaFwPd$=4b}@Tlc~dSbL*lLxw@c|{QiaOh6ScCJU&Dy5 zGj+bA+Eey+KXowP2e-B3^Zp@=>mTcr(G440Sse(r606_LEWLkyDd$7@wYI8@Bg}lU zif-b}$5#Jhe!Wi3C%cj#+nwOXEn>=zJHBh2YuAKw$%Wp@i#h1)S^J6~Tl;vSYfz|0 zHGU&%58Cr^71t*ElznC-{1)e1OxzwDb&L+_*b$Ch`cC$s{O~QTm&VlKGPF@*2YJ=S zaa`j`Rd&A?+geYZx-X95jO#4gq`w>+tnh01Q?LJZZ*{fWw6r>P_v3HBtTLOG-4!u@ z+&n=u1aCIKI4b|7J=;3GZNEU!KeXf%=l%;DvT-xd#i69jQ)bnuqSV|I(Iz=7$4)I{TMf~hNNity9501?UhR7v z&zySg@`>UUPqTO1c#&3mmBrGmo96FRn4Pm=+k-2qUAQhfT>f!^QJKdxb)) z<-@=Hwi1&caYg3;&jZm&tCe;{$H8^o6Sdce`0XW+r%U3_fd>=a((aPDRh7J7C3Wgs z;XC@}ZrnVuQO;xl#oD-3ysB*LiWaQnbCIQN``FVVKK8U5fBW!nH)FdwUB6y{mO1he zm(fyk5UtE9##Bq+LtoH$>(PyWa>ex_#2moCyxNc0{pt#oa}Xt5j@aGmO5o}aXp)u4K70 zRa!@#8^1qD-_OV&Y3sCuNIn9@_czDALR4fGVi_TP$4oE|mwSmzSCB@w#EX&}{}R0& zw)zL3kBF~z$e}zH_x5pLS6N95gwNoje%ZKNeFB$8bO>}RCD>3OKOmQ?#me@?*=v_U zKIW`(=eD#@LYuF?3E#LZUis$QEm3-4rmODL)H5S|9D*b zt7Wz{dv5}Bs`K6{|60piqvAF0M&%Jb*23ae+BWLfU$zZ)q}%d}?wXOj)rRmwrTOYx z@c9qJ259bN;z#X`6$)lTDs#Q(LM%LEA?6ctxeK zuGOh`(7hybO^F$LEBSD8+@1pa1Iht|1;;$iM_K4j+hJusWo4Fb!Z#y#ZW?vxb%Eo+ zoKOyq*aXI1``)gw`aGjm@L-9rtmGysnORC&cH5js?pwoUBA0{tDf*&O?w9AyH*4lu zZq+efFY~`qV>qvuN2QVQyMM(swW4ecbsgQsQxL%Qd?r(tyF{;qd0bSv~Dhci+mB zKsjtL?2mr1w|xOSYT+0G9aaxO?cPov>CNLxtdhDaX{J#nGvS!kmy$0~+u8DB)tm;nvJ9l=alm& z`sH)-B5Bom#@HCN)G=%0=ITMCbZsB^-&fisR-sL~D zoAW3)*m2&Q>{?nyTvvF$K43b$&(el^^>x5;wFx@f4C!0_niSj02w$Nc=+Bq><|a!gQ}>K3x%5jKVkw!qoIFa0#=Xd! zL9U2QLq-u51F6n1kW|5?yq(YZq6rR({*+U)l4NS%r(cxTIK(F`*SwgM!P+EDJ`Lt` zP6gj>G|n`0sYUcWwUK%OQy`ZO@-Z_{Uyi1BWtF|gC3pLq%QB3*>|cC2ys|g2Kk{bs z8})PZ-)M{7nvs>UQ*T_pLFEp!lgm~|x^uU>T15|7o65!_>(B;5PocmZN+f z*qL$jxVhKB+;P}`jg-0B-JVydp7b@7ASN(f@?8I*yY2Tgog8j&84107eIco&!BK=m z${1CbGHdLPq3sE1SsFR^1%RgCNSMp+Qn@2yX$2QKEoM|n1>Z0>Uxf=_w_{vujSzR_ zc-CrHI6E)W1rmc~%FXzj#@}U7#iQ4YcCJVJaqj3Sr$aowtniy#AfzsIy$<`JHw~+r zwQt&7vAc`+DBPqHhn7DK6CNcYzP=!Qucqmlki_024!W?p+`jf4j6QX4FCVHBw~EVO z>SQ^Tx3&Da`ogkpBf4`&#I@eTb&?F<(!Y znLsp&@TIKk0wa~?tT$_f(@eIzxa_aohqq(~&M4!g5{VPG9LUID$$s`urKscL3=Q{y zy#vm?S9q`a<8qZ|Mwck1vl}4lbha-ZAz2|UW4o>)Z||5;vWRfhcXu>m_2FNU<9$#3 z*E~!eZ8wabf%;dp87q>ta@e*7RSl=0C zzG-)fbuj%9teXF?y{`d|tGe$!_wLu#TDoX2Hc`lmE)Aq|V_dDQ)d!e|9R#sblsL9z z?8Yiy?Os_sthDlK1$Kg7_UEGCoL&7Foh|!P5XYo|GBF#E6_*!rti({-Q9D~=l}fA|Lc6+J(nY``W`RB?Fep94`o1m&`mIunyuV55F{D0cZ~60nb=g`PH>uM8zuFc@5PI$0f6Le8u+Q(s z=Pb3<=#{y}r!iN@bNN|OD>sE!V$YXef7H{I%dMmI7a`r>=xx56lo7g#y(io*al6G$ ziQ6k~pSb->-E@am(ym&M%ESiWo6aYy6ms~@4=#Nx%?2?It*$3Evsn( zM-Pj3VzESB`W9PGfGk1OdC)@s0_6rZa_x&CB{g=5rRWM-~ zRv-aoh9?$d(4=Dr6UvzlGqU_F6yGU7%;-2AGagEqMm&yE%o>kNvKK+5Q$9jqaVh8Z zGu2{di{;=biPUVt?A49b`bK#o{DHAZ77vhGTTtpepXsj|AMdYkgJ{5OzO_8AG%*GBm zIpARhQQr{J_hM+j)gFi>0&p#h=-O*gtk172sL=T4NWkf1?ff;XkhGUS0n}%yfW%ml zh$#g_yjy5y+$qmnkwCk%-Ey|Kuz8g;2rztQs~IxduTkyS7?!opsq8VXQIV*L49<2T z$NU=9TAr8h<3J;Bqosx&kF0Zco3^u;biYzvX+)6CMVPb)J5a0RI(vzj8%EOJxX>`( zM#heYlwr5qK*`DSvqqspSAUyZjleak^%})bFlsnipb;xS1v0^nsGu$UPz;60Hk)jn zBZ2IIQfPhHvMjr;4HUK81IXx9=0FqfxYFR7a2!qj4}6#9~6& zDPJH;B!FdGAP^!X5U?UDfIPMd5wXF_Cy*lId;wBP$uvR0c6*HqYR)?4mzpC@xDTML zZBtIf30Tt3hatxn8p;L*EEPg+Xp9XEIxS#(*r}WXTIA~CR-*L))C#iL>EvRE$guJ& zHuVqykf)RE5mA+I#z=DP}9STA6m?(}YP)moveJ>PF1W=!i;w>g9 zWZJRHS!blR1(;cMqIAM7;IU0+pyumS8vo_gH_B<}&(26%AN+|P| z(CZyx#xLY zmY6O2D=}MW%&LD4=^~`QAmr_=csGlSWH2M<4Z(!K)mjbH+VV*lF?bgYdG)^f%~FO? z@+igH+v|8)k?*5U<(MeNQRjd&3sVgvc`QQqA8|%uF}_Enkh>xh0^I6zb%fX~hSx#ly$ROpW#jlcULLNrZTQMalWm!RIT6>o)O20=_Cb(uz9}zEmC0e(?UdY?#nd#~Y!^)tPh9cl2HlB6>(n#s_hlS$b%iy%7lJ{aU0SCxTT&>`nQ> z)Sqxe;kH8eSKF`ZB+A1(Gt z-YBc8hDbGUv{@^V7*q|s9ER<7yn{3q6eyua4H0!uSv&{fm;ALgFmKfs$3r(d3f)7R z8>2)Xamx2oGs_+t77^`y1-1rc9-_@LNyJf(7QA`1#6tH>=dH3 z%QT53PCLh7w)7hh3gk(FbwET)+zO@6sb0%oKr(u0Vn{kJGpt4Y5^Q9Y-MKR&bRTLK zX4&jlouLT3=nEK-$lan|LKWY~sOf#(L&O0ZhMLl`9spr4e6t?VH){=avwSql4)_9W zM^q3!6sAdcMyOtuC-j%*ea_HApxVst4}({!`kcsd<&3oB1>dYxUZ@Ap2^koV?}3u?__T7rqvvKn(hy}tSskI+ zd+&+muI`Zryk|3Rl*qG}$mwCL_cMXE*l4aH5#nMqqt)7QTHMBlGRo9-6ZL7q zc)E@{JS9kJn@v$|6IlDGICD-dYqS1Xr5!YlYvKi+X$~08uq7=>+E-w9VzbZSAR63j z;)FH?lJyIyX&G!j=+AoM5!#{Z94GXqg;Bj>wQ}m!F8raXuN`FF)yJZ21qI=NlWU2< zuAo--0HA<^W=k&!6?Sq!gQ|=frzt~>5YiA~(d?r~VV|joxIu}QIjNre0d2BeBn>x{ z`hXrGM-v*2STcdLrRP9FYC^2~unt&F?D}6pW>K}u4NfJgd&x(%nm#UqeN>BlOvfD; z2A!0AmGycOl3a%YA2@{Rm>0rbP}HOP3MUCHeq5OLgx0|%ry=OUhlo~t2(w+(KV%7V z-_$64lR2%0;J0+`f1qzqH6<{ytUeQ$EfEc3(VVJ$cJrUyr>Ky|H{uU8hvAtkk?xDr~|*c*oAINfm@T z;YZE`5@3wL`O(|9je5dAx8!#aBixKAe_NSFcR09~GQX!Ryr5 zlsSj#IH(si=y2gLND7+QtLBb{mG$-N>iVm6wyItD@tpsy>T_~had=dXs{f#ZyxGfZ zYb`EW)8wyp1?eM%HJt*%=7H&s4eF(&_Yh-MeOjw?&cr6sA&OAo1t zFC~j!GG2U9{ng89w)7qL4)ZR59ec19Y)gF9d42c%`y3M(UECG4m*-r&+Q9(7ykBY? z6K36@R?A}5|3c?ne&Ax;&wCA?b9vjFmo~e3>3a}cSDr7~I_p14TNkV7;%hRSmmU#m z)%Sg@di%|dD)=wBpifG*QeSpLi|&9W;KQWWfE@gNo3aNbzEAb2PL)*MALrdv!2s2l z6$L|d!f?!6Fs@-BL1&B7_7d6+eJ5U51n)qp#7YCP&EKkBII!TOUZ;3jhLtDDUbXrk z1+V`3{}Z(8e-I45NBX@>$0XYC(m+MniY7WyI&0`O(`lh&)4769jE+O+N;+%ltfO-k zolhvfoMWR=uI)TDQ*tLa?sPM=#a!vo#_eu#GB-1mD@@HSL@vf{EtQJ7vDuQlAu&0V zDHQX$u?>k`Zjos>cWvzCXG7xF*?eiX=-xc#&X$Vl{D#E#*|B^s^Xu-R;lkbS)XihP zz3EgY)syVs)a`cm^*hF}*)lRUnVw4TceA$^vaV4+@&5{Pp8|4M?R1N|bUydhbP2F- zFBB)!rIK4TjCFyqvkkvt{PuB(ALPp489L7~xGfas7$2#ljGKq&fEkW5wsHx9&G>CG z!)7G>OXWwL@+mVMXTGCBWY`X00X5PlQ*5$-|!?hA%vl?TjlAP{c1 zS^hAcCs_Vb`hG-kqsTad3~}7&@Y}#~%O_E?`Z9gjA}PQU2N}AJ#XR~5z^gIg1^T$M z>20R7g-(_Z8}1F$A%fSj=n1ya6Ho)B!~68jGvy)rP7vX31j?PzM}7Kf_WV|ydTl|zzlQN<()$IJLowL5Am-&O~)|9 zO=dXEgczI}@vH%-SZyzzJcA`>yq3N)<4ETk8&z3H-vdNuJyY4JvS8Uy=Vqp|wN#hILJI3dq4oqd?zIL(~nwmZ$3wZLyj zcysn}UWG^md2{w~Xx!|KN~-OQS~{2Pn)!<)-hj-v23Ulv6MOu-*a&MEhwvuhh4PQM`I3>$~^RkRMs-qsYIFFfwI?15@66e!g6TBo#x&oE+Oyahg z&KAA4XbPlL0%<$f=(qbz*p)MSaDPTt_U28&dS0f@<#|jsFe%_(CFc=q$S`010SHay z3b89NwL8q{z5eFRUd`uxvjBmIFoaxLnM93Zayo>b&*Z$>Y*O{8FiA9O%iioL_n`=R zf>lk(&a~`aPLtx(7FSQLW`)USYa4#H)yBjUGRF?lcTn(*H*rb!_4)^7=NU~k zqjnV4ab_(O>rwLFjK?WS0j{XUWhaL#u_WJNA~7KN41|RZaWbKN7+=A9&RRpP=O{su}jE5X0iWFeTg& z2@bLewrOhL9{4~;$7{0VwqD4z^ew7yVd3^s+3OvG;QCu!FoS3}cn5Qc8s`Lu4T8`) z%@?no8_K5a&|>ENvYsctER|i0S$`CBL7Duwwo!}PKu)ubJc5RlUj|*H$SIyWze#C> z*i#M5m*}JFl`m58HA_$jd$5RzRrzd-FIVNWB3NAJdQ{w+km&`{gkyU5u5wHhO)H(( zr*E6}ZHr{_blp&4-&h*?}#;0BT<3xZj(BZ7vvyN-sp+n?tf+>Ih0SsfVG zw|#oAavnZO-Dk1E2e`SVJr!2S#|U&CHj6Mt_OZ0FxF{v{0|VaPHKIi*5ceO67@(Z% zuy07bLA^jW$h{@K0x}qvYP`V^_e(}C*{+Askjl6rf1LS8nZ%VRe06;TQpZ7Ado6RX zMq16+A`k8SP+xOQxsjN+;pR??Vc$*rEUI;Bq^Snpn z&fFU9qpZ$FegEu&H+IOG2=iU$>(aiTHwKoCtH%q;g3w`O%7BU&@YYYUg>R6C0cqWyR=ZWQ!^=)hgw@oNqp>)qCA0EmT{0_AYRN=DVB4~hAsY|y zS=uK(+Bt4p2$ttGOLfnH!GLBdvWZ5W@mVU#mfwq1|49eV`Tg7(omD>sWXYzIB}}ZG zlWvQ(O2>~&E9m>|JfW_(C3n~^>Dv)w>ASN>r}#ZJBOKXItelqKs&d-5S!Z=Cj_F6C zp1L9t7Ig-3MKf%zHQoS5Zy3c1d;OqZT6|6Ld{KIei#qC}1YQ$vzvjns*A19~F|tip zc~@icuC)AZ-w+%TSZ_+3Ib>)~1h^;%e0rTOodZgLThb-P2O{9A8Am z8(iX_TjFn70Nt`A_PACp=9RV69|?)x)=Ya_bn|shyw`m>^hZitqEhfJSx2Y3ybk5y z9%rj`Lf!{~gbGRdQ@Xr=dq-FJP90FKjg6>o)1xlKzhOkHGj;|HZATt(mNsUX*F>;lTO-# z)`Yn(91bgv3v3a-5cN-t+zH#a=O;w3YPv18ZK81;?P2nu+oijU+CBoP?e-NP(Fm|F zZ=;`ea5-OcX5~33Rw-ce8cbd%P79cc1u%I81OeS2)XGvu_Xaf?ejV_~g9o_wU%Su7 zFjCu41SInVI

    |t=HT-A@Znwb23)aJ$U(;5LqvBdr2Yk&6>zJOQ2r|`nA!lo)H7N zSMUCnWpj|OX~pAyju$0|t8;kk{cimg|Na1TK#afVg5g??;aUl_>Oia5y^=(2&`}$} zvxu}Jr0qtCys}MsIsln939I=iw>Xd6W~?H+BDLMR_--lMu8X!y%7jjt(6oIlXkq#k z=)jQK;v5OizJR5ykR|gCy3d6=IGqS~7;zgJ?O+F=9qizk9>Hk1LuLo?S}eU8o;W>Q zB#Xylae6CfSkMi1a5#?$aElQ`sLiBjf`v-(VVG@knB5`6>JAwscW{tQ?@-=lQZ53XZ z#J>SGMFfhVRLx85Zi#6Z|Ab{IE<-AH4fkb+&8zM#rl-GHn7Zv?#+~M3((pvFaPN$P ze5T|J8NQ4ARfdXj-6{#^hK*mmZ8!msQom}b>$gs)GZStiU)bM0<(3lTgDttmeRSrQq6{n`1zIc?lP3O#}95Cc4ta6OIE^e?(FR9?&Q_oC%1kb z>g??4?9v{cp6W_%>P~J-GN(i*^{=bHH=9Xk`aApFuD+hW{!KldoBI1ZyL!hu-E?;* z+n4GZ9~(6XTCi{C*UESTth)`d;vn!oW_htIC z=}lw3Ksq(nGwx+H#Njk&$4@v*LKva72v znNIZ~;HJmMdx2knD%;cFlN?JYlbg`E@ysT+G21&fhIr5=<7U%JwSe(;-YNBILtQfr ze)(+MSr{+fn=ZPE+Y7T(Sy@z6s?SiHZY@k7D(3c2loB9w_YGa0$=<|=m)oe+mkjj< zKSO#dn^++l%w8&{v+iWNc=t@AF#Zt$l}Z_^b7aO%eBLeXaHk71xl*BcD3P0*DY@w^ z0U+Uy!v6hkaWPq`q@gyj)U8D~U2<11sM7`tlj+=)CW>Frf;#Lh6?0Sj>t&Q$XQ)=@ zxjlCLSP!^MD;@aK(CV3#y31^g07ops04v-wgYQ$Rv-HiM$Vt{L!%>35_L6=q9I z8cDW(Ody|045y3x-34elcSfnN7;4wYgSP?X&%1!Sb$Z&J$_^JKxD@t~p|*W&TrY$6 z3$^^tVy@&Cm%+Q+P~+Q+?l_`nXDD97xk-0tDLpwoQp#*dASy$B$)xj%5>gVG^i*OD z$}~9!z7}R@zYn9!we+G4gudu z(F8ZKeF;WQh6)ar+)1Ti_}9uF*=G!OZQUO0#%$b?zE}GoV)vk^TU6?k(lbb3(y}$5 zFWfr>s^q5guCdinn<>m&^SSiQqW&%HiY%33$)ojfAzg5h-beKss*9jL0?K6oHW_N; zD*E&x+N0EMhT5`9nbj*?UU*5(^~Qt98Fyv|%q^D4WiVL8B%>*qC>546Iyat}a?u-P z!MH9%-7w+{+vjG-AuM347I?R~^KLiqmI_m1hbG<9L?H_sLOt^S3{D_0`{fW_(1=@yXIGSe6XwXgRef^e)6-k-#uQ7Z2QY6pZ@-z-TCP) zFBUdO{&?u+yN#P(`)}LNeB-CTn*Edcy}$n})tTS@_MVwr)RL=JEx%s=abUs!xAZ5} zs@KIO`INfr)c-W$8du|LT#c)7HLm~9EHK#gyL&cEjDJcB;GJ@)6dZYEXSieGy@vzj!iK|f{b zH6S(bk|#>*r+6*A_+0VPVU`+J`fSe`dA@Jq5O2Aj41SxB`7e8A!R3&?A$d9%KHV4- zf(Gh0)h{7_@ieokB`1m~saYR`uyx51&H4l)o`iVs!ue;ntNMEkm*ZDbp8@wq8PE zoZO5ugQ|WCpFZ?|krFE(na=8SJ=6n;GvplA{Zisqc`)>lv{0Wiu2zX7u9^!sh%bqe zdg2$NHKs`Ff2dzyhKrUOj{7I2?A<)^_cB^9z8&hrI8d*Ow5*hs8dE_iKh?7eMs+s2Y8{5en6{SR23+H3iiOgqkb*-dQUl_fdRU0d=>bi8}BDHjL~ zMO=XZ1Avlww)Ve2)7>+JnZba>8%a5F>YRikftjA3o}Pa17ytY7JofHbmPcvw^5EOi zvxEQr>VN!yFTyn7|MB=gFZ?`b^GUoCf8%$FKWDGv^ybeAD_%Uszr@o|t;b)?`Coi^ z{cZZngV$ajjK3G-jE)xzmV_)D9f#=!E99RC+N=0_zMRkfY-N2dANPuxUwC}X+$&Pg z_d>t$Cw|UG)+kTi!@S5C|MoVwzh3y6Ujc+MFUZ)m$s(S<@_hW918g@@a^tZ(mJ|X? z4r9!``>2>jiRYX1s1ge8GZfy5dN{UlJA+d}BRx zz`V#{{>jSASy8}8cwAe~`%TLkov5*|aWGilB1;!6D^??Gy0HmMv05g3VnqJU{OQ4~jgRnC^{PU@E{b$~cg2D<<5cJKwcck@ zQLu!snUf0OR)Neo<#C!?=74pd0J?3LOcbJ{2edI0Ly#(wkt^(yDkj86Fy^l?UG_PKz;4qpVX);;s$Y4GZ?erC#L zmn$_P;md9c#Wf=5y~NEXfUL(Iuo1Q^iyxmbs@OZX7`r_SoIYvaqZmw_y(@NYSD^^zsrP1d$gJs5w^3VxA|y!Yxe z9x6W!`CxQ%tTn&exaQ+9RKp!^cvwC7xWd=?*RwQ)1IP~x2Pg-E;Q+;~)h(rF0Q?h+ zunz!#imx_~_*PqJu?~N$$;?^shM4;+B&Ovgh(V?Zy=dxX?6+kkt~zmpXlz$7Vso(R zGC_Xo#}V-TK2WMVD!1STN|VpwfjKIng2f#1&GYlImfqtFcYeI&FwfFuY@KSp z>Km4@j8kl=IIgZldH4i@tHS1e*N~$`z4&Dzm9%+ zo8J8D9a_SK=lybi`m6T~zrud?&QH%S#^>Yz@D9H{^1glSU0ja6iw|$#dPkL)ILBrD zHNGvZi01s`nrFxS=JrGW^qrptGe6@{JpapI)(-!c3v;pg#OX$9sQ@;lLKwd+CC$M+sGqKXi-|4|@XWnD*d&sBuWS^*2n_L& z&M2o>?b7D6oWv2oNbr+-{K(TDI`V!N3KiF{P@Uw zznsKT@ULt&PH$QAa`Lyo`F{!i^4D+w`MW=}XaDri2cFFr4FE~*mLLMV@p3MX2J9t2 zUe`Zg{SYNl5&1E{+zOwg;$^||;*-D$|FK{<#9?w4EV*2`dO7vuoc*u>&^dRPU!#Eh za?JPRhYvZ&{rTz3-2dS{XUX^cHsGIY;8b_H1o8ah`s`}#onMSEJx=}JA)U!1dEAb~ zAv%(0<495bWAEqVw;#@~y~BUu3-|5rEsEC46JO-*-XvDG4gAROa(K4?{g77O9V@o1O6jS{a-8o&!Z=g z-o4}h3PbOwpB{bxXg=rv%JWB~N7L!_zn!anTEE;bm>|42!h=u_-H*bZC?Dj!Z#Z1l z12{A)6y*(zjlVn_4jHxJZ2=cIz*QeCS=0kKG%5t|85S3C)enb^H6Yewl2qY^XlOA`r>8z?5Ws? zA3kuw*$?MY^27U&r!RjXb>Z~&%aiZ_6ZYyqh5j%P?|-=Vr)-@0N$v|Izx1B{@aFt& zIqVOdzj00H{FMLn{4YP8zWz5g4%aQB+_p06tx5Z1ftkM7BM9W_}eLec~=-Cgj-`+JTVvSdYdR6$c)T&x6Zvd{zKU|Z; zCFj~`L!K#oQSwFamaV*Lmd?Qu2ZwbU-AL0=QgD*YZKgo@Z@?M1a4&$g)?%Hu*1gTu z;`eR_h1OkZ7MHeAE-4gV%zUo0k1o!}-t*D3UEj6HkUQSAXzSH|42FcGTVBpjC*_pD z|4Z!J7ca*M8CKCj%9X)_g?+E!K>*#xZCnBD`1BGfLAqGsLS8x~ffjxgDf>ma7z`&O zMyci*sN9Vm`iuAOcESdQPTx^ki3N-+;Xj% zSPWOF(Q_E4_eq@kAzcWzrfG%&%=0iA&DA2nxi4SORUp8+haeQd4(DLt4nRTX#pD&@ z8P7k8A`;^-o=&RXp{84x`9aKD&?LPe$Wr{_rcC3}Et2UMx|z6-@BG9EpPIx!{z!Oh zxT}NQ_N8;a<5e$w0u)_ftI=F!0=tbF8)XhyiCXD@y3N1%8AWAcpH{VXkN)Dhv_-!!P)PWn5S0(rq-g;RGQ7Pz1-h z20@PCq>f8E7e*`v8vo4oW1#AzDpm6zGsY!-PBj?E7A1G-Ehi)Uz_f@E;m7E0dUGvT zr-DRI`1(d~iAv9aNFVp`{}0F@dguZQl_1fUR6E!)-!N=%S)A`aMRkbS6%kao)u=Ux z>eDyys_tBss5`PQt+e4H2M&sptF1j1*&~DC z(xh(GY{(?8Nsljdb0|Mrn{MmD(ToM`>f&1Wx@`d*q?9^*-XVHlGV) zFkrG#4MmjT49&j`cI=BONlZ(^DBxTm_wHwm#FTn8R1QYBEoyjdKF(Nz0jDb7Q3K7p zkK)*|JuvZPIh|rCV>3z9yHvZxd@i5kTWWk7mk$O3{NRbjs6BH`AA+S8TycpC9mYK# z$ZHYd!&S4Qhgjc=-`aC>zNH*kK1U`D$e+LFPs^azp11$5!RvVnKO`~uA^hHOm-!T& za2e{1D9B0=ew8ITXGAg68eSO!PKiCqzlHGd+mdB4@6@HKsIant#*)TKgWXNo%)g8H z>!!WYe%BI0Nd4iDWGJm*5YQfv7bISw&EqmT%d#~=0PYJ<-z&~AR)C0%)p&U!bA`bq zLtb@yvQaLt;SF&3QwV|ftqTu9^JYG090Bf6*#6p6kJ!RzG~(0)DjC3H!M6>2yG5i+ zq*6iaCBkX|az@oF>~XC7Vj~Gt`N+FoPIAVNR8qM@A^9MT^1#nRhkK)`+?fLG0W+b8 zoV0>Vl8a*fc4J-+r&M!HB}GHB%o>5k1tQ0ry+3%z8{i4p@-=Y}@JFUJF*~D<#r%8D zFqR8fv_dpzaEX^3R0u1Z+$$f~o;H4oq*|Q`l9;Si(5*3Q*Y4 z?dCa*AuT0`VJ2@JI^mOkrwCzyu=6rM$Q7&-wa^436` zvjSn${jM9?_|!M75F|jqwb%lFhJ?gm&edr{!JxOy5*AjL+lugEB+lMVfWYY>-1r{F zgYZMXO2JkIde{9d;;Ke#1Pg!cAR%`RGT8X~?l=`*F50N|Wu&9Y*@4tTkY?ap^3-7V zXTzi1(pm>3=V!&*;7SyL&uMi(`AHa)oQupBK%M+QzQdNPM<~I2BABsxH8Zw7TKSZu za8R11IpKtE7>PN)ECNf2W8yB+5_H5ti}-2gLJYGgXz~^RV+&ippRAOkP=^tatLAA)SAPM*M-TJ8Yad0PtU!u? z<44;w18j!yGC7IUys6Rt@{WtAkaj7O9ziY@gbBhJjAY1RgCAT3wi2aF7Jm4@BUE;e z$OTKmYcw_0J8pjY^>Jga3HLTFzOiGn2ICmxFV;b09lRQs2N|umT%sxX>UWYj*v!S;{U)vg&d?_q#*(IP;h8U4S(MbQC(G;)!uMx;@io{VZGT}Ymf zjc{rA9^Y#?SyaTJ9p#}yAtWI|SSiU$A(tSbrje{erXtEW+RXCOadqL$kQ2k%8CnI-ug`HGq8i3GF(ArVz)RGN@hxqg<`0(ETYLbl z3>=DTB)}SmDo;#ch5T2Fsc1U_sA?T4PwHTk+r&=EAYdxx5z=L`SQccu0Z^`3p2l|? z5sBx7Gq3i<6FDDuq7!fmlS4fU9X8}GotB!F9vTPbUz(m2Fq3ws{}n8 zxt4cHtJhdE@k~EKxVVbGTWeu7F&SmUf?VP3Rj0S^`HwgaI`Pl_4<4 z;!?G`czR_CNy=?_@z@)ZOj{*jVXpG==C9| z>_iwH3V~)|mZ0i*5}R3QYs2Ocnq7VfvATsY*$k=gOV=VSVX3XSW!r{r2-LDDnhMpT zloUVLy9kut(K0s09LR@QJc^cat2FN_^AtKBBbBPhr()z3DnqGpUaCny`B8LzdWLnLQW@r zlIx9z1Z6tdU_{b-{2@|tHqB|3Osna(AiB#quq54DZEW$C4YLC|ShAcm3OjX#iI`W0 zerK2Cbx$(4Dp|-{I3tLS#j+O4C*gE}n8TrQNXrw7lBq0VVqni%rmL0RpCibR^Rxw$ zjJn2y@@Xy}M|qE2mW3Q(3x}}P*aIBEx&JwuFXy6b4sh-;x`~RitPf|T85Cls7_y%m z6T&`;S3}~iDA*LvH5%I*8DDeZy7OIMB-^Sw(A!?K)%aJ{YdSEfvh0p^>i8nvX z>{H>o?Ve+~E6Nr4+Y{9iNo|i}xrWi1U?I_H3-sD>*a0~$HIj-TqOf53kscH%+eeaF zHD1n}MTPE_U=e}s>DBQaG<1CZ_VP8M0tArUi=$h9=^S63{B(SE$T9fXiwc<%9L*PL zo=4chN(YH@&i!SPLW~ZWAXZ0cL4EQq7+e(8k;t?PdZZfQ_wCLY9D=PKG0`NV;~`ty zqU_4QS6#}qI2v=vOk|%^;BVma$dN(PCS` z@J1`iwX-0>Y>Mm_6|dI8ra(JMlRGG{gGNhXca(VdLw{jsUnZ-D-SVWXx-o_(_ z_O5HPqBk%(}e&^6Z5FD}Pt-&+)PPX!9F5Uxg~ zXaiC;s80x8qst{$o`#LLW~)4kae(-+><)pIeQBLg#Ey<5aZv@2z4K!z{5Qq?czjGZ z^Ko?Ea4xGXdz@ugQ7NTOwO(`lL*Ur5@A<`tgwKMMOpOVkQ0xNwmB_iosEtKJ8 zhgw3&PY{Q2v4E#lRcLcm&2XH;v%o{eg+h!EEiyR62yMCo({?*P=PKH@lNXR$Uw`w0 z;1G>+&#ta6uc}>gzj*-^hNo9P$+y?l9sHXY6F;~$p1fjp-Lw6o$fC&-PM3K0br#*s zilYz66$3tJ^-V4eI9Jkafv0D$Km6DT>>o46k`~iD+eOtF0E;nG=;kthQc-FHdSGs6SYyEEaR9}B}Tr-^H(o`@?X7hk)p0<#$H&Qy`2g z+2&H%A!-8Z6Lso>bUwkr+#j1ZQ6me z++(=8_YAgHymaL0f@4mZd)_21W*iUdghe9sJfcGZf9mku+BpD8%7;pNx}Zhl`}aPd zDY*4M`Zru@Ncr^Q2lwL_{Mpny@k0j1vnr1cYNNnkjuj?a7;+%m5?wV?4G5!r0fn+l zybf-V7#pI-H0Jn}Y}$1(m@h+h5KGq9U>z{jpp}iNUCe>YHrH@#M|2Vz?y&5-Mi4HMhWjQSBfj8 z*ztQ6Ht-jIZ}9zUxciD$C-BlfP8z`smcy11SM1BXgqKW)Eg`3LLB5BV27uWW zzgP?NPV>&!T|Yx)o{zD-#=sy+uPCKCQ!{rLrKN575Qx6tc| zKjkgDZ)i?#j%4MvM$XxgAoW0GF&4!j%Ymu!#t@A*>hc@fp$DsImarLd2^IyMVOWTG zmV$F~p<>keBLH>F%(BCRX5tfi9|(=%hyMKy+@;;C6@1=(FQ>k~Wicz#WOSMeAnc+s zEt@4b420)D^$&oz+nHGLRDHalW@7}w;xOAVWPm0a5HBh9kqocjX*rKtg1VyCe|f94 zJ2MnZbPu#zKwel8t0GLbCW>(FrK$CA9UvQRXwdh=2Zrc)D0>@j=*vBT>BpMbysspq zCZSSx53J$r+f5y*#kY_-F1yBWcMQE0aow(3i2@=^@NOt^4`R!ExXaroiL@ysxo<2w zqRM}Nq|#)Odm)(lCsdusDU!@JLe?@diga%y{Mv}PHqxbnUr`qc$_Be$%=$#c zn_&-Qp`@}kVZ}Z4?$xe&ETyU9XF=5<8)^t~PN0TawjdF{;M9$zFBJ`55uB5>LFz$U{ zRLFSyeX00)AK<=pg>mou(kaHz4w8FNJJJ=nz38^aRt&G_G9fk$z7Z!BR%x5i24LIO zTF?XV92BZ4{?l9sb}`3y$#B&>?sI!5RiHd<%SBZL?9lskH2fx21f(Hm&{!OwB40*@ zFM^3wR5Yjxyr5B%g{8C#tqhV__8H#FLwN^#n3WLaRE?dcVWDa&EToUbV#t z^a?IYK+EsWL|`rbfRT-89urYTlfHeGcMf$a>d}Yl)oE z$ui5(tP?&U(9sWbVYy)$EDUR?M*4M`01r-i6KXrU&+KG9Y0ngVCn zbaw?-i>9nco+^{zB5c)$vKj=mVt3jju1{m;Ji2S6EPoJ3@QV52WfHF(p8d+htvi2v z{6qKz8v@^FAbDlN@yw~ZIy{lMi0SF%Y>jfhZ>+x$yKHvVeLR~lp!s5386)waZtSYW5j16p0g8!&zl~{Z6HbFMQ^j*8Z-F4QHM~x>$+FU zlH!7Eie5%^f!?oUDT)`zD+CV|0zM9ODsio@4G_fg3dzx?{eY+!R0l3$sArz7njRQriH zn5x-!!&SfSjaFrpK8Fwp0z}pC0%og|#$} zJ%$t`ZRc>G?$Rj49Sy6E?wVFM&`(DJv{j>bY|o5z!nK{&W+I2YzFfER7(@~B#bzca%|*LYt`P~EekIa-?d3*?Py(|L!*3~fN*i+J4Dwv6^(uoecsECdb_2daHN#1JQv;s~oytrdz# zc-p+9PS&Po*ah5PrD>~6rL4+K(yQ5PL_=RKnuoYd8d4AEJe_PU&HDD#oJS|m=)xcH z#hOzpSdcV5b0h;RB9QAiK&@xsIJ;TGFqg~Xa(d+_H>}n-@C`*4*c^gDeTr6^7hU_H2=F zmv8iq8Z;_HaZ5kbpjIHLEZ16nqzo263`;Gs5qul$|CC`2M@C&$J2`u-1 z<#K`fX?atsNV;K>KX@si@IC@DPj~QdlN!!}m0eB;AciXf5!YBJUXXt~4Jg=ztekBw z8gs^nL^W|5fLnPZNUglf>m)T7D(gtliMCCe@DUI-Qm#RmPre<(d)<^cbCwl`#C_DC zP-#@uJjzImvX?@QU0^q2xRNRAwzAB@h;SM8?b3#zYMNu4^8X;>{|4#*4x!@oy4ys@`6DM{VIY$(8Ty!#y=;S6D z@_Iw*uoTqFDnfMgl_Tz%BQ~}6zKK4wux%InHKtxmSEIW4Q@MXR--HB3lkf0ELqfo;;&upy0K$*Ts4aTd+T zX$uiv9D+4}S%6W(lcyEjQ_A}%La!C~( z3>)kMTU493tulWZ>T=&LlTmlC(==wjgO`8Z!7cA#Yh|nSOzl-7{6?ONM_fJaV?T7k<%#VX9n{P__@}fxnT*XzgRrcxf`~` z5Or9^j$;bT^A^G?_*>%gn)mI&=ZvP*h2O^hXYg zcbai%pxtx(`b%p#ooac|rq;q~H3e>fGlO+2TNI)D3#->*&+Zh*oCNsH)TAV* z0O>fr=i8xbDJK@nL~UYz2ShhX3Uxp&UcNFx?s&zWmn@#-27YDAb4~R%F}q8}r|@aD zLW1U4MsuiU<^%_^!FDX9Roi#fFNM~$$&HW|_!&JoJ$wD($Acs9;QZpvqChGM#9lCK=EJuLWX2~e_XiM zsDb79LCR{E;ygx(iauwu*fyuC?br$;u+(M6+6=cE)tal5*rdT#0Nf{(0Q=8_8NUoh z_GQxru}Tf`=F8l^bxJi`av72NU25H?%w=ib_Gnz=fb3-NLsCSoRS5^=Wn(}9&YVp^ zO1WxWC|xGhW--LlhzwaNE}0Y~Oki(z54trjKhbgnYj6UrS=mWZ0qdnmy7m%Qq*+I9 zT-W0+8U6)-vU6M?f48SPH8zGBl9Q{Emr3;7lEo{J3visSr?PNKD}`oT_7Kv)o8cdy zHDSk7lJT*?I?LI8y37Jcnf(D;M9>s)h}1M7=3tUuh@f=9iPpRZPGwSEJ3e%oNHdQ)rvQZV<0NO&fEPO| z7qHiZqMF8OZ!zsQoVE^~4aBCMcVbWZ6SywI01Mv4Xfy zx8ADrt1vqu1IJ6D96|nl$7xjf+Sc@P(D zmGs>=Y(MtC+Xxq+R0OKOt~zFr(oHy)S0X8Lf}`K7=G~G9%TwH2X)JW5vEYETtKL<< zUS?tus7LNtTI*R6j8GdS+wnS;C(FhsT4M9U85>dYL`ZA9VTMBwjXsPNdCHgu@t!$Y ze;d>v^xFJ-YkpZ;X^RVITg>@53<)QPZdA1_=qjQSs;Q-2q91flOz#s9E+_FraUW`| zX8>iRX{bY226e5%xFQw%3-Oyv>CJ$gpK_IO_b>AqvP*$kb37>0-3ZaUb>uKV6L@Uw z&*87+`ZAEkc8-o{(P+Bs%)7+sd48NVB`Km!!sF1Lv_|V^kfFZ^#!y@)cs!23lmN_a#bCRuOT_N!3 z-TNz3vFJzw0^Wv6T9wO3B4*AUu|=(~ZgYN-@}O!VtS9+l^SLWNxn{I`u1qcWa_f}r ziPP)}y6^MG?4F36N@8G#4(f71T+XR*i1Dows~_ZrJpnQu$&vzeaLoOX3(SDI2v zE3IKhQBDBcLt%~^k)=ljPK6Og=YhZgE%0P1H8CYdP_fRU;uz{dLezaw7&>}sW4Abh zrI***w_TRD2Vg83&I>~$aW2Gl^V`xhVHi0&Wz1WC4^`=;I{GkvkNQN@01c>3;{wc~ z1$hFwGN0ceRt|89w9Xlvzzqc4THl=lglm3tV51#-a|B5fkF2F+?UKee7?Dg_X@Z5l zQnz{Nnu_UyS&^Txkwev|>zOI`G`zGjHqB}MII5PBjyZeV_9Aa~F;)Y={PK3=;IYpI zia7u=sZrMP@$Y8e69!EJZ$4vMb+F{8YQ~^jQUnx{5xndH&-&VtRq?W)xIn%J&M7CW6 zY-1jvn>)(tDbV;w-td;UC#h&3Wl~X?GD^pm_cn4gIqK0G6$S-vsS@fhc?DFK5nNCa zPTN(Q-+jadFVdX)BFh$rKG^dTE-~>v<;*It`h)D#sqq=dIUjS#KW0$I>S%*-G1l|| zzBJ~~b8WpS#)Cl@>M(!i+5>z+16xR>{+0YOXndq(C{m)ZER@D6;atQ}pLzvJ^fnn8 z2S(P=xg3>Cq8wmoFNSgSFbs%@_x#7EJF_j}$*~o#6&(G+_^>|6J?$aBUSb5sz+cF| zjR|<5s>%s^t0`X@^j8Mmgh7AEE9x6pQl^aBzStt3=n_D}MNUoUQbhpfbrcuTZ z=Mna%5NC6;EXo>IXom+oKKv3DwxzzP_%eh(BivGL-B5LUu4+$VflkgYEt;-u5IBT# zXMJ5&^;|R~6WcL6_NeT)u^zlFseNzaWj^cFf(YLf&Yj6}Iz@I0g=w%EXD_Oz9By+f zf%PPh3U3P2!ld9jx)EVn#xBDiv{%x{+RpiLY#BbidpI*VH(VN8g~=n2#rEEH+O0PY zc5D7AZpFW>G75u59CWCm(6V+yhijl20+Z(1&}QcHK9Pqh+)+@-`YIY?8L%}Z_F7do z-7h*b7A&(ox??{s{j80=a0AbS5rxEVP%|Y`vF~ig7FfbOF3ZD$a+=;Jo^;K+ZQxxh zeK%bzd?BpO%~pDiMi^ntTnhK8Fy7G0cLaSPpnr`DT#JrDqRyAl{IKWdUO;~5e{R{k zkiQYlmvbF*>DP`#bIo8C#B5gt6tW=pfgHxGMH|h8`Wry%izsHrUzf3F_9X4PX}Fou zhg_xsGpawHi1?tzbzU004G^`pF`2jOJRuw zvk6QJX2iRQiJ*K9SaT}m{5~HY77Jb&hgy=CH1sEL0 zh5i+RjX^NxRN#=rJ154=y`f0wQbTcaEOaMYkAW$lyct3}5rASEOuQ0t-(rKniIPD1 z&~W7ahrkr{OU=^Qc6i7J!R4Ffz-aP^wI0cB(Q$VK*>jV$nDt3aG`%|O1A_EpF~aNb zko*zoT}W+1^qP15EYV*T{+Eye;gTPk+(~EvNFC|570VeH1=sczpp?N*UF-Ye_k*`Q&>y|xxcV{kC;W`wMnknnsPf@f z9TFOJj9MS4?zjiMr!BimwcxnbrVBfbEO20ZsPur3%Fk{dbn7BSw$c!<4HMG&PrV)a zJ)jR>{ZteS$#6usFS^*#)?hw<*iaI9yi+fzgD$!`LL2x$FRXIVoxGe>5ma-e4NxR> zXwY}OVJG5}X`vc8?j>C^Bhh4Atxp6mL{a%4#Z^iHUl^JpgV^*-*6K1|D+FwaxbgFv zTe+)vBOa_=-2<6T9GgA=6tvrJ2et>$TOBtlsoNagl^n2UfDYYe%yX2^A(cMY5{V#z z|1)@OQOn1lx0E@cEvu|>vJ^VA9&RwdtnV)NO@ zexwbgqcG)^rz3MM9{og=`pK6Q3Y8SC9vwXlvfOQGJrq%kIr*Hz;m zXAy8PxiM#O_hV;Xsx&Vxr5sZWs4Q=ePg!3STbP3_&(9!Nx{^>h5~=f@QDA^&VU`w< zYYF)BR@1iy6y^Dxg%M}=T=Ta?$=o*kuch0^Bkxj$5S0S7IVQ|nVCN^54u`x@XBjyZeg?~Wj7Ke5gsm})VosCo=7j)GPqqz~-t)tm|}wDzQM zg$7m2MQ{`Hx2h;NMdVH%h4P*#ZAoi_$H~YJC^^EL1(bWWcupc!c4e0cz;S`gmoeaJ z971soVS_SB+_o&xM&S0029w6c}!k z^d2hlRgAIPLCY~f6VOf%>V4vTy;Iy#d1~OSTFg}O0hCw}IRfZ)r<=l(?`LVejwVV3 zgIaKdOxpK2A_@@OOSvazJ{t3u3rG4M)93&48;aIb(Jt*~^-}&8t!MAEwBXk{3ti1i z(S!|U?Nrw1j?;EFY>bSZeVuZe_mie(wFk6Ox;YLH)4OF}yk>7e5Y(kB+Lq@VG+&s99`lVl39m(U7JU6$&}Zf))TdVO^=e;1|hN?JFc z3>cU5Tip0F$h)~NZV3rYmGL1|!;f;PS~E%ydA}3`{?4-W$csi?O2YdfNj32-4Iunu zmzJ|lvP`p6Y4ktxg|~;Cn-uNCPpk5`St1~bf357C6^nCi`hXn2HeCRzPGv!CNOc(0 zq>45Ed`)p!# z)OEUU0mg=jhi&59lO$1N!<|10Gw8>h>kE0|= z;}{zq+Depf;!v{<40ao5VD)0*kvXxh4wFp*Dxwrr$-+>$8Ppq6(Hbt5ZDiX$>S=_- z^OtX*w>FLrYPzVCSLAITQ#P^9kMuIq-xA9*BpR{~fLJrCM!lFrNfo!0(DGFhaG^O# zmwCMM4l7YAeHpJsbxAl3do9~$*4P+fr54GQ7OjUN{gn&q$e24?t3`n@CA$E3K#0FM zjUh^GG0eezdH6sO>oA&=Yy@}!-e20EtP+Q1eK#STQRJZ+vKZN7QN{MJ*|&r#uGV6Y z09Y1D&DJe?#pbT1QjM|nh zM7sF_JU-DH5G`v12lzqQPu$%SEY^&)i`Q{wBWzEN+zrDL2vT6qDFnwsyp6ZC)SvivoT4Wj>bh zj4Gv~KIOU+5{MgVD@Rz6h(V%kXY(|E&mqA2H|?Pq)(5rc`YpQeXwGSn^HnI(n~$S8 z!|>vqH2ZqXj_%Yb4J=X8U&)an9YPosp^28E$M6Lp--O_ulJHcm=DG?cd+{|J z=e(t_c{pm)k2|6ZQBP1GymBd+sVLZ_`(LIa0%xF_@{({j5G|0O?Ut>q!9!KKB8zH% z7@#f{Qlmu-N$Qcc07{c+k|s~ekfYz*;c=|LA(qz^e>)f57olLC0gej-J~?z&0-0B9 z%{Yur!?GTT=B=>DrI%0wL0PgR?-;OxE@HRLrBe@>iKPnMgEBf`yxeLXmsCovq9(KX zqKGJxLsngA+YNf_9P&6QqC2kUQ;u=d4sB%|j(NNwI6aj1d2%7;)h?k!B@bZMY^lYr zG3(IkwE96I6Dh=4PSCQQ5K6%Pl?O96XCvD{+zZ2H-Yr`DDpVs(KeCl7LFoC@LPSr< z@I!*I^fn;(wnu~X0}iJ5A>sPukV`0gJyd&t3XmhpB}p)YVHzb^Hx?4nff?Z1MU?9j zdvtX_#~^!2&srUFu>VdPilPs2h-+D0@7)zfT!9~CuMgv}x9hEj&synCR|fJq6I~02K-v85Dn!` z;ApoVll@!yS*Wo#oE@z{8qrFlX4``_)*id!Ehx1l2`fy+9*TI3WGkeP*p81*9Om(M zx?&%9S843DG0;mnitOnq5k&~{s?lBRhUB`3bC`bF4hnkhu;{uHx@2|@n1Rg^s!p!P zw))4|AFAxJWL;ETW{hn(+9q;)rS#c`59gi7Q*jH?A0$(t;lZ(=5@ zNyi6{!qEvHQ+lUyA5NBp`5I-nTa)oDFN`#KR}_9Tb67stiCV3Ns0?GdqsaRX;XS;4Y75?_0X$fEknUzQI(Vs zD?7F(YO-@=XZ`sW1}PanCGi_Vm795#VB<7Dsiw|QwGPXswiZ<40vKZ;o$y+v?IV%9 zYl&|vNs8*Nld@VOFCyiGW(>K0H8O+7%+bWGWf6-$q0+9v=2g`iV?r?VD>1+=sV$af zn8V(N90~Me$(JpnsfKk99Leb@g|&U=6Sv6TJ6Gga7c!=529zeS>iu92Dr*)@Sdh+{ zEL^}(eq?x}wAeS{2)kcf8$qb<{WyZ8UOJ^~LwpCMg^HbjkCf3iuy+GDr^5GoSn3cm zL2JfcjgECS5YHGC(luO&f-X6^>dD1r;^hwVTYJ z&r!^To?pmw5i&|gCI|X{!%Q6{F}!K|OR-G9(eCxSyRZI+-_v#-hoSs@Sb0&^%Wb+{ ze6-wB7T1>H^(dJT4SV3?=4@DDNVa;kO+@X&ZgfiE9KRIdYBQbd!Sus2Jy;#P-ee;J zbCnyo6;uF844E-2)g+zpSR-VKx}sdcyHBAT?nKsa*lujrI*WmeC?&XU@~8~`R5})2 z60VOqW|Z?bO>awyTagGByEIQF zz}JcCV83ACHhQUgU1f?n49mr)e5I;7w+ULbGHPa+2KyssY|6TRWE3k8vxT~VjO*t*Loha-YvV0?B{V^7c~G4L3eTA{ z=$79{P$L+tJdvSQI?L2B@H-maAf&bS=5*}4+Pku`Xlf~00>mLa0R0HB(*>f_+9rlP zFy(E&S-w)>t|@Sxk=#Ln^G_0pV{vDm&lho1b5^DM$%fpYV`DC84oIQd1}e z(R75uk5~y52g#zM0H3w7JCE`j>^K@IuJXIP*P3Wbox4PPM*6 z7ax+S@WK>t(}*f#Qb7+nhS)#5fRcr9tWk55h={SAsR_|xGGXKbinK~2@b||k`R=*J zecqqrbt8*(rkPChl&QL7xMQi8jAN?J9tE2#R=NlYN9VF>JiFsNtQjhm0C}$lbe1H& zDeN72bN&&YQqE~}w30V*obYF{B?K{N>Xk~iX&ByU4$~;jC4dz2*iUX=9{l^ew+9~M zvcQ6cFApFZrE+BmNUg8Gc|mYsftZ&E*y90AW%g5$4}ly-KKXIRkA~~Xi67h=PhPR` z$ona}nVmzNeGaX|E3fgZ(g|KOs87#cfB3NxEI($9B`v0Z3OH`)FMf+4i4L}ki3=jO zwjDUc8--H%>$L(^uwy@2nR5i`d=e#w^in2DQGp+uY&IrBQD)E!h>CgjI))e~{Ai>G znRzzu#2RfFMDYOQaIzU-6eQCD#`zBhm>yuD_sfi*?*RrnS@}bt**KV8$8+XYb@7~E zMZvB2Q#zUC8~o-QTSs5YQbv$117K%)FBIbHCKSVRyDmGdga>P9RcraxW%+z zV5a5o44?$IhL!HHmcZV?OZ$NKs&Oovg4IzrZx@h~MAH)1dw6Ld(9(s}7TguSwGVjd z-fIi*0^iyPyl}m?g*I4KiaYNFR#Uic33Nm+f|4=-><*J+4eYxNMXSG5hKNFg%XL_I zR5#fL7I4HI3Uki2mb5K72i9$*@Z#+D{X}FPg~o(Qxa>DHV^fllB|Xp)p-+Nli#a4Wh- z1Djp+!vT?3*GA#UX+*aOS*K!$4`Jk$9ah}q8AF(Z4}L0ITkjhxqxi72NEw|BVhv80G2K z08!Se>mmiS1nedjHap(rQC=rEZ86-s zhP1BOZ_6lS`CB25HK!vjdWMED5BkOTrlc#{2GztKti4M$NonBLvqONs2X-(-p<-E* zxFT)$G8{Pb8_bEVn@sR(5{uJK5#?Jf(^PAa!oM$D9FE>`EJ6{&KwgmF)xF0&@sg$G zHdJp1ak@Ovwe5{ENILxjXv3v6{=O)r$qIK*C-YA(>qH}Zfw~i=y}}4yGt3oU=98au z<|mEg5w~o~pMOG5|4wQbjTS7Prs!k3DP-Z3RQEdXcqM_l1UND&gsx3VGnZOSdz$Ii zs4W~uVE~eSL<&!~(ekIwMBXk(qnnP`P%##UU(ipX7eKD5$rD!GGf^{1NEujWMnx)t z!b9cKLrBT3*7Pl-7mNxxVU#bZNrJzf^nRtK+Dq}Z=&Fst?KXdN^OlZOJXnjv0vMoL z%1qbK%c2;i?HOhod^dzb6qYsKdc*j@c16YIwci!nYVr_wr74ULK#|jTWeZ9jbM|x@ zBs~HHtZcJUUnU`%BlRA!Byf}_DF*C;9YTS^u@A)z+Aj1f0(UR9y``S`A zqJZ%M#JUDS_6;SCeWe~f+?=B(N9ciN41I~ILfGb9%h%eN_hZerCQnBehQy8*v`%WO zI@9_>2zYEWK1X+^+Ui0in~VmgQtR#?(SD8u>R#nio-! z(`;zWr{A`+hnh*vDpiS9*R7TcP}Vm~p~xk_aG^#6OQ6iAIV{wX^MhiEmPjm}gRLcC z$?vXDFT5}fmSx>E=`6F6*$_9R>cb!*EBq+Vy|hwp#~eC@SL<-vQ0zD>TX{&0%Gu-W zT`lY*6o?LUtaf;mi=u~>0z{(uxRS>nkw-)jDcXUl;kK{K;S#4%TK^`^R`jqSJDj*q zQXJlh+C}Cz&e=}wqUH(r`qr9$fc+#KxZSh;vVwC*SCz7+-XLbCamCCetXYGWmcN|9 zT~@H2Y_;PCHn;j*c87ce9q!tcb_Y8c{MQ%kh1^)Gn;5^xMffAL%D|apVP`$*_d>mF zO3pSkjtz0p#xt!iuk<&O`>J+wi`Ebn*%W{RI!Y@YSBR#5oC_;mAv**vVa4$Z_`fZ; zpsyD$(Ga?;>(b6*w#va<=fSQlsSy>YNeoJi=B$~2%a!wWmqx07E3F!Qt#sKs)=xVI zb@Vva?5jM27&!hms@QO#p-ln2`t36S`1v#VF@WYx-cRX0zo9ZjONKWSL^&2#&9Nfm z_r#NQI^{#(rSTm#2*__E5qJvl@(&|u2Fak#8w!c?YtL>+fiJSKY^%VhjiXxzg&t>O zv0OkXyea2OngoW_nWR>1&IAew1}SyoOCYrGwrm5b3rg&BROBON!}7gZbTc!@T4Yf` zzFB{Tvx=m)=gb>_lXMp2Z4JIlZzHTbh4HaCa&j^}*avHIQy9d4}+sEe1AYge8O=4F^9^;pW zr{5l&~i`=s6x+jD57M92bi1pTywXzv`1}klVn=6-c80$8dZiaRj zj@N=hH?H)n-TMLCz0Iwfe~P-O42qV8^f_m~?EYy9%OW?%w&>Z~ALq1MU+#JlR*AX8 z%NzEZK)Q{&z?<=#tl+TZ%S^UaHihcnmMll9)H0Dt^O&$6jRs*Dq@-A@ajGmNp!?oU znucC5LrJtEFq;E$fO5TsEu=Hq%RqUTWjPuK3)F0U>Wpng7&xWsAoD>$=;I2M${*>e zCJ!C$^ymcbBNYYsPPIDS1(-b+p=2UKs$m_n%z7V$bTxDv_75szl~!BNgnDePjZx#>}9P5?`;<^mXBR~o*}aa54^p_8*!gwxS`dLd#^a^|r) zQ(6&!)@xaPxCmc|RE&Eg#2DyH#fZEv;%FXWpv8C3{}rx{j9&nK zUPiu$j%n9>@Y>T_2wH+Cdn2?3@4W1M*8#|_HcqI*T((SbCA_QVT$^;nGkajTuc4g# zkr$2Fs8@FdkyTQyuMbp>ZgN~!+x7;226vfrT<@NK>@={p{WU;qtr7VR+IWt^S_K^E zi^%)Qzhn1)>~F{hIZc;0Tuk=x*n8tN%UHku0{WvHQcd(n$Fp?K!T34NUHuKZ*pqBF zyHoFLMX($wE#(2aVcmG%vnRG5|F%wE3H@KEvWQi*ai`ZgZ5vMWd-m#9D2IQ(z+RLM zZE0r1N|1f-QN$BMTdqtlc>y`cy#n6x0!A6G-<++jaAPeW(Vp5z%?&8RmwmK_eChoh zv3t7+Tahs~a+?>(7!4)wRi5Z^Y0&_gzhXo=QmK*x16)?n%^+T;HXOBn z*DUGfp*06ngpredQCd@m;a~OJNfZ}G=+abXqpHZ#f`?tRBDZV~!WdOkfn{s^`pyq# zQNmhXFgk5hWAu>PA%nxS!jXe?zF3M{T>Mdoq1Z=Psx$~m8Ow-IOAK|Zl( zL}x~S7|Qhq_?*~ClRl0F}- zzxH7gXd?-Ih}xPef@9+6Or`Y8iko~Jw?Jd0Px7CNwdQl&ymMOJPks`{bb*G9>H@o} zfck_Iux{kRjLpThX#{t+N31FU;mw!1tz3eRMl~j6n+H+a+n*L9dB@EEEYB~NX0u1* zdO1WVa!IF%;sGEpYhVCy*3ltIvAHOC?IDJ6igh^i0xX{3#Kk3Rw!_W|H0M+F`cdWF~9lt+EtmYJr>Rp_TKRy5SY*+m70auVQXOQW~9qbXY5x!qu%;YiY zV3MdSAY%s*YS($~f$V1ScRMg#u%7Fp$PB9FC-t%~fHi=4AuQ*Dw?h-=8yW8?oe_S; zd_pxx!{#fih+*3d4cnH){51#Rq2wSmVV7KCQPx9?X@aq@DYyJlc$Q%G9G^gros70* zXIvx215ogwT>>x`KXhTH_$qSIw@mf#O70*~h~gM4pl--!8$Se0xN_jukoId9_`-q& z6-K}o2F`lv+=W`mUDjbvf=5jmtD?jV7sMQoM1w#C57gc?btoxR>M$tS_x?&6x<`ts zS{eff1k~}V9w+C8Wqd5rL+(m{879M_axmwg;?|KTa0AH7CBhO&DfWrw+Y`|d=tpz9 z`2qWl15^fDuiweZeWCdT^>7Tm43hL!H*j+sDKlxjoF`S&2P_IjL5&pKZE2%Wt%1-w z@8Dx*PFE|LKEUB>i8?A--yEm(eWnTj7nh*Zd-4YGi|^6sQR(`W)@bSc+!=C)ZsS#9 zfje7C-pMmIcK8eQ+Q2HgCM1<^XUk!&oC0M6^ZDt1OsoSfyJccqxo%bO;9;)5k59W{ z^uQmtd0JHD?o^w7s)04T=@1f|lX}}&$;KcEc^l#)X z1nZWYkHtQ`-KIEmn4-7sTB+kT?2#oP|P|FB^9hZ=pLueM6 zU8xQ4j{p7B+0SPem=$?z6D=>2Avz0WZ9iBg$bJoql2Hr~V zTSi*0JjM*0=Pdj{213cfyo3{_2MJeEg2~8y+&?}06NgX(2%xa&f+aV_jH1*JXRMf<4>+f%*CTdVKup^6JyY*~hc1LC%fOcZW7Xl+#FLtyE8TueyWX zF~{VnO28J=@3=ua{1pROC>i7U{kfGQ`AyRk>HFXP^}E0R?Vk^Sz8?M4UtGsgn+S@k zE+lcPYFyUT2glwbMJ`J<8mNR7Y9xM?h`IrOmic&e&3EApK9Oe-y_Pf=$#|FslgWr* z-Q>Y#DeU-lrsbwsLksy%=DKEDEoE#PC*lTFjW+32#9EF~sMchT3Yj7oAKt!wd_=YD zqN#U(v7AdB@e%*dvUEftnqpQgy*G~v(x1Qk_6QDj=?SnStS#$oN}}T`6|HuWGJyvo zZ$LN3p%1b3TX`>rjL@1m@`;BJmY2J{S;UHX4n9mq98F zPK<+7p_6Qxs9iG0$DG^my#v+!ZNA{DO;Wt$Y%(5kkiL6<_BmiwQSy7P420|sN(A~v z0mU9d%b#UiD!{WnT_$KP153b>YD!!#9f3t35O|FRb`HcZVDDdn+S-lW9*z}w961Ieq9fI%@sUyky(1jgs6!C>QvxkrAR0o zmy7$1$&-%Qg;#+F0QuJbmqelyCLr{%j9ForJkkhzc(sWM8&AQ7gLdp>+ z$@fg=F65$$xDY`2L;89S3$FCu%Zteb}?|QSVl1`PoT-^C6x!I0}im!G6Ed>&%7;P|~z~JLz(4dJy1iN_X+0kJXbB~7iJn}(D65y@tw-q*b5Qy$ zz9}uXD@Ox_O^cxq<8;HKL_iIKyYNXd%~;G?z@6-eTllwNbkx2__eT}gy8jHWQ_*!e z%~qolCoJLW?dIA-laleo)C{qR>zN{Yy6>OSh8j!MMH$orB5w&G zu7nIECs{`xeaGt~O-&qCqD)Ol$_lXr6loNzg=i}c{sf9RFv4Qj9M&@HRP4SEy%E=q zQ$g9n`N9g8u3!KoVKpN2)zuc|GI>_8-kQ|H#voGuv1|NUMKsa$c6lJUb{_axPae&* z^|_Ai>eH>w#58V9$RCrU-XdP!+@Kza>yFdl7M2JsJqD|eEsnQ4es5_wRCm`fHCJ}n z5qA4#LhUf47B(z!#C7VJE39`6=0B+P4xzlWbb{v?v|RbPNcRIINOcOavczz9t3i1# z7?xu#evF1hyl@02F_Zve5NriUoAO>XO=rd|lIna@b}`aVHX-C)ltgns7U-~ZP`IYJ zN`e^|>Ocsbtdz1(5hFsHzK{4V|87~Z&#k6Lqw4!Cg=~E}e^)v`#`@|+p;$+g-N;M? zj;VZ!h2%rCTuBzC%N+IZB!@IcwK%Od0}Vy(AuPoQ8fV}Pcq$~%U(kA3DNjm64aA=~ z<;lHvqSqh2O2aI=Nxj!2s8n_tb0UqhZPYdc=k%!`vsITWWShuJa2DCfxseV)O|I}H zx?%#)FGpfHjK%XY3%HVa-4HNjd9S%7S!F+1doqC=fofQYXicpKHkW$PnlVHO!=~Hc zK;-B(KT!#FA(MT^R|Wg!*CV~TgY%DL;2|d>=}dlki4jJPa~HS-#)Wmki}*54bhogI5Kqi2BS)?SM=MEI`CSkS`^MR zg!od4hI@RGLG?1GcWJTHjxJKkBcybVu~5qf`G@O?<~YE>7b!s2b;)>VrsE0M9Ha_T zDw$aYrY96fHZgV|_=+lr%jH=bf9v5+KoS-@_QN^&B~;ChF+Q(|ac~Z74nG3goh~yx zsSX-`IB4vfs-0tBBq`H~(qB^bHSVAt$~)Tikl@BN?a2`3i!`sS3B^V1^%SXfKcq$K zjHIE#oZe7^g02v^H2WXRo`*761ZuaeL_mGnCB)hON(|JvD%BdO!HP{+O4(#s>%ABi z_T_R#wds5bK86@*${ro#;n=V_yOrsUv3vM*WpSF+@o>0?zO-f(cU7~ztuW(tlWk(n za{ny{01?UdM2{^e`?s;>(e+9W!IqA=bw$k@Xc;OXSO=#ebu_43HWUN{lqMsqwloA* z?-9%t)Z&CdhPzKQd?2;V&|p-Jr(Qbk?HAN7ld?z}RDdkpMZC&@B{UELaa< zsHzP*UGx$-s$w)Nq%hv+DE3hu@#va>cWJb@RRI|bYmn)u(Gt%uam4ExSIe3z$3L-n z0WpRYkU+s4I4_uLa5Tv{fvha1@+kML@^o9M8>L)Xg3k(fmfU>cRvJ(4Q$q$$g7PeT zV9NqQMAi|qGNP3^0E{asM;DmDu+`L&aBmYHEte_eN1ZC~HEl8eO<(k}OS_E~Ei4la z9-T`1s(rdwG)Xrl(mW!{P~7ndq~tlOYN>HfYNDSB`gV_Lb=BrrYp7$FJ3LA4Zkw6zdvpu;f7=_B zK)AqH8*hIc{!xsBQs9}%k~#!C=+Uv572-u7#-==Q`&kVxC3Oo^Wmq) z{_n}PVaZ2dpkJd+99t_+m6tS#bPDnX#)=|W-io}RI|P25vc>hQt=AF{o^~9?5(k1+ z0P>*;eKA|+MuQrKG7M*>(L8^ia+wQ_7tvfbejybXx}Xqkm?Oja7jbz01gg3~z6lKL zCoQb7)%Z@xCd1^F+*%5C`YOZqAohw&!cRkn-TGuQ9_|u^U*=^iSg>G5$+BVZ`EBqj zec!gP?Yt+^JFkXTYdjnR&?|AzUlpG(O7W>@Dmzkp>H+Ak^sM1=EmadA z?sUW8A4S=D*pU$R$JLzp%L;<1Th#;9-yTlroGk!vdSs;ryD`;jX>Tt&H!Hl)s67wnFCA2UBm@ABJD=`)-5-NwsT zZ^~DtqL)%pA*j7*78{_j)Qcy5M((F%REB#Hn#LNazN#BN(D+BuIUcx!W$hVmC8Ou% z#=yZBrbje3ic-$BeLg<33qj67bH67!wJNWCfx_yhMg9pQ^qQ_nluH0}dXX*R&B57i zgE@9}bP+YG(T`b&#@%90h^&o!%*i!E*#mZ8#yOXr!>F3hk%)taV^6Xn&_@?(H5Q$w z%CS}Vj|j`2Y2_vw22PUjix&k{_{FM7dc7&Fqjd{$cpCd;7fQkiBfTT7Qc77>UcegG z58gtmo#ZKcXf)c}+kM`g_y(soDkNk`_KtcZ)Pugwv=hTQiENq{URR z1ecX`PTIw_n(uX85=`&;dZxUH==d!ba@!Xb&<9b2tOGUp9x-4P-vtZCR#;@Cs4!x4 zD2*NHh6}!leJJL<0UT|n9)@@*DJaUR?_~--ut{Iko!NqtHE53DLNf;>suRONWw@GA z)-l_f%q3aqN&ySQ4^dmRadp8CG}y6-q0A7I?7h_8dvdF-!!tkvpWJ9=@dI*-EL^%Q zsv{wISG-}=$xL*~Q^U%@9IDgxC|8wQk1wvzsUyR}Rj_wg{O`I`i?4NgqHSkf0w%h-ug<-$sduzDfacQLkx7e1FvQosCLSdV{OvMdsX7z?{hcTF$2 zk+ZU(sQ)LrhF0D+N0uGm#gQszV8?n8IoLZmN5*s-wNe_dGLWRxeVnE`;Ls|!tz)!j zY&K7j7OiN3UZGh*6c^ODRD>J0grj% zX9WeO8WkJ)6i2RT1{Ofq5gH9k2Ck2PH9EFZoUgN~xy*-;eGaQub~D$4R5z60?2|Sx zd10lJK)Xr|6>8XBdkjbGp)Ri@1Yw-qcdopB6$TG-^U?-8r#n zt34V&LC{#93o9+X&km@|*dYMSy3`5E2zx1u(woq;5}Gh!TZlv~SJZ$8PTeQ%AKcke zkf_54c6{OjJv9jgW@1xvuRS!~?9Ice>IfJWVAXnE+3{4t?7cCBE5=Evjk`L>?O9~( zPE-n(6~CpKUj!ncaVn$EVCy#nlsT-Snpsda>Yt6@w+ZA^vWN@G8}$@#8$L%Q4%6%T6Rs&~7(fql#rMy^fk?35Ob- zOg;*Om0$oW8A(*GmpL7>(z(jlv!tRWRxGBTrh7i<^x@FBE#GPlp&M5n*7BChOG9)} zH4eI*`uY~KhtgzpnhGGyc`HH8ICx`G!tlmu1B>{vJJCdj|1|3DF8L@5EMpcFUVd|} zM~#T77UxWO{md`19*v!Kh25R0_A=BH9@)*z+LfJ3v$?M%B{4f*KOsZ^tB~6yzktS# zUB%|vOmooq)MMPUl6HQgpkJz*=F!GN&r6ya^-jfHOJRN%Ho^tHC% zTGph;RtN>nii8cy)$BEm?b@HRM)@F3#h7ahV*sOX^a?g7fAKVWW#pHuQ0E&%!n;XH z=_}n%_=2=%C;_vB>;eN_s9X^}`b8E57^&n0-y@CZw!ff#w05JYhw<>C?5p;SK6TYx%2D@F?|QbP(5)faA-e9EL?qNE_AGE478X*ud} zZEe#Tl!PV2*TT>9vOn8;pNhk}f+LkC(*4;wz8;$2*P)@fBG4)PGKYbaw06TBm61X6 z3UXv=sKQ6&rRrsR75X4`p-=KALSY(E2OOuy{~``JREd>I-UsGgv>Iz(yq)n<)CMy+DNiDd6Fy1 z?1IHrZ-dEOI24$J(m$#Q^V();N+>j^hVZ#sLMq#+VHTo~Ud>3EmF!)sg|=k%k4s0? z5NAhrH|C4TBCet&*tB;!p$1thGsGuT*nQ?Nsxc=UTgXL;m#5$v_E$$_aQ*DVUSY%e zB*<2aLbGO=gNJ_MD?jjy;FY{kM6Al_1l~?>IAAmR2TlCqX|TWhukO6+``G8qP8c9$ z+03@D=s+ITd!fj|uwp<(#k)VYT`18UMv`SCl}@L|{i%0p!q-`h(>Gi)c+aJQ!>-vA zFbqE#6fK@m7k8Jm(Sc0hJyX63Xuf(QCZ$b|MS_Dv6mv)e z4dIyFjD=EGZ-fB=7M;h!(V_(UodC<)#ioy|g%p%zyUyvo71;Am@y%mL=&8PxMHb!h zdB8b~0SLQUN}G1N<5_uSqL&AfAiSSIQzEOch%w9g8BdBR*v%5+_93$4nbiwb?86S= z4H>`Z;qDu+7Hv+dea{s9b$N322}q3SX9fL`mnQuv!OrHf=<-Shxq>vKc$0Ang*gNe zhX^qkBGbhcotS3#eg^zNe$~dss$xy1G)&poyL4l!UQ6=fo@ia;?-na5!4guUj2Nc7 zf2FlBhdAFHO14^uOr(z%P?tdEiC~D39GXj)0x15LdD8Eu%pzf;M-it7%sV7U?7f%Kfo8XT&S z!#1Mo#2gSCSQdc35F7>!haPN-hG-pBF`PFZ@cd{TgPBHlx>n7^*b5+4M3AKzMv?v0?U1*Oncy} zE%hXgV{uoH&dWb~2kr2EPEs9IlJckNQsks1wI}C85yhjk`2wsC8a#Ft1CWux^5`&_ z*N~&zQhChLD5sI4ZV9)ISjSw0^l7Zp2j6eSt2&vI-=^tpsTnEC5T$PPGYDXHVlm2H zu3OjCOnBR*x68#Q>vC05+ypHaDt!^Wg6@q@w@`1Z^pA`@Sd^%!sgz|`;`M~F+neo* zLGO>_IBv^U=tZg?r^T5GKB>-uu#vA@@L<`4%bZP@F=d@*>QMFN+cip0CE< z>*ItT_?N)n7;hS&`St%J3#35{do#?I8-Jp}$CSE%* z!EL@Yz7pQ93D0H9uM(d0KCz_c_oym)}~0w;m5{Y5Ya2393x3eCKthSNee81PFEv19Xfbak~5Dq#op3(Sv=v>jloweDJApHLthfDq(11Fv?gs@W_+`Vw zWM>Mg!@O1QT#KljO1-I49_*lIQt_)gv2xU*I+hx1nMA)W8CQz=t;R3zX=HJm(QvqR zi6pO=@oihN#E?VE8w78we7RVpoOe(7xNSSqv{mL693*Wtsl`-^VEUb0i4b+I!U_<# zZhW16pgfJ0a`I6rMOZVCz=Q>|qB=Q`3J0vnz9~TQ*p%~=h(8_gBCenltJR6B0lRJP z?UD>vxt=Wd(6(4_uJPV{H_SJw_}6yGg;Aq_8GcRm>Cx?!c#Dg@RN$9Pm1rJugioOrohdH=^Hw9;Y}g)5jrp;kdV=j zlUm5GRc3l%mh2H>>VdKZeJ`o*=abx@LT@21Zf4(u%S=#%pm{EbiaMd38-h?<(To}! zG@1x^wRGS*q^m^)P>R+j{C{DZFd$u3c9H~e#doAzl}ps4o6+~y6i`*z-mQQ5<>d5u zeEf^~^9oaZB8<#}|vb@F~X z5d4-a%Q0tH{D+o;F6SD#9(aOLo-x!FMcW$7?xN<=6E)kFq(!xyukLGKO7p|}%j@%h z_u^<0z`rs+g*RO$q`d>?Am0kbk^oA~2CoQA`V+IEgIB12i!ZC@WbVxW0RikD4

    9O$R+jZ0@{R9as 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