我如何使用 Nlog 通过在运行时使用值来创建具有不同名称的文件?
how can i use Nlog to create files with different name by using the values at runtime?
我有一个案例,我需要为进入我系统的不同类型的数据创建单独的文件,我想使用 NLog 来确保每个事件类型都存储在它自己的事件类型文件中。例如
对于事件 a、b、c、a,我希望所有 a 事件都记录在名称为 a.txt 的文件中,所有 b 事件都记录在文件 b.txt.
中
C#代码
string[] events= { "a", "b", "c", "a" };
foreach(string et in events)
{
NLog.LogManager.Configuration.Variables["filename"] = et ;
LogManager.ReconfigExistingLoggers();
logger.Warn(filename);
}
这是我的Nlog.config
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name ="filename" value="test"></variable>
<targets>
<target name="logfile" xsi:type="File" filename="${filename}.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>
</nlog>
您可以定义匹配事件类型并写入不同文件的规则。
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" filename="log.txt" />
<target name="log_a" xsi:type="File" filename="a.txt" />
<target name="log_b" xsi:type="File" filename="b.txt" />
<target name="log_c" xsi:type="File" filename="c.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logconsole" />
<!-- now add overrides for the log sources you want written to separate files -->
<!-- order of the rules is important, because we're setting final = True -->
<logger name="a" minlevel="Debug" writeTo="log_a" final="True"/>
<logger name="b" minlevel="Debug" writeTo="log_b" final="True"/>
<logger name="c" minlevel="Debug" writeTo="log_c" final="True"/>
<!-- anything not matched above will go to the general log file -->
<logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>
</nlog>
希望对您有所帮助。你也可以用代码做同样的事情:
var config = new NLog.Config.LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget()
{
Name = "logfile",
FileName = "logfile.txt"
}
var logconsole = new NLog.Targets.ColoredConsoleTarget() {
Name = "logconsole"
// other options here..
};
config.AddTarget(logconsole);
config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logconsole, "*");
foreach (var et in events) {
var target = new NLog.Targets.FileTarget() {
Name = "log_" + et,
FileName = et + ".txt"
};
config.AddTarget(target);
config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, target, et, final: true);
}
config.AddTarget(logfile);
config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logfile, "*");
NLog.LogManager.Configuration = config;
我从未尝试过,但也许您可以在运行时多次更新配置,因为您会发现要添加的新事件。试试看。
您不应使用全局 NLog 配置变量来传输本地上下文。相反,您应该使用推荐的方法来处理 NLog 中的上下文:
https://github.com/NLog/NLog/wiki/Context
例如,您可以为您拥有的每个事件类型创建一个 Logger 对象:
var loggerA = NLog.LogManager.GetLogger("a");
loggerA.Info("Hello from a");
loggerA.Info("Goodbye from a");
var loggerB = NLog.LogManager.GetLogger("b");
loggerB.Info("Hello from b");
loggerB.Info("Goodbye from b");
并在 NLog FileTarget FileName 中使用 ${logger}
:
<target name="logfile" xsi:type="File" filename="${logger}.txt" />
您还可以使用 Logger.WithProperty 将自定义 属性 添加到您的记录器,并将该记录器用于您的所有事件:
var loggerPropA = NLog.LogManager.GetCurrentClassLogger().WithProperty("EventType", "a");
loggerPropA.Info("Hello from a");
loggerPropA.Info("Goodbye from a");
var loggerPropB = NLog.LogManager.GetCurrentClassLogger().WithProperty("EventType", "b");
loggerPropB.Info("Hello from b");
loggerPropB.Info("Goodbye from b");
并在 NLog FileTarget FileName 中使用 ${event-properties:EventType}
:
<target name="logfile" xsi:type="File" filename="${event-properties:EventType:whenEmpty=App}.txt" />
根据您拥有的活动事件类型数量(2 或 200)及其生命周期(2 分钟或 2 天),您可能需要研究这些 NLog FileTarget 选项:
- openFileCacheTimeout
- 打开文件缓存大小
我有一个案例,我需要为进入我系统的不同类型的数据创建单独的文件,我想使用 NLog 来确保每个事件类型都存储在它自己的事件类型文件中。例如 对于事件 a、b、c、a,我希望所有 a 事件都记录在名称为 a.txt 的文件中,所有 b 事件都记录在文件 b.txt.
中C#代码
string[] events= { "a", "b", "c", "a" };
foreach(string et in events)
{
NLog.LogManager.Configuration.Variables["filename"] = et ;
LogManager.ReconfigExistingLoggers();
logger.Warn(filename);
}
这是我的Nlog.config
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name ="filename" value="test"></variable>
<targets>
<target name="logfile" xsi:type="File" filename="${filename}.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>
</nlog>
您可以定义匹配事件类型并写入不同文件的规则。
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" filename="log.txt" />
<target name="log_a" xsi:type="File" filename="a.txt" />
<target name="log_b" xsi:type="File" filename="b.txt" />
<target name="log_c" xsi:type="File" filename="c.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logconsole" />
<!-- now add overrides for the log sources you want written to separate files -->
<!-- order of the rules is important, because we're setting final = True -->
<logger name="a" minlevel="Debug" writeTo="log_a" final="True"/>
<logger name="b" minlevel="Debug" writeTo="log_b" final="True"/>
<logger name="c" minlevel="Debug" writeTo="log_c" final="True"/>
<!-- anything not matched above will go to the general log file -->
<logger name="*" minlevel="Debug" writeTo="logfile" />
</rules>
</nlog>
希望对您有所帮助。你也可以用代码做同样的事情:
var config = new NLog.Config.LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget()
{
Name = "logfile",
FileName = "logfile.txt"
}
var logconsole = new NLog.Targets.ColoredConsoleTarget() {
Name = "logconsole"
// other options here..
};
config.AddTarget(logconsole);
config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logconsole, "*");
foreach (var et in events) {
var target = new NLog.Targets.FileTarget() {
Name = "log_" + et,
FileName = et + ".txt"
};
config.AddTarget(target);
config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, target, et, final: true);
}
config.AddTarget(logfile);
config.AddRule(NLog.LogLevel.Debug, NLog.LogLevel.Fatal, logfile, "*");
NLog.LogManager.Configuration = config;
我从未尝试过,但也许您可以在运行时多次更新配置,因为您会发现要添加的新事件。试试看。
您不应使用全局 NLog 配置变量来传输本地上下文。相反,您应该使用推荐的方法来处理 NLog 中的上下文:
https://github.com/NLog/NLog/wiki/Context
例如,您可以为您拥有的每个事件类型创建一个 Logger 对象:
var loggerA = NLog.LogManager.GetLogger("a");
loggerA.Info("Hello from a");
loggerA.Info("Goodbye from a");
var loggerB = NLog.LogManager.GetLogger("b");
loggerB.Info("Hello from b");
loggerB.Info("Goodbye from b");
并在 NLog FileTarget FileName 中使用 ${logger}
:
<target name="logfile" xsi:type="File" filename="${logger}.txt" />
您还可以使用 Logger.WithProperty 将自定义 属性 添加到您的记录器,并将该记录器用于您的所有事件:
var loggerPropA = NLog.LogManager.GetCurrentClassLogger().WithProperty("EventType", "a");
loggerPropA.Info("Hello from a");
loggerPropA.Info("Goodbye from a");
var loggerPropB = NLog.LogManager.GetCurrentClassLogger().WithProperty("EventType", "b");
loggerPropB.Info("Hello from b");
loggerPropB.Info("Goodbye from b");
并在 NLog FileTarget FileName 中使用 ${event-properties:EventType}
:
<target name="logfile" xsi:type="File" filename="${event-properties:EventType:whenEmpty=App}.txt" />
根据您拥有的活动事件类型数量(2 或 200)及其生命周期(2 分钟或 2 天),您可能需要研究这些 NLog FileTarget 选项:
- openFileCacheTimeout
- 打开文件缓存大小