使用 NLog 为特定类实例单独的日志文件
Posted
技术标签:
【中文标题】使用 NLog 为特定类实例单独的日志文件【英文标题】:Separate log file for specific class instance using NLog 【发布时间】:2015-09-28 23:34:21 【问题描述】:我需要为每个类实例编写事件日志以分隔文件。历史上项目使用 NLog 进行日志记录,所以我想尝试使用 NLog 解决这个问题(我找到了类似的主题 Unique log file for each instance of class,但建议使用 log4net)
目前我正在获取这样的记录器实例:
public static Logger GetInstanceLogger(string name, bool init = false)
if (!LogManager.Configuration.AllTargets.Any(t => t.Name == name))
var target = new FileTarget();
target.Name = name;
target.FileName = string.Format("logs/0.$shortdate.log", name);
target.Layout =
"$date:format=dd.MM.yyyy HH\\:mm\\:ss.fff thread[$threadid] $logger ($level:uppercase=true): $message. $exception:format=ToString";
var config = init ? new LoggingConfiguration() : LogManager.Configuration;
config.AddTarget(name, target);
var ruleInfo = new LoggingRule("*", LogLevel.Trace, target);
config.LoggingRules.Add(ruleInfo);
LogManager.Configuration = config;
LogManager.ReconfigExistingLoggers();
var logger = LogManager.GetLogger(name);
return logger;
现在它正在将相同的日志写入所有文件(我想这是由日志级别引起的)。有没有办法使用 NLog 完成这项任务?
谢谢。
【问题讨论】:
【参考方案1】:我提出了在文件名中使用布局渲染器的事件属性的解决方案。当我编写新消息以记录时,我将文件名添加为 LogEventInfo 的属性
protected virtual void SendEvent(LogLevel level, string message, Exception exception, string memberName = null)
var logEvent = new LogEventInfo(level, _name, message);
logEvent.Exception = exception;
foreach (String key in _properties.Keys)
logEvent.Properties[key] = _properties[key];
_logger.Log(logEvent);
并且在 NLog 目标部分的配置文件中:
<targets async="true">
<target xsi:type="File" name="f" fileName="$basedir/logs/$shortdate_$event-properties:item=Name.log"
layout="$detailedLayout" />
<target xsi:type="File" name="errorLogFile" fileName="$basedir/logs/$shortdate.ERROR_$event-properties:item=Name.log"
layout="$detailedLayout" />
</targets>
【讨论】:
【参考方案2】:try var ruleInfo = new LoggingRule(name, LogLevel.Trace, target);
【讨论】:
以上是关于使用 NLog 为特定类实例单独的日志文件的主要内容,如果未能解决你的问题,请参考以下文章