/// <summary>
        /// Map T
        /// </summary>
        /// <param name="tctpLogLevel"></param>
        /// <returns></returns>
        private LogLevel ConvertLogLevelToNlogLevel(TctpLogLevel tctpLogLevel)
        {
            LogLevel nLogLevel;

            switch (tctpLogLevel)
            {
            case TctpLogLevel.Debug:
                nLogLevel = LogLevel.Debug;
                break;

            case TctpLogLevel.Warn:
                nLogLevel = LogLevel.Warn;
                break;

            case TctpLogLevel.Error:
                nLogLevel = LogLevel.Error;
                break;

            case TctpLogLevel.Fatal:
                nLogLevel = LogLevel.Fatal;
                break;

            case TctpLogLevel.Trace:
                nLogLevel = LogLevel.Trace;
                break;

            case TctpLogLevel.Info:
            default:
                nLogLevel = LogLevel.Info;
                break;
            }

            return(nLogLevel);
        }
        private void Log(TctpLogLevel tctpLogLevel, Func <string> logMessageProvider, Exception ex = null)
        {
            try
            {
                // Map to NLog log level
                LogLevel     logLevel = ConvertLogLevelToNlogLevel(tctpLogLevel);
                LogEventInfo logEvent = new LogEventInfo(logLevel, "", logMessageProvider());

                if (ex != null)
                {
                    logEvent.Exception = ex;
                }

                logger.Log(logEvent);
            }
            catch (Exception exc)
            {
                // Logger should not throw an exception
            }
        }