我们目前使用NLog作为我们的日志框架,并且它运行良好。我们想要添加的一个功能是能够在运行时强制记录单个对象,因此我们可以进行如下调用。
_logger.Trace(IForceLog obj, string msg)
界面为:
public interface IForceLog
{
bool ForceLog { get; }
}
如果日志记录级别位于跟踪||
obj.ForceLog,则会记录此日志。
大多数这些调用都来自对象内部,但有些调用来自处理它的其他调用。
我们的想法是,我们有许多相同类型的对象,有时我们希望只查看一个详细的日志记录,并密切关注其行为,而不会阻塞日志文件。
有没有一种标准的方法可以解决这类问题?
答案 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
中所述