【问题标题】:'Vertical' logging with Nlog使用 Nlog 进行“垂直”日志记录
【发布时间】:2013-01-15 03:59:04
【问题描述】:

我们目前使用 NLog 作为我们的日志框架,它运行良好。我们想要添加的一项功能是能够在运行时强制记录单个对象,因此我们可以进行如下调用。

_logger.Trace(IForceLog obj, string msg)

接口在哪里:

public interface IForceLog
{
   bool ForceLog { get; }
}

如果日志记录级别为跟踪||obj.ForceLog,这将记录。 这些调用大部分来自对象内部,但也有一些来自处理它的其他调用。

我们的想法是我们有许多相同类型的对象,有时我们希望只查看一个对象的详细日志记录,并密切关注其行为而不会阻塞日志文件。

有没有标准的方法来处理这种事情?

【问题讨论】:

    标签: logging nlog


    【解决方案1】:

    我不知道这是否可以作为答案,但是您是否考虑过一种方法,每个对象都记录一个唯一的 id?这样,您可以使用 NLog 的过滤功能来限制日志记录的数量。这里有一个老例子:http://nlog-forum.1685105.n2.nabble.com/Config-examples-with-filters-td1685363.html

    从 NLog 论坛开始复制:

    为了完整起见(如果链接坏了),下面是内联示例:

    <?xml version="1.0" ?> 
    <nlog>
        <targets>
            <target name="console" type="Console" layout="${logger} ${message}" />
        </targets>
        <rules>
            <logger name="*" minlevel="Debug" writeTo="console">
                <filters>
                    <whenContains layout="${message}" substring="zzz" action="Ignore" />
                </filters>
            </logger>
        </rules>
    </nlog>
    

    此示例代码:

    using NLog; 
    using NLog.Targets; 
    using NLog.Targets.Wrappers; 
    
    class Example 
    { 
        static void Main(string[] args) 
        { 
            Logger logger = LogManager.GetLogger("Example"); 
            logger.Debug("log message"); 
            logger.Debug("log zzz message"); 
        } 
    } 
    

    只产生“示例日志消息”(第二条日志消息被过滤掉了

    或者,您可以使用称为条件的新功能(在最新快照中提供),它允许您使用简单的符号编写过滤器:

    <filters>
        <when condition="contains(message,'zzz') 
                  or level >= LogLevel.Warn 
                  or level == LogLevel.Trace" action="Ingore" /> 
    </filters>
    

    END 从 NLog 论坛复制

    这并不能直接回答您的问题(我认为这是执行某些日志记录语句,而不管配置的日志级别和使用的日志记录方法(信息、调试等)如何)。我怀疑很难覆盖/解决 NLog 的内置日志级别启用。

    如果 NLog 的过滤确实给了您想要的结果,那么记录到数据库怎么样?您可以记录所有内容,使用唯一 ID 标记某些对象的记录语句。然后,您可以使用数据库的过滤/分组/排序功能仅查看某些对象的日志记录语句。

    祝你好运!

    【讨论】:

      【解决方案2】:

      可以使用EventContext-Layout-Renderer  

      LogEventInfo theEvent = new LogEventInfo(LogLevel.Debug, "", obj.ToString());
        
      IForceLog supportsIForceLog = obj as IForceLog;
      If (supportsIForceLog!=null)
      {
          theEvent.Properties["ForceLog"] = supportsIForceLog.ForceLog;
      }
      
      log.Log(theEvent);
      

      并在您的 NLog.config 文件中使用 ${event-context:item="ForceLog"} 在过滤器/当条件下,如wageoghe answer 中所建议的那样

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多