Problem: Adding any kind of business/application event context is a pain. Instead of calling a nice logging method, you must create the LogEventInfo object and then log that.
Solution: Add overload methods that accept an IDictionary object of event context.
What I did:
1. Upgraded to VS2008
2. Removed broken prebuild events.
NLog.vs2005
"$(ProjectDir)..\..\tools\UpdateBuildNumber.exe" "$(ProjectDir)..\..\NLog.version" "$(ProjectDir)AssemblyBuildInfo.cs" "$(ProjectDir)..\..\build\NLog.buildversion"
NLog.ComInterop.vs2005
"$(ProjectDir)..\..\tools\UpdateBuildNumber.exe" "$(ProjectDir)..\..\NLog.version" "$(ProjectDir)AssemblyBuildInfo.cs" "$(ProjectDir)..\..\build\NLog.buildversion"
3. LogEventInfo.cs
Added new constructor.
/// <summary>
/// Creates a new instance of <see cref="LogEventInfo"/> and assigns its fields.
/// </summary>
///
Log level
///
Logger name
///
<see cref="IFormatProvider"/> object
///
Log message including parameter placeholders
///
Parameter array.
///
Exception information.
///
Application event context.
public LogEventInfo(LogLevel level, string loggerName, IFormatProvider formatProvider, string message, object[] parameters, Exception exception, IDictionary eventContext)
{
_timeStamp = CurrentTimeGetter.Now;
_level = level;
_loggerName = loggerName;
_message = message;
_parameters = parameters;
_formatProvider = formatProvider;
_exception = exception;
_layoutCache = null;
_sequenceID = Interlocked.Increment(ref _globalSequenceID);
_formattedMessage = null;
_eventContext = eventContext;
if (NeedToPreformatMessage(parameters))
CalcFormattedMessage();
#if !NETCF
_stackTrace = null;
_userStackFrame = 0;
#endif
}
4. Logger.cs
Added new using
using System.Collections;
5. Logger.cs
Added new WriteToTargets()
internal void WriteToTargets(LogLevel level, IFormatProvider formatProvider, string message, object[] args, Exception exception, IDictionary eventContext)
{
LogEventInfo logMessage = new LogEventInfo(level, this.Name, formatProvider, message, args, exception, eventContext);
LoggerImpl.Write(_loggerType, GetTargetsForLevel(level), logMessage, _factory);
}
6. Logger.cs
Added Log() overloads with a dictionary object
/// <summary>
///
/// </summary>
///
///
///
public void Log(IDictionary eventContext, LogLevel level, string message)
{
if (IsEnabled(level))
WriteToTargets(level, null, message, null, null, eventContext);
}
/// <summary>
///
/// </summary>
///
///
///
///
public void Log(IDictionary eventContext, LogLevel level, string message, params object[] args)
{
if (IsEnabled(level))
WriteToTargets(level, null, message, args, null, eventContext);
}
/// <summary>
///
/// </summary>
///
///
///
///
///
public void Log(IDictionary eventContext, LogLevel level, IFormatProvider formatProvider, string message, params object[] args)
{
if (IsEnabled(level))
WriteToTargets(level, formatProvider, message, args, null, eventContext);
}
/// <summary>
///
/// </summary>
///
///
///
///
public void LogException(IDictionary eventContext, LogLevel level, string message, Exception exception)
{
if (IsEnabled(level))
WriteToTargets(level, null, message, null, exception, eventContext);
}