Proposed changes to include EventContext in logging call.

1 message Options
Embed this post
Permalink
Jamison

Proposed changes to include EventContext in logging call.

Reply Threaded More More options
Print post
Permalink
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);
            }