代码之家  ›  专栏  ›  技术社区  ›  Shawn de Wet

NLogTraceListener如何输出跟踪自动选项

  •  0
  • Shawn de Wet  · 技术社区  · 6 年前

    我正在使用 NLogTraceListener 我发现了 here .

    它在我的配置文件中定义如下:

    <sharedListeners>
          <add name="nlog" type="NLog.NLogTraceListener, NLog" traceOutputOptions="Callstack" />
    </sharedListeners>
    

    以下是nlog.config文件中的LayoutRenderer:

    layout="${longdate} ${logger} ${uppercase:${level}} ${threadid} ${message} ${exception:format=tostring}"

    下面是错误输出到日志文件的示例:

    2018-08-07 06:37:46.3350 System.Net.Sockets ERROR 200 [16956] Exception in Socket#8977203::Connect - An operation was attempted on something that is not a socket 23.96.28.38:443.

    如何使我的布局包含 traceOutputOptions (在本例中,调用堆栈)

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rolf Kristensen Raúl Diego    6 年前

    没有人支持 traceOutputOptions 在里面 NLogTraceListener .

    相反,您只需将布局配置为包含 ${callsite} .

    例子:

    layout="${longdate} ${logger} ${uppercase:${level}} ${threadid} ${message} ${exception:format=tostring} ${callsite}"
    

    有关如何配置输出选项,请参见Wiki: https://github.com/NLog/NLog/wiki/Callsite-layout-renderer

        2
  •  0
  •   Julian    6 年前

    更新:

    一开始误解了你的问题。

    如果可能,应记录stacktrace,请参阅

    https://github.com/NLog/NLog/blob/f65cc2ace0ebbe60cc5839b2a0f5e9417d04797e/src/NLog/NLogTraceListener.cs#L443-L446

    如果这没有帮助,那么可以使用自定义的TraceListener保存您。

    1. 继承自 NLogTraceListener .
    2. 覆盖 ProcessLogEventInfo . 另见 original code of NLogTraceListener

    e、 克(C#)

     public class MyNLogTraceListener : NLogTraceListener
     {
         protected override void ProcessLogEventInfo(LogLevel logLevel, string loggerName, [Localizable(false)] string message, object[] arguments, int? eventId, TraceEventType? eventType, Guid? relatedActiviyId)
         {
             //copy of NLog
             loggerName = (loggerName ?? Name) ?? string.Empty;
    
             StackTrace stackTrace = null;
             int userFrameIndex = -1;
             if (AutoLoggerName)
             {
                 stackTrace = new StackTrace();
                 for (int i = 0; i < stackTrace.FrameCount; ++i)
                 {
                     var frame = stackTrace.GetFrame(i);
                     loggerName = Internal.StackTraceUsageUtils.LookupClassNameFromStackFrame(frame);
                     if (!string.IsNullOrEmpty(loggerName))
                     {
                         userFrameIndex = i;
                         break;
                     }
                 }
             }
    
             ILogger logger;
             if (LogFactory != null)
             {
                 logger = LogFactory.GetLogger(loggerName);
             }
             else
             {
                 logger = LogManager.GetLogger(loggerName);
             }
    
             logLevel = ForceLogLevel ?? logLevel;
             if (!logger.IsEnabled(logLevel))
             {
                 return; // We are done
             }
    
             var ev = new LogEventInfo();
             ev.LoggerName = loggerName;
             ev.Level = logLevel;
             if (eventType.HasValue)
             {
                 ev.Properties.Add("EventType", eventType.Value);
             }
    
             if (relatedActiviyId.HasValue)
             {
                 ev.Properties.Add("RelatedActivityID", relatedActiviyId.Value);
             }
    
             ev.Message = message;
             ev.Parameters = arguments;
             ev.Level = ForceLogLevel ?? logLevel;
    
             if (eventId.HasValue)
             {
                 ev.Properties.Add("EventID", eventId.Value);
             }
    
             if (stackTrace != null && userFrameIndex >= 0)
             {
                 ev.SetStackTrace(stackTrace, userFrameIndex);
             }
    
             //something here with base.TraceOutputOptions <-------------------- 
             /
    
    
             logger.Log(ev);
    
    
    
         }
     }
    

    用法:

    <sharedListeners>
          <add name="nlog" type="MyNameSpace.MyNLogTraceListener, MyDllName" traceOutputOptions="Callstack" />
    </sharedListeners>