2

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

_logger.Trace(IForceLog obj, string msg)

接口在哪里:

public interface IForceLog
{
   bool ForceLog { get; }
}

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

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

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

4

2 回答 2

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 标记某些对象的记录语句。然后,您可以使用数据库的过滤/分组/排序功能仅查看某些对象的日志记录语句。

祝你好运!

于 2013-01-18T18:29:35.413 回答
0

可以使用 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"} 在 filter/when 条件下,如wagooghe answer中所建议的那样

于 2013-07-20T23:58:22.407 回答