使用 NLog 为特定 class 实例单独记录文件
Separate log file for specific class instance using NLog
我需要将 class 的每个实例的事件日志写入单独的文件。历史上项目使用 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 完成此任务?
谢谢。
try var ruleInfo = new LoggingRule(name, LogLevel.Trace, target);
我在文件名中使用布局渲染器的事件属性提出了解决方案。当我写新消息记录时,我将文件名添加为 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>
我需要将 class 的每个实例的事件日志写入单独的文件。历史上项目使用 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 完成此任务?
谢谢。
try var ruleInfo = new LoggingRule(name, LogLevel.Trace, target);
我在文件名中使用布局渲染器的事件属性提出了解决方案。当我写新消息记录时,我将文件名添加为 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>