/// <summary> /// Initializes a new instance of the <see cref="LoggerConfiguration" /> class. /// </summary> /// <param name="targetsByLevel">The targets by level.</param> /// <param name="exceptionLoggingOldStyle"> Use the old exception log handling of NLog 3.0? /// </param> public LoggerConfiguration(TargetWithFilterChain[] targetsByLevel, bool exceptionLoggingOldStyle = false) { this.targetsByLevel = targetsByLevel; #pragma warning disable 618 ExceptionLoggingOldStyle = exceptionLoggingOldStyle; #pragma warning restore 618 }
public void PrecalculateNeedsStackTrace() { _needsStackTrace = 0; for (TargetWithFilterChain awf = this; awf != null; awf = awf.Next) { if (_needsStackTrace >= 2) { break; } Target app = awf.Target; int nst = app.NeedsStackTrace(); _needsStackTrace = Math.Max(_needsStackTrace, nst); FilterCollection filterChain = awf.FilterChain; for (int i = 0; i < filterChain.Count; ++i) { Filter filter = filterChain[i]; nst = filter.NeedsStackTrace(); _needsStackTrace = Math.Max(_needsStackTrace, nst); } } }
internal static void Write(Type loggerType, TargetWithFilterChain targets, LogEventInfo logEvent, LogFactory factory) { if (targets == null) { return; } #if !NET_CF StackTraceUsage stu = targets.GetStackTraceUsage(); if (stu != StackTraceUsage.None && !logEvent.HasStackTrace) { StackTrace stackTrace; #if !SILVERLIGHT stackTrace = new StackTrace(StackTraceSkipMethods, stu == StackTraceUsage.WithSource); #else stackTrace = new StackTrace(); #endif int firstUserFrame = FindCallingMethodOnStackTrace(stackTrace, loggerType); logEvent.SetStackTrace(stackTrace, firstUserFrame); } #endif int originalThreadId = Thread.CurrentThread.ManagedThreadId; AsyncContinuation exceptionHandler = ex => { if (ex != null) { if (factory.ThrowExceptions && Thread.CurrentThread.ManagedThreadId == originalThreadId) { throw new NLogRuntimeException("Exception occurred in NLog", ex); } } }; for (var t = targets; t != null; t = t.NextInChain) { if (!WriteToTargetWithFilterChain(t, logEvent, exceptionHandler)) { break; } } // Destroy the objects logEvent.Dispose(); }
internal static void Write(Type loggerType, TargetWithFilterChain targets, LogEventInfo logEvent, LogFactory factory) { if (targets == null) return; #if !NETCF bool needTrace = false; bool needTraceSources = false; int nst = targets.NeedsStackTrace; if (nst > 0) needTrace = true; if (nst > 1) needTraceSources = true; StackTrace stackTrace = null; if (needTrace && !logEvent.HasStackTrace) { int firstUserFrame = 0; stackTrace = new StackTrace(STACK_TRACE_SKIP_METHODS, needTraceSources); for (int i = 0; i < stackTrace.FrameCount; ++i) { System.Reflection.MethodBase mb = stackTrace.GetFrame(i).GetMethod(); if (mb.DeclaringType == loggerType) { firstUserFrame = i + 1; } else { if (firstUserFrame != 0) break; } } logEvent.SetStackTrace(stackTrace, firstUserFrame); } #endif for (TargetWithFilterChain awf = targets; awf != null; awf = awf.Next) { Target app = awf.Target; FilterResult result = FilterResult.Neutral; try { FilterCollection filterChain = awf.FilterChain; for (int i = 0; i < filterChain.Count; ++i) { Filter f = filterChain[i]; result = f.Check(logEvent); if (result != FilterResult.Neutral) break; } if ((result == FilterResult.Ignore) || (result == FilterResult.IgnoreFinal)) { if (InternalLogger.IsDebugEnabled) { InternalLogger.Debug("{0}.{1} Rejecting message because of a filter.", logEvent.LoggerName, logEvent.Level); } if (result == FilterResult.IgnoreFinal) return; continue; } } catch (Exception ex) { InternalLogger.Error("FilterChain exception: {0}", ex); if (factory.ThrowExceptions) throw; else continue; } try { app.Write(logEvent); } catch (Exception ex) { InternalLogger.Error("Target exception: {0}", ex); if (factory.ThrowExceptions) throw; else continue; } if (result == FilterResult.LogFinal) return; } }
internal LoggerConfiguration GetConfigurationForLogger(string name, LoggingConfiguration config) { TargetWithFilterChain[]targetsByLevel = new TargetWithFilterChain[LogLevel.MaxLevel.Ordinal + 1]; TargetWithFilterChain[]lastTargetsByLevel = new TargetWithFilterChain[LogLevel.MaxLevel.Ordinal + 1]; if (config != null && IsLoggingEnabled()) { GetTargetsByLevelForLogger(name, config.LoggingRules, targetsByLevel, lastTargetsByLevel); } InternalLogger.Debug("Targets for {0} by level:", name); for (int i = 0; i <= LogLevel.MaxLevel.Ordinal; ++i) { StringBuilder sb = new StringBuilder(); sb.AppendFormat(CultureInfo.InvariantCulture, "{0} =>", LogLevel.FromOrdinal(i)); for (TargetWithFilterChain afc = targetsByLevel[i]; afc != null; afc = afc.Next) { sb.AppendFormat(CultureInfo.InvariantCulture, " {0}", afc.Target.Name); if (afc.FilterChain.Count > 0) sb.AppendFormat(CultureInfo.InvariantCulture, " ({0} filters)", afc.FilterChain.Count); } InternalLogger.Debug(sb.ToString()); } return new LoggerConfiguration(targetsByLevel); }
internal void GetTargetsByLevelForLogger(string name, LoggingRuleCollection rules, TargetWithFilterChain[]targetsByLevel, TargetWithFilterChain[]lastTargetsByLevel) { foreach (LoggingRule rule in rules) { if (rule.NameMatches(name)) { for (int i = 0; i <= LogLevel.MaxLevel.Ordinal; ++i) { if (i >= GlobalThreshold.Ordinal && rule.IsLoggingEnabledForLevel(LogLevel.FromOrdinal(i))) { foreach (Target target in rule.Targets) { TargetWithFilterChain awf = new TargetWithFilterChain(target, rule.Filters); if (lastTargetsByLevel[i] != null) { lastTargetsByLevel[i].Next = awf; } else { targetsByLevel[i] = awf; } lastTargetsByLevel[i] = awf; } } } GetTargetsByLevelForLogger(name, rule.ChildRules, targetsByLevel, lastTargetsByLevel); if (rule.Final) break; } } for (int i = 0; i <= LogLevel.MaxLevel.Ordinal; ++i) { TargetWithFilterChain tfc = targetsByLevel[i]; if (tfc != null) tfc.PrecalculateNeedsStackTrace(); } }
/// <summary> /// Creates a logger that discards all log messages. /// </summary> /// <returns></returns> public Logger CreateNullLogger() { TargetWithFilterChain[]targetsByLevel = new TargetWithFilterChain[LogLevel.MaxLevel.Ordinal + 1]; Logger newLogger = new Logger(); newLogger.Initialize("", new LoggerConfiguration(targetsByLevel), this); return newLogger; }
private static bool WriteToTargetWithFilterChain(TargetWithFilterChain targetListHead, LogEventInfo logEvent, AsyncContinuation onException) { Target target = targetListHead.Target; FilterResult result = GetFilterResult(targetListHead.FilterChain, logEvent); if ((result == FilterResult.Ignore) || (result == FilterResult.IgnoreFinal)) { if (InternalLogger.IsDebugEnabled) { InternalLogger.Debug("{0}.{1} Rejecting message because of a filter.", logEvent.LoggerName, logEvent.Level); } if (result == FilterResult.IgnoreFinal) { return false; } return true; } target.WriteAsyncLogEvent(logEvent.WithContinuation(onException)); if (result == FilterResult.LogFinal) { return false; } return true; }
internal void GetTargetsByLevelForLogger(string name, IList<LoggingRule> rules, TargetWithFilterChain[] targetsByLevel, TargetWithFilterChain[] lastTargetsByLevel) { foreach (LoggingRule rule in rules) { if (!rule.NameMatches(name)) { continue; } for (int i = 0; i <= LogLevel.MaxLevel.Ordinal; ++i) { if (i < this.GlobalThreshold.Ordinal || !rule.IsLoggingEnabledForLevel(LogLevel.FromOrdinal(i))) { continue; } foreach (Target target in rule.Targets) { var awf = new TargetWithFilterChain(target, rule.Filters); if (lastTargetsByLevel[i] != null) { lastTargetsByLevel[i].NextInChain = awf; } else { targetsByLevel[i] = awf; } lastTargetsByLevel[i] = awf; } } this.GetTargetsByLevelForLogger(name, rule.ChildRules, targetsByLevel, lastTargetsByLevel); if (rule.Final) { break; } } for (int i = 0; i <= LogLevel.MaxLevel.Ordinal; ++i) { TargetWithFilterChain tfc = targetsByLevel[i]; if (tfc != null) { tfc.PrecalculateStackTraceUsage(); } } }
public LoggerConfiguration(TargetWithFilterChain[] targetsByLevel) { _targetsByLevel = targetsByLevel; }