From 1a5b2ced3cb43091c0166f16a1b52bc744faf8b3 Mon Sep 17 00:00:00 2001 From: theLosers106 Date: Mon, 21 Dec 2015 08:51:56 +0800 Subject: [PATCH] Upgrade to version 1.2.1.0 - Added support for another optimized sgminer - Added logging to file - Added option to set each group's benchmarking times - Changed default SwitchMinSecondsFixed to 15 minutes - Bug fixes & improvements --- .gitignore | 10 +- NiceHashMiner/Bitcoin.cs | 2 +- NiceHashMiner/Config.cs | 22 +- NiceHashMiner/Form1.cs | 50 +- NiceHashMiner/Form2.cs | 27 +- NiceHashMiner/Helpers.cs | 7 +- NiceHashMiner/Logger.cs | 52 + NiceHashMiner/Miner.cs | 42 +- NiceHashMiner/NiceHashMiner.csproj | 6 + NiceHashMiner/NiceHashStats.cs | 2 +- NiceHashMiner/Properties/AssemblyInfo.cs | 4 +- NiceHashMiner/ccminer_sp.cs | 4 +- NiceHashMiner/ccminer_tpruvot.cs | 4 +- NiceHashMiner/ccminer_tpruvot_sm21.cs | 4 +- NiceHashMiner/packages.config | 4 + NiceHashMiner/sgminer.cs | 130 +- .../log4net.2.0.5/lib/net20-full/log4net.dll | Bin 0 -> 307200 bytes .../log4net.2.0.5/lib/net20-full/log4net.xml | 31128 ++++++++++++++++ packages/repositories.config | 4 + 19 files changed, 31356 insertions(+), 146 deletions(-) create mode 100644 NiceHashMiner/Logger.cs create mode 100644 NiceHashMiner/packages.config create mode 100644 packages/log4net.2.0.5/lib/net20-full/log4net.dll create mode 100644 packages/log4net.2.0.5/lib/net20-full/log4net.xml create mode 100644 packages/repositories.config diff --git a/.gitignore b/.gitignore index 8e35c5b..4029c9d 100644 --- a/.gitignore +++ b/.gitignore @@ -68,4 +68,12 @@ cpuid/cpuid.vcxproj.user *.idb NiceHashMiner.sdf NiceHashMiner.opensdf -Release \ No newline at end of file +Release +packages/log4net.2.0.5/log4net.2.0.5.nupkg +packages/log4net.2.0.5/lib/net10-full +packages/log4net.2.0.5/lib/net11-full +packages/log4net.2.0.5/lib/net35-client +packages/log4net.2.0.5/lib/net35-full +packages/log4net.2.0.5/lib/net40-client +packages/log4net.2.0.5/lib/net40-full +packages/log4net.2.0.5/lib/net45-full \ No newline at end of file diff --git a/NiceHashMiner/Bitcoin.cs b/NiceHashMiner/Bitcoin.cs index c9e1dee..e426556 100644 --- a/NiceHashMiner/Bitcoin.cs +++ b/NiceHashMiner/Bitcoin.cs @@ -59,7 +59,7 @@ private static string GetCoinbaseAPIData(string URL) } catch (Exception ex) { - Helpers.ConsolePrint(ex.Message); + Helpers.ConsolePrint("COINBASE", ex.Message); return null; } diff --git a/NiceHashMiner/Config.cs b/NiceHashMiner/Config.cs index d47ae23..59fa8fb 100644 --- a/NiceHashMiner/Config.cs +++ b/NiceHashMiner/Config.cs @@ -53,9 +53,13 @@ public class Config public int SwitchMinSecondsDynamic; public int MinerAPIQueryInterval; public int MinerRestartDelayMS; - public int[] BenchmarkTimeLimits; + public int[] BenchmarkTimeLimitsCPU; + public int[] BenchmarkTimeLimitsNVIDIA; + public int[] BenchmarkTimeLimitsAMD; public bool StartMiningWhenIdle; public int MinIdleSeconds; + public int LogLevel; + public long LogMaxFileSize; // in bytes public Group[] Groups; #pragma warning restore 649 @@ -74,22 +78,32 @@ static Config() ConfigData.HideMiningWindows = false; ConfigData.AutoStartMining = false; ConfigData.StartMiningWhenIdle = false; + ConfigData.LogLevel = 1; + ConfigData.LogMaxFileSize = 1048576; try { ConfigData = JsonConvert.DeserializeObject(File.ReadAllText("config.json")); } catch { } if (ConfigData.SwitchMinSecondsFixed <= 0) - ConfigData.SwitchMinSecondsFixed = 3 * 60; + ConfigData.SwitchMinSecondsFixed = 15 * 60; if (ConfigData.SwitchMinSecondsDynamic <= 0) ConfigData.SwitchMinSecondsDynamic = 3 * 60; if (ConfigData.MinerAPIQueryInterval <= 0) ConfigData.MinerAPIQueryInterval = 5; if (ConfigData.MinerRestartDelayMS <= 0) ConfigData.MinerRestartDelayMS = 200; - if (ConfigData.BenchmarkTimeLimits == null || ConfigData.BenchmarkTimeLimits.Length < 3) - ConfigData.BenchmarkTimeLimits = new int[] { 10, 20, 60 }; + if (ConfigData.BenchmarkTimeLimitsCPU == null || ConfigData.BenchmarkTimeLimitsCPU.Length < 3) + ConfigData.BenchmarkTimeLimitsCPU = new int[] { 10, 20, 60 }; + if (ConfigData.BenchmarkTimeLimitsNVIDIA == null || ConfigData.BenchmarkTimeLimitsNVIDIA.Length < 3) + ConfigData.BenchmarkTimeLimitsNVIDIA = new int[] { 10, 20, 60 }; + if (ConfigData.BenchmarkTimeLimitsAMD == null || ConfigData.BenchmarkTimeLimitsAMD.Length < 3) + ConfigData.BenchmarkTimeLimitsAMD = new int[] { 120, 180, 240 }; if (ConfigData.MinIdleSeconds <= 0) ConfigData.MinIdleSeconds = 60; + if (ConfigData.LogLevel != 0 || ConfigData.LogLevel != 1) + ConfigData.LogLevel = 1; + if (ConfigData.LogMaxFileSize <= 0) + ConfigData.LogMaxFileSize = 1048576; } public static void Commit() diff --git a/NiceHashMiner/Form1.cs b/NiceHashMiner/Form1.cs index a114a0e..9b7e1af 100644 --- a/NiceHashMiner/Form1.cs +++ b/NiceHashMiner/Form1.cs @@ -47,10 +47,13 @@ public Form1(bool ss) f4.ShowDialog(); } + if (Config.ConfigData.LogLevel > 0) + Logger.ConfigureWithFile(); + if (Config.ConfigData.DebugConsole) Helpers.AllocConsole(); - Helpers.ConsolePrint("Starting up"); + Helpers.ConsolePrint("NICEHASH", "Starting up"); R = new Random((int)DateTime.Now.Ticks); @@ -93,14 +96,14 @@ private void IdleCheck_Tick(object sender, EventArgs e) if (MSIdle < (Config.ConfigData.MinIdleSeconds * 1000)) { button2_Click(null, null); - Helpers.ConsolePrint("resumed from idling"); + Helpers.ConsolePrint("NICEHASH", "Resumed from idling"); } } else { if (BenchmarkForm == null && (MSIdle > (Config.ConfigData.MinIdleSeconds * 1000))) { - Helpers.ConsolePrint("entering idling state"); + Helpers.ConsolePrint("NICEHASH", "Entering idling state"); button1_Click(null, null); } } @@ -462,7 +465,7 @@ void BalanceCheck_Tick(object sender, EventArgs e) { if (VerifyMiningAddress()) { - Helpers.ConsolePrint("NICEHASH: balance get"); + Helpers.ConsolePrint("NICEHASH", "Balance get"); double Balance = NiceHashStats.GetBalance(textBox1.Text.Trim(), textBox1.Text.Trim() + "." + textBox2.Text.Trim()); if (Balance > 0) { @@ -475,17 +478,17 @@ void BalanceCheck_Tick(object sender, EventArgs e) void BitcoinExchangeCheck_Tick(object sender, EventArgs e) { - Helpers.ConsolePrint("COINBASE: bitcoin rate get"); + Helpers.ConsolePrint("COINBASE", "Bitcoin rate get"); double BR = Bitcoin.GetUSDExchangeRate(); if (BR > 0) BitcoinRate = BR; - Helpers.ConsolePrint("Current Bitcoin rate: " + BitcoinRate.ToString("F2", CultureInfo.InvariantCulture)); + Helpers.ConsolePrint("COINBASE", "Current Bitcoin rate: " + BitcoinRate.ToString("F2", CultureInfo.InvariantCulture)); } void SMACheck_Tick(object sender, EventArgs e) { string worker = textBox1.Text.Trim() + "." + textBox2.Text.Trim(); - Helpers.ConsolePrint("NICEHASH: sma get"); + Helpers.ConsolePrint("NICEHASH", "SMA get"); NiceHashSMA[] t = NiceHashStats.GetAlgorithmRates(worker); for (int i = 0; i < 3; i++) @@ -496,7 +499,7 @@ void SMACheck_Tick(object sender, EventArgs e) break; } - Helpers.ConsolePrint("NICEHASH: sma get failed .. retrying"); + Helpers.ConsolePrint("NICEHASH", "SMA get failed .. retrying"); System.Threading.Thread.Sleep(1000); t = NiceHashStats.GetAlgorithmRates(worker); } @@ -520,7 +523,7 @@ void SMACheck_Tick(object sender, EventArgs e) void UpdateCheck_Tick(object sender, EventArgs e) { - Helpers.ConsolePrint("NICEHASH: version get"); + Helpers.ConsolePrint("NICEHASH", "Version get"); string ver = NiceHashStats.GetVersion(textBox1.Text.Trim() + "." + textBox2.Text.Trim()); if (ver == null) return; @@ -535,16 +538,27 @@ void UpdateCheck_Tick(object sender, EventArgs e) void SetEnvironmentVariables() { - Helpers.ConsolePrint("NICEHASH: setting environment variables"); + Helpers.ConsolePrint("NICEHASH", "Setting environment variables"); + + string[] envName = { "GPU_MAX_ALLOC_PERCENT", "GPU_USE_SYNC_OBJECTS", "GPU_MAX_HEAP_SIZE" }; + string[] envValue = { "100", "1", "100" }; - System.Diagnostics.Process process = new System.Diagnostics.Process(); - System.Diagnostics.ProcessStartInfo runSetEnv = new System.Diagnostics.ProcessStartInfo(); - runSetEnv.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; - runSetEnv.FileName = "cmd.exe"; - runSetEnv.Arguments = "/C setx GPU_MAX_ALLOC_PERCENT 100 && " + - "setx GPU_USE_SYNC_OBJECTS 1 && setx GPU_MAX_HEAP_SIZE 100"; - process.StartInfo = runSetEnv; - process.Start(); + for (int i = 0; i < envName.Length; i++) + { + // Check if all the variables is set + if (Environment.GetEnvironmentVariable(envName[i]) == null) + { + try { Environment.SetEnvironmentVariable(envName[i], envValue[i]); } + catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } + } + + // Check to make sure all the values are set correctly + if (!Environment.GetEnvironmentVariable(envName[i]).Equals(envValue[i])) + { + try { Environment.SetEnvironmentVariable(envName[i], envValue[i]); } + catch (Exception e) { Helpers.ConsolePrint("NICEHASH", e.ToString()); } + } + } } diff --git a/NiceHashMiner/Form2.cs b/NiceHashMiner/Form2.cs index c25ed95..ef3e87b 100644 --- a/NiceHashMiner/Form2.cs +++ b/NiceHashMiner/Form2.cs @@ -13,7 +13,8 @@ public partial class Form2 : Form private int index; private bool inBenchmark; - private int Time = Config.ConfigData.BenchmarkTimeLimits[1]; + private int Time; + private int TimeIndex = 1; private Miner CurrentlyBenchmarking; public Form2(bool autostart) @@ -89,6 +90,20 @@ private void InitiateBenchmark() lvi.SubItems[3].Text = "Please wait..."; inBenchmark = true; CurrentlyBenchmarking = m; + + if (m is cpuminer) + Time = Config.ConfigData.BenchmarkTimeLimitsCPU[TimeIndex]; + else if (m is ccminer) + Time = Config.ConfigData.BenchmarkTimeLimitsNVIDIA[TimeIndex]; + else + { + Time = Config.ConfigData.BenchmarkTimeLimitsAMD[TimeIndex] / 60; + + // add an aditional minute if second is not 0 + if (DateTime.Now.Second != 0) + Time += 1; + } + m.BenchmarkStart(i, Time, BenchmarkCompleted, lvi); } else @@ -96,7 +111,7 @@ private void InitiateBenchmark() // average all cpu benchmarks if (Form1.Miners[0] is cpuminer) { - Helpers.ConsolePrint("Calculating average CPU speeds:"); + Helpers.ConsolePrint("BENCHMARK", "Calculating average CPU speeds:"); double[] Speeds = new double[Form1.Miners[0].SupportedAlgorithms.Length]; int[] MTaken = new int[Form1.Miners[0].SupportedAlgorithms.Length]; @@ -118,7 +133,7 @@ private void InitiateBenchmark() for (int i = 0; i < Speeds.Length; i++) { if (MTaken[i] > 0) Speeds[i] /= MTaken[i]; - Helpers.ConsolePrint(Form1.Miners[0].SupportedAlgorithms[i].NiceHashName + " average speed: " + Form1.Miners[0].PrintSpeed(Speeds[i])); + Helpers.ConsolePrint("BENCHMARK", Form1.Miners[0].SupportedAlgorithms[i].NiceHashName + " average speed: " + Form1.Miners[0].PrintSpeed(Speeds[i])); foreach (Miner m in Form1.Miners) { @@ -150,17 +165,17 @@ private void Form2_FormClosing(object sender, FormClosingEventArgs e) private void radioButton1_CheckedChanged(object sender, EventArgs e) { - Time = Config.ConfigData.BenchmarkTimeLimits[0]; + TimeIndex = 0; } private void radioButton2_CheckedChanged(object sender, EventArgs e) { - Time = Config.ConfigData.BenchmarkTimeLimits[1]; + TimeIndex = 1; } private void radioButton3_CheckedChanged(object sender, EventArgs e) { - Time = Config.ConfigData.BenchmarkTimeLimits[2]; + TimeIndex = 2; } private void button1_Click(object sender, EventArgs e) diff --git a/NiceHashMiner/Helpers.cs b/NiceHashMiner/Helpers.cs index 7ad8530..b00b172 100644 --- a/NiceHashMiner/Helpers.cs +++ b/NiceHashMiner/Helpers.cs @@ -49,9 +49,12 @@ public static bool InternalCheckIsWow64() } } - public static void ConsolePrint(string text) + public static void ConsolePrint(string grp, string text) { - Console.WriteLine("[" +DateTime.Now.ToLongTimeString() + "] " + text); + Console.WriteLine("[" +DateTime.Now.ToLongTimeString() + "] [" + grp + "] " + text); + + if (Config.ConfigData.LogLevel > 0) + Logger.log.Info("[" + grp + "] " + text); } diff --git a/NiceHashMiner/Logger.cs b/NiceHashMiner/Logger.cs new file mode 100644 index 0000000..6ad6cbd --- /dev/null +++ b/NiceHashMiner/Logger.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using log4net.Repository.Hierarchy; +using log4net.Core; +using log4net.Appender; +using log4net.Layout; + +namespace NiceHashMiner +{ + public class Logger + { + public static readonly ILog log = LogManager.GetLogger(typeof(Logger)); + + public static void ConfigureWithFile() + { + Hierarchy h = (Hierarchy)LogManager.GetRepository(); + + if (Config.ConfigData.LogLevel == 1) + h.Root.Level = Level.Info; + else if (Config.ConfigData.LogLevel == 2) + h.Root.Level = Level.Warn; + else if (Config.ConfigData.LogLevel == 3) + h.Root.Level = Level.Error; + + h.Root.AddAppender(CreateFileAppender()); + h.Configured = true; + } + + public static IAppender CreateFileAppender() + { + RollingFileAppender appender = new RollingFileAppender(); + appender.Name = "RollingFileAppender"; + appender.File = "log.txt"; + appender.AppendToFile = true; + appender.RollingStyle = RollingFileAppender.RollingMode.Size; + appender.MaxSizeRollBackups = 1; + appender.MaxFileSize = Config.ConfigData.LogMaxFileSize; + appender.PreserveLogFileNameExtension = true; + + PatternLayout layout = new PatternLayout(); + layout.ConversionPattern = "[%date{yyyy-MM-dd HH:mm:ss}] [%level] %message%newline"; + layout.ActivateOptions(); + + appender.Layout = layout; + appender.ActivateOptions(); + + return appender; + } + } +} diff --git a/NiceHashMiner/Miner.cs b/NiceHashMiner/Miner.cs index a3e749c..e21c55c 100644 --- a/NiceHashMiner/Miner.cs +++ b/NiceHashMiner/Miner.cs @@ -112,7 +112,7 @@ virtual public void Stop() { if (ProcessHandle != null) { - Helpers.ConsolePrint(MinerDeviceName + " Shutting down miner"); + Helpers.ConsolePrint(MinerDeviceName, "Shutting down miner"); try { ProcessHandle.Kill(); } catch { } ProcessHandle.Close(); @@ -123,7 +123,8 @@ virtual public void Stop() { foreach (Process process in Process.GetProcessesByName("sgminer")) { - process.Kill(); + try { process.Kill(); } + catch (Exception e) { Helpers.ConsolePrint(MinerDeviceName, e.ToString()); } } } } @@ -166,6 +167,7 @@ virtual protected bool BenchmarkParseLine(string outdata) int i = outdata.IndexOf("Benchmark:"); int k = outdata.IndexOf("/s"); string hashspeed = outdata.Substring(i + 11, k - i - 9); + Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + hashspeed); // save speed int b = hashspeed.IndexOf(" "); @@ -188,11 +190,11 @@ virtual protected bool BenchmarkParseLine(string outdata) // save speed string hashSpeed = outdata.Substring(i + 2, k - i + 2); + Helpers.ConsolePrint("BENCHMARK", "Final Speed: " + hashSpeed); + hashSpeed = hashSpeed.Substring(0, hashSpeed.IndexOf(" ")); double speed = Double.Parse(hashSpeed, CultureInfo.InvariantCulture); - //Helpers.ConsolePrint("hashSpeed: " + hashSpeed); - if (outdata.Contains("Kilohash")) speed *= 1000; else if (outdata.Contains("Megahash")) @@ -216,7 +218,7 @@ virtual protected string BenchmarkGetConsoleOutputLine(Process BenchmarkHandle) virtual protected Process BenchmarkStartProcess(string CommandLine) { - Helpers.ConsolePrint(MinerDeviceName + " Starting benchmark: " + CommandLine); + Helpers.ConsolePrint(MinerDeviceName, "Starting benchmark: " + CommandLine); Process BenchmarkHandle = new Process(); BenchmarkHandle.StartInfo.FileName = Path; @@ -241,6 +243,7 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) try { + Helpers.ConsolePrint("BENCHMARK", "Benchmark starts"); BenchmarkHandle = BenchmarkStartProcess((string)CommandLine); while (true) @@ -269,13 +272,14 @@ virtual protected void BenchmarkThreadRoutine(object CommandLine) { SupportedAlgorithms[BenchmarkIndex].BenchmarkSpeed = 0; - Helpers.ConsolePrint(ex.Message); + Helpers.ConsolePrint(MinerDeviceName, ex.Message); try { if (BenchmarkHandle != null) BenchmarkHandle.Kill(); } catch { } OnBenchmarkComplete(false, "Terminated", BenchmarkTag); } + Helpers.ConsolePrint("BENCHMARK", "Benchmark ends"); if (BenchmarkHandle != null) BenchmarkHandle.Close(); @@ -299,7 +303,7 @@ virtual protected Process _Start() PreviousTotalMH = 0.0; if (LastCommandLine.Length == 0 || EnabledDeviceCount() == 0) return null; - Helpers.ConsolePrint(MinerDeviceName + " Starting miner: " + LastCommandLine); + Helpers.ConsolePrint(MinerDeviceName, "Starting miner: " + LastCommandLine); Process P = new Process(); @@ -322,7 +326,7 @@ virtual protected Process _Start() } catch (Exception ex) { - Helpers.ConsolePrint(ex.Message); + Helpers.ConsolePrint(MinerDeviceName, ex.Message); return null; } } @@ -363,7 +367,7 @@ protected void FillAlgorithm(string aname, ref APIData AD) { for (int i = 0; i < SupportedAlgorithms.Length; i++) { - if (SupportedAlgorithms[i].MinerName == aname) + if (SupportedAlgorithms[i].MinerName.Equals(aname)) { AD.AlgorithmID = SupportedAlgorithms[i].NiceHashID; AD.AlgorithmName = SupportedAlgorithms[i].NiceHashName; @@ -397,7 +401,7 @@ protected string GetAPIData(int port, string cmd) "User-Agent: NiceHashMiner/" + Application.ProductVersion + "\r\n" + "\r\n"; - if (MinerDeviceName == "AMD_OpenCL") + if (MinerDeviceName.Equals("AMD_OpenCL")) DataToSend = cmd; byte[] BytesToSend = ASCIIEncoding.ASCII.GetBytes(DataToSend); @@ -447,7 +451,7 @@ public APIData GetSummary() { string[] resps; - if (MinerDeviceName != "AMD_OpenCL") + if (!MinerDeviceName.Equals("AMD_OpenCL")) { resps = resp.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < resps.Length; i++) @@ -472,31 +476,30 @@ public APIData GetSummary() { if (!checkGPUStatus[i].Contains("Status=Alive")) { - Helpers.ConsolePrint("GPU " + i + ": Sick/Dead/NoStart/Initialising/Disabled/Rejecting/Unknown"); + Helpers.ConsolePrint(MinerDeviceName, "GPU " + i + ": Sick/Dead/NoStart/Initialising/Disabled/Rejecting/Unknown"); return null; } } - Helpers.ConsolePrint("AMD_OpenCL: All GPUs are alive"); resps = resp.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries); - if (resps.Length == 3) + if (resps[1].Contains("SUMMARY")) { string[] data = resps[1].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // Get miner's current total speed string[] speed = data[4].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); // Get miner's current total MH - double total_mh = Double.Parse(data[18].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries)[1]); - + double total_mh = Double.Parse(data[18].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries)[1], new CultureInfo("en-US")); + ad.Speed = Double.Parse(speed[1]) * 1000; aname = SupportedAlgorithms[CurrentAlgo].MinerName; if (total_mh <= PreviousTotalMH) { - Helpers.ConsolePrint("AMD_OpenCL: sgminer might be stuck as no new hashes are being produced"); - Helpers.ConsolePrint("Prev Total MH: " + PreviousTotalMH + " .. Current Total MH: " + total_mh); + Helpers.ConsolePrint(MinerDeviceName, "SGMiner might be stuck as no new hashes are being produced"); + Helpers.ConsolePrint(MinerDeviceName, "Prev Total MH: " + PreviousTotalMH + " .. Current Total MH: " + total_mh); return null; } @@ -529,7 +532,8 @@ virtual public int GetMaxProfitIndex(NiceHashSMA[] NiceHashData) SupportedAlgorithms[i].CurrentProfit = SupportedAlgorithms[i].BenchmarkSpeed * NiceHashData[SupportedAlgorithms[i].NiceHashID].paying * 0.000000001; - Helpers.ConsolePrint(MinerDeviceName + " " + NiceHashData[SupportedAlgorithms[i].NiceHashID].name + " paying " + SupportedAlgorithms[i].CurrentProfit.ToString("F8") + " BTC/Day"); + Helpers.ConsolePrint(MinerDeviceName, NiceHashData[SupportedAlgorithms[i].NiceHashID].name + + " paying " + SupportedAlgorithms[i].CurrentProfit.ToString("F8") + " BTC/Day"); if (SupportedAlgorithms[i].CurrentProfit > MaxProfit) { diff --git a/NiceHashMiner/NiceHashMiner.csproj b/NiceHashMiner/NiceHashMiner.csproj index f17e5e9..c3edd26 100644 --- a/NiceHashMiner/NiceHashMiner.csproj +++ b/NiceHashMiner/NiceHashMiner.csproj @@ -53,6 +53,10 @@ Resources\logo.ico + + ..\packages\log4net.2.0.5\lib\net20-full\log4net.dll + True + ..\3rdparty\json\Newtonsoft.Json.dll @@ -72,6 +76,7 @@ + @@ -127,6 +132,7 @@ Resources.resx True + SettingsSingleFileGenerator Settings.Designer.cs diff --git a/NiceHashMiner/NiceHashStats.cs b/NiceHashMiner/NiceHashStats.cs index 0a19c62..f9f6f95 100644 --- a/NiceHashMiner/NiceHashStats.cs +++ b/NiceHashMiner/NiceHashStats.cs @@ -182,7 +182,7 @@ private static string GetNiceHashAPIData(string URL, string worker) } catch (Exception ex) { - Helpers.ConsolePrint(ex.Message); + Helpers.ConsolePrint("NICEHASH", ex.Message); return null; } diff --git a/NiceHashMiner/Properties/AssemblyInfo.cs b/NiceHashMiner/Properties/AssemblyInfo.cs index 3cc6a1d..64796ac 100644 --- a/NiceHashMiner/Properties/AssemblyInfo.cs +++ b/NiceHashMiner/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.2.0.2")] -[assembly: AssemblyFileVersion("1.2.0.2")] +[assembly: AssemblyVersion("1.2.1.0")] +[assembly: AssemblyFileVersion("1.2.1.0")] diff --git a/NiceHashMiner/ccminer_sp.cs b/NiceHashMiner/ccminer_sp.cs index 8a5a2a8..491034f 100644 --- a/NiceHashMiner/ccminer_sp.cs +++ b/NiceHashMiner/ccminer_sp.cs @@ -22,7 +22,7 @@ protected override void AddPotentialCDev(string text) { if (!text.Contains("GPU")) return; - Helpers.ConsolePrint(MinerDeviceName + " detected: " + text); + Helpers.ConsolePrint(MinerDeviceName, "Detected: " + text); string[] splt = text.Split(':'); @@ -34,7 +34,7 @@ protected override void AddPotentialCDev(string text) { name = name.Substring(8); CDevs.Add(new ComputeDevice(id, MinerDeviceName, name)); - Helpers.ConsolePrint(MinerDeviceName + " added: " + name); + Helpers.ConsolePrint(MinerDeviceName, "Added: " + name); } } diff --git a/NiceHashMiner/ccminer_tpruvot.cs b/NiceHashMiner/ccminer_tpruvot.cs index 3332910..2cbaa82 100644 --- a/NiceHashMiner/ccminer_tpruvot.cs +++ b/NiceHashMiner/ccminer_tpruvot.cs @@ -21,7 +21,7 @@ protected override void AddPotentialCDev(string text) { if (!text.Contains("GPU")) return; - Helpers.ConsolePrint(MinerDeviceName + " detected: " + text); + Helpers.ConsolePrint(MinerDeviceName, "Detected: " + text); string[] splt = text.Split(':'); @@ -33,7 +33,7 @@ protected override void AddPotentialCDev(string text) { name = name.Substring(8); CDevs.Add(new ComputeDevice(id, MinerDeviceName, name)); - Helpers.ConsolePrint(MinerDeviceName + " added: " + name); + Helpers.ConsolePrint(MinerDeviceName, "Added: " + name); } } } diff --git a/NiceHashMiner/ccminer_tpruvot_sm21.cs b/NiceHashMiner/ccminer_tpruvot_sm21.cs index e744ef8..4da6afa 100644 --- a/NiceHashMiner/ccminer_tpruvot_sm21.cs +++ b/NiceHashMiner/ccminer_tpruvot_sm21.cs @@ -26,7 +26,7 @@ protected override void AddPotentialCDev(string text) { if (!text.Contains("GPU")) return; - Helpers.ConsolePrint(MinerDeviceName + " detected: " + text); + Helpers.ConsolePrint(MinerDeviceName, "Detected: " + text); string[] splt = text.Split(':'); @@ -38,7 +38,7 @@ protected override void AddPotentialCDev(string text) { name = name.Substring(8); CDevs.Add(new ComputeDevice(id, MinerDeviceName, name)); - Helpers.ConsolePrint(MinerDeviceName + " added: " + name); + Helpers.ConsolePrint(MinerDeviceName, "Added: " + name); } } } diff --git a/NiceHashMiner/packages.config b/NiceHashMiner/packages.config new file mode 100644 index 0000000..36480b5 --- /dev/null +++ b/NiceHashMiner/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/NiceHashMiner/sgminer.cs b/NiceHashMiner/sgminer.cs index c1349dd..4358ca9 100644 --- a/NiceHashMiner/sgminer.cs +++ b/NiceHashMiner/sgminer.cs @@ -23,15 +23,15 @@ class sgminer : Miner public sgminer() { SupportedAlgorithms = new Algorithm[] { - new Algorithm( 3, "x11", "x11", DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"), - new Algorithm( 4, "x13", "x13", DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"), - new Algorithm( 5, "keccak", "keccak", DefaultParam + "--nfactor 10 --xintensity 300 --thread-concurrency 0 --worksize 64 --gpu-threads 1"), - new Algorithm( 7, "nist5", "nist5", DefaultParam + "--nfactor 10 --xintensity 16 --thread-concurrency 0 --worksize 64 --gpu-threads 2"), - new Algorithm( 8, "neoscrypt", "neoscrypt", DefaultParam + "--nfactor 10 --xintensity 3 --thread-concurrency 8192 --worksize 64 --gpu-threads 2"), - new Algorithm(10, "whirlpoolx", "whirlpoolx", DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 2"), + new Algorithm( 3, "x11", "x11", DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1"), + new Algorithm( 4, "x13", "x13", DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"), + new Algorithm( 5, "keccak", "keccak", DefaultParam + "--nfactor 10 --xintensity 300 --thread-concurrency 0 --worksize 64 --gpu-threads 1"), + new Algorithm( 7, "nist5", "nist5", DefaultParam + "--nfactor 10 --xintensity 16 --thread-concurrency 0 --worksize 64 --gpu-threads 2"), + new Algorithm( 8, "neoscrypt", "neoscrypt", DefaultParam + "--nfactor 10 --xintensity 3 --thread-concurrency 8192 --worksize 64 --gpu-threads 2"), + new Algorithm(10, "whirlpoolx", "whirlpoolx", DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 2"), new Algorithm(11, "qubit", "qubitcoin", DefaultParam + "--intensity 18 --worksize 64 --gpu-threads 2"), - new Algorithm(12, "quark", "quarkcoin", DefaultParam + "--intensity 18 --worksize 64 --gpu-threads 2"), - new Algorithm(14, "lyra2rev2", "lyra2rev2", DefaultParam + "--nfactor 10 --xintensity 32 --thread-concurrency 8192 --worksize 32 --gpu-threads 4") + new Algorithm(12, "quark", "quarkcoin", DefaultParam + "--nfactor 10 --xintensity 1024 --thread-concurrency 0 --worksize 64 --gpu-threads 1"), + new Algorithm(14, "lyra2rev2", "Lyra2REv2", DefaultParam + "--nfactor 10 --xintensity 256 --thread-concurrency 0 --worksize 64 --gpu-threads 1") }; MinerDeviceName = "AMD_OpenCL"; @@ -50,7 +50,7 @@ protected void AddPotentialCDev(string text) { PlatformDevices = (int)Char.GetNumericValue(text.Split(' ')[3][0]); Devices = new string[PlatformDevices]; - Helpers.ConsolePrint("Platform Devices: " + PlatformDevices); + Helpers.ConsolePrint(MinerDeviceName, "Platform Devices: " + PlatformDevices); return; } @@ -61,9 +61,13 @@ protected void AddPotentialCDev(string text) PlatformDevices--; if (!(text.Contains("Tahiti") || text.Contains("Hawaii") || text.Contains("Pitcairn"))) { + SupportedAlgorithms[0].ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 64 --gpu-threads 2"; // x11 + SupportedAlgorithms[6].ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 128 --gpu-threads 4"; // qubit + SupportedAlgorithms[7].ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 64 --thread-concurrency 0 --worksize 256 --gpu-threads 1"; // quark + SupportedAlgorithms[8].ExtraLaunchParameters = DefaultParam + "--nfactor 10 --xintensity 32 --thread-concurrency 8192 --worksize 32 --gpu-threads 4"; // lyra2rev2 + EnableOptimizedVersion = false; - Helpers.ConsolePrint("One of the GPUs detected is not Tahiti, Hawaii or Pitcaird. " + - "Optimized version is disabled!"); + Helpers.ConsolePrint(MinerDeviceName, "One of the GPUs detected is not Tahiti, Hawaii or Pitcaird. Optimized version is disabled!"); return; } } @@ -76,11 +80,11 @@ protected void AddPotentialCDev(string text) int id = (int)Char.GetNumericValue(splt[2][8]); string name = splt[splt.Length - 1]; - Helpers.ConsolePrint(MinerDeviceName + " detected: " + name); + Helpers.ConsolePrint(MinerDeviceName, "Detected: " + name); // add AMD OpenCL devices CDevs.Add(new ComputeDevice(id, MinerDeviceName, name)); - Helpers.ConsolePrint(MinerDeviceName + " added: " + name); + Helpers.ConsolePrint(MinerDeviceName, "Added: " + name); } protected void QueryCDevs() @@ -103,33 +107,13 @@ protected void QueryCDevs() P.WaitForExit(); - // check for driver version - if (CDevs.Count > 0 && EnableOptimizedVersion) - { - ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController"); - ManagementObjectCollection moc = searcher.Get(); + // log the driver version + ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController"); + ManagementObjectCollection moc = searcher.Get(); - foreach (var manObj in moc) - { - //Helpers.ConsolePrint("Name : " + manObj["Name"]); - //Helpers.ConsolePrint("Driver Version : " + manObj["DriverVersion"]); - - if (manObj["Name"].ToString().Contains("AMD")) - { - if (manObj["DriverVersion"].ToString().StartsWith("15")) - { - Helpers.ConsolePrint("Driver Version 15.X Detected"); - break; - } - else - { - EnableOptimizedVersion = false; - MessageBox.Show("We highly recommend you to upgrade AMD GPU driver to version 15.x for best performance!", - "Update AMD Driver Recommended"); - break; - } - } - } + foreach (var manObj in moc) + { + Helpers.ConsolePrint(MinerDeviceName, "GPU Name (Driver Ver): " + manObj["Name"] + " (" + manObj["DriverVersion"] + ")"); } } @@ -138,19 +122,12 @@ protected override string BenchmarkCreateCommandLine(int index, int time) Algorithm Algo = GetMinerAlgorithm(SupportedAlgorithms[index].NiceHashID); if (Algo == null) { - Helpers.ConsolePrint("GetMinerAlgorithm(" + index + "): Algo equals to null"); + Helpers.ConsolePrint(MinerDeviceName, "GetMinerAlgorithm(" + index + "): Algo equals to null"); return ""; } Path = "cmd"; - string DirName = new DirectoryInfo(".").FullName + "\\bin\\"; - if (CheckIfOptimizeAlgo(Algo.NiceHashName)) - DirName += "sgminer-5-1-1-optimized"; - else - { - DirName += "sgminer-5-2-1-general"; - ToCompileNeoScryptBinFile(Algo.MinerName, DirName); - } + string DirName = GetMinerDirectory(Algo.NiceHashName); string url = Form1.NiceHashData[SupportedAlgorithms[index].NiceHashID].name + "." + Form1.MiningLocation[Config.ConfigData.Location] + ".nicehash.com:" + @@ -164,7 +141,7 @@ protected override string BenchmarkCreateCommandLine(int index, int time) "-k " + SupportedAlgorithms[index].MinerName + " --url=" + url + " --userpass=" + username + ":" + GetPassword(Algo) + - " --sched-stop " + DateTime.Now.AddMinutes(2.0).ToString("HH:mm") + + " --sched-stop " + DateTime.Now.AddMinutes(time).ToString("HH:mm") + " -T --log 30 --log-file dump.txt" + " " + ExtraLaunchParameters + " " + SupportedAlgorithms[index].ExtraLaunchParameters + @@ -174,8 +151,7 @@ protected override string BenchmarkCreateCommandLine(int index, int time) if (G.Enabled) CommandLine += G.ID.ToString() + ","; - CommandLine = CommandLine.Remove(CommandLine.Length - 1) + - " && del " + DirName + "\\dump.txt\""; + CommandLine = CommandLine.Remove(CommandLine.Length - 1) + " && del dump.txt\""; return CommandLine; } @@ -188,19 +164,12 @@ public override void Start(int nhalgo, string url, string username) Algorithm Algo = GetMinerAlgorithm(nhalgo); if (Algo == null) { - Helpers.ConsolePrint("GetMinerAlgorithm(" + nhalgo+ "): Algo equals to null"); + Helpers.ConsolePrint(MinerDeviceName, "GetMinerAlgorithm(" + nhalgo + "): Algo equals to null"); return; } Path = "sgminer.exe"; - WorkingDirectory = new DirectoryInfo(".").FullName + "\\bin\\"; - if (CheckIfOptimizeAlgo(Algo.NiceHashName)) - WorkingDirectory += "sgminer-5-1-1-optimized"; - else - { - WorkingDirectory += "sgminer-5-2-1-general"; - ToCompileNeoScryptBinFile(Algo.MinerName, WorkingDirectory); - } + WorkingDirectory = GetMinerDirectory(Algo.NiceHashName); LastCommandLine = "-k " + Algo.MinerName + " --url=" + url + @@ -232,39 +201,28 @@ public override void Start(int nhalgo, string url, string username) ProcessHandle = _Start(); } - private bool CheckIfOptimizeAlgo(string algo) + private string GetMinerDirectory(string algo) { - if (EnableOptimizedVersion) - if (algo.Equals("x11") || algo.Equals("quark") || algo.Equals("qubit")) - return true; + string dir = new DirectoryInfo(".").FullName + "\\bin\\"; - return false; - } - - private void ToCompileNeoScryptBinFile(string algo, string directory) - { - if (!algo.Equals("neoscrypt") && File.Exists(directory + "\\amdocl.dll")) + if (EnableOptimizedVersion && (algo.Equals("x11") || algo.Equals("quark") || algo.Equals("lyra2rev2"))) { - try - { - File.Move(directory + "\\amdocl.dll", directory + "\\__amdocl.dll"); - } - catch (Exception e) - { - Helpers.ConsolePrint("Move process failed: " + e.ToString()); - } + dir += "sgminer-5-1-0-optimized"; + } + else if (EnableOptimizedVersion && algo.Equals("qubit")) + { + dir += "sgminer-5-1-1-optimized"; + } + else if (algo.Equals("neoscrypt")) + { + dir += "sgminer-5-2-1-neoscrypt"; } else { - try - { - File.Move(directory + "\\__amdocl.dll", directory + "\\amdocl.dll"); - } - catch (Exception e) - { - Helpers.ConsolePrint("Move process failed: " + e.ToString()); - } + dir += "sgminer-5-2-1-general"; } + + return dir; } } } diff --git a/packages/log4net.2.0.5/lib/net20-full/log4net.dll b/packages/log4net.2.0.5/lib/net20-full/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..c66ddb9886301486d4e9ea0a7f2c3ffdb2a203b0 GIT binary patch literal 307200 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%0AKp>$$uZhF4V4(%A^ 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 af + + + 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 + + + + 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 + + + + 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 + + + + 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 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. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + 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 . + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + 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. + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + 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. + + + + + + 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 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. + + + + + 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. + + + + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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. + + + + + + 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 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. + + + + + + Ansi code to reset terminal + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + 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. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + 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". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + 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. + + + + + + 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 + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + 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 the options for the object + + + + Combine the and together + and append the attributes. + + + + + + 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 + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + 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. + + + + Allow subclasses to avoid our default constructors + + + + + + + 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. + + + + 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 . + + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + 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 . + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + 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 . + + + + + 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 + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + 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. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + 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. + + + + + Gets the current element in the collection. + + + + + + + + + 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 + (). + + + + + + Defaults to %logger + + + + + 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. + + + + + + + + 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 + + + + 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 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + 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 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. + + + + + + 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. + + + + + 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. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + 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. + + + + + + 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 appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + 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. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + 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 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 + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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 appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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 . + + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + 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 + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + 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 + + + + + + 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. + + + + + 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 . + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + 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 + + + + 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. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + 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. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + 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 appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + 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. + + + + + 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 . + + + + + + 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. + + + + + 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. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Syslog port 514 + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + 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 + + + + + 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 . + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + 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. + + + + + + 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 + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Cleans up all resources used by this appender. + + + + + 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 + + + + + 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! + + + + + + 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 + + + + + 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 + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + Send the email message + + the body text to include in the mail + + + + trims leading and trailing commas or semicolons + + + + + 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. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + 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 + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + 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. + + + + + + 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 . + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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. + + + + + + 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 + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + 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 + + + + + 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. + + + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + 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 + + + + 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. + + + + + + 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 . + + + + + + 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 appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + 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 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 + + + + 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. + + + + + + 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 + + + + 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 + + + + + + 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. + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + 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 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. + + + + + + + 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 log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + 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 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 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 . + + + + + + + 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. + + + + + 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. + + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + 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. + + + + + 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 + + + + 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 . + + + + + + 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. + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + 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 . + + + + + + 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 + + + + 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. + + + + + 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 . + + + + + + 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 + + + + 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 + + + + + + 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 . + + + + 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 . + + + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + 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 + + + + 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 name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + 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. + + + + Allow subclasses to avoid our default constructors + + + + + + 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. + + + + 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 . + + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + 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 . + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + 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 . + + + + + 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 + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + 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. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + 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. + + + + + Gets the current 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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 + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + 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. + + + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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 + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + The logger that this object is wrapping + + + + + 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. + + + + + + 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 + + + + + + The time the event was logged + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + 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 + + + + 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. + + + + + 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. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + 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. + + + + + + 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. + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored in 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 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 the local time zone for this computer. + + + + + + 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. + + + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + 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. + + + + + + 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 + + + + 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 . + + + + + + + + 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. + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + 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. + + + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + 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. + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + returns a stack frame item from a stack frame. This + + + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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) + + + + + + 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 default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + The time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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 . + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + 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 . + + + + + + 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. + + + + + 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 + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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 + + + + + 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 . + + + + + + 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 . + + + + + + 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 + + + + + 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. + + + + + + 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 . + + + + + + 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 + + + + + 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. + + + + + + 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 . + + + + + + 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 an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + 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. + + + + + + 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. + + + + + + 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". + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + 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 + + + + 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 + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + 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 + + + + + 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. + + + + + + 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 + + + + + + + + + + + Initializes a new instance of the class. + + + + + 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 + + + + + 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. + + + + + + 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 + + + + 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. + + + + 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. + + + + + + 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 + + + + 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. + + + + + 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 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. + + + + + + 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 + + + + 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. + + + + + The fully qualified type of the StackTraceDetailPatternConverter 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. + + + + + 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> + + + + + + 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 +
+ + + 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 + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 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. + + + + + + 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 + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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 . + + + + + + 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 + + + + 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. + + + + + + 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. + + 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 + + + + + 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. + + + + + + + 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". + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + 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 version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + 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. + + + + Allow subclasses to avoid our default constructors + + + + + + + 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. + + + + 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 . + + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + 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 . + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + 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 . + + + + + 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. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + 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. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + 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. + + + + + Gets the current element in the collection. + + + The current 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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 name of this plugin. + + + + + The repository this plugin is attached to. + + + + + 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. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that 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. + + + + + + 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. + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + 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 + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + 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 + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + 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 + + + + 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. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + 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 . + + + + + + 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. + + + + + + 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. + + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + 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. + + + + + + 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 + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + 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. + + + + + + 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. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + 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. + + + + + + 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. + + + + + + + + + + + + + + + + + + + + + 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. + + + + + + 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 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. + + + + + 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 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. + + + + + + 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 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + 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 . + + + + + + 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 + + + + + + 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 + + + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + 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 + + + + + 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. + + + + + + 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. + + + + + + Total 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + The singleton instance of the empty dictionary. + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + 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. + + + + + + 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. + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + 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. + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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 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 + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + + + + + + + + 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 + + + + 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. + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + 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: ". + + + + + + 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 ". + + + + + + 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. + + + + + 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. + + + + + 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. + + + + + 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 : + + + + + + + + + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for 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. + + + + + + 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 . + + + + + + 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. + + + + + 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. + + + + + + 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 . + + + + + 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. + + + + 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. + + + + 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. + + + + + + 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 . + + + + + 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. + + + + 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. + + + + + + The 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. + + + + + 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 occured. + + + + + 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 + + + + + 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. + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + 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. + + + + + 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. + + + + + + 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 + + + + + + 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. + + + + + + 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 + + + + 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. + + + + + + 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 + + + + + + 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 + + + + + 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. + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + 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. + + + + + + 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 + + + + + + + See + + + + + 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. + + + + + + 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 + + + + + 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 + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + 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. + + + + + + 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. + + + + + + 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 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + 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. + + + + + + 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. + + + + + + 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 + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + 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 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 + + + + + + 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. + + + + + + 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. + + + + + + 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. + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + 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 + + + + + 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. + + + + + + Default constructor + + + + Default constructor + + + + + + 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. + + + + + + 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). + + + + + + 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 + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + + 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 context properties instance + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + Provides information about the environment the assembly has + been built for. + + + + Version of the assembly + + + Version of the framework targeted + + + Type of framework targeted + + + Does it target a client profile? + + + + Identifies the version and target for this assembly. + + + + + 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. + + + 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 context properties instance + + + + + The thread context stacks instance + + + + + 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. + + + + + + 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. + + + + 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. + + + + 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. + + + + 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. + + + 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. + + + + 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. + + + + 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. + + + + + 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"); + } + + + + + + 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. + + + + + + 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. + + + + + + + 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 context properties instance + + + + + The thread context stacks instance + + + + + 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. + + + + + diff --git a/packages/repositories.config b/packages/repositories.config new file mode 100644 index 0000000..f773560 --- /dev/null +++ b/packages/repositories.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file