使用Nlog进行“垂直”记录

时间:2013-01-15 03:59:04

标签: logging nlog

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

_logger.Trace(IForceLog obj, string msg)

界面为:

public interface IForceLog
{
   bool ForceLog { get; }
}

如果日志记录级别位于跟踪|| obj.ForceLog,则会记录此日志。 大多数这些调用都来自对象内部,但有些调用来自处理它的其他调用。

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

有没有一种标准的方法可以解决这类问题?

2 个答案:

答案 0 :(得分: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>

从NLog论坛结束复制

这并没有直接回答你的问题(我认为是执行某些日志记录语句,无论配置的日志级别如何,也不管使用的日志记录方法(Info,Debug等)如何)。我怀疑覆盖/解决NLog的内置日志级别启用是很困难的。

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

祝你好运!

答案 1 :(得分: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”},如wageoghe answer

中所述