C# - NLog 为同一调用记录多行
C# - NLog logs multiple lines for the same call
我开始使用 NLog,我想将每一行记录到一个日志文件和一个控制台中以用于调试目的。
当我尝试记录每个日志操作时,在控制台和日志文件中都会打印 2-3 次,而不是在每个目标中打印一次。
我在 NLog.config 文件中配置了 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="C:\Users\user\source\repos\TaskSchedulerConsole\Log.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Info" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Warn" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Error" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Fatal" writeTo="logfile, logconsole" />
</rules>
</nlog>
在每个 class 中我创建了一个静态记录器:
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
三重日志记录示例:
Program.cs:
try
{
Logger.Info("Program Started.");
}
catch(Exception ex)
{
Logger.Info(ex, "Something went wrong...");
}
finally
{
Logger.Info("Program Finished.");
NLog.LogManager.Shutdown();
}
控制台和日志文件中的输出:
2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.
在此先感谢大家,希望有人能帮助我理解问题。
这是正确的行为。
您为 NLog.config 配置了六个规则,这六个规则中的三个将在您的代码中触发。 (Trace/Debug/Info)
<logger name="*" minlevel="Trace" writeTo="logfile" />
<logger name="*" minlevel="Trace" writeTo="logconsole" />
应该足以记录每个级别条目一次
问题是您多次添加记录器,例如
<logger name="*" minlevel="Trace" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile, logconsole" />
添加两个记录器:一个用于从 Trace
开始的所有事件,第二个用于从 Debug
级别开始的所有级别。
1.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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<variable name="myvar" value="myvalue"/>
<targets>
<target name="logfile" xsi:type="File" fileName="log-dest\Log.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile, logconsole" />
</rules>
</nlog>
2.program.cs
class Program
{
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
try
{
Logger.Info("Program Started.");
}
catch (Exception ex)
{
Logger.Error(ex, "Something went wrong...");
}
finally
{
Logger.Info("Program Finished.");
NLog.LogManager.Shutdown();
}
}
}
3.result
我开始使用 NLog,我想将每一行记录到一个日志文件和一个控制台中以用于调试目的。 当我尝试记录每个日志操作时,在控制台和日志文件中都会打印 2-3 次,而不是在每个目标中打印一次。
我在 NLog.config 文件中配置了 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="C:\Users\user\source\repos\TaskSchedulerConsole\Log.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Info" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Warn" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Error" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Fatal" writeTo="logfile, logconsole" />
</rules>
</nlog>
在每个 class 中我创建了一个静态记录器:
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
三重日志记录示例: Program.cs:
try
{
Logger.Info("Program Started.");
}
catch(Exception ex)
{
Logger.Info(ex, "Something went wrong...");
}
finally
{
Logger.Info("Program Finished.");
NLog.LogManager.Shutdown();
}
控制台和日志文件中的输出:
2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.7542|INFO|TaskSchedulerConsole.Program|Program Started.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.
2020-05-14 11:49:44.8315|INFO|TaskSchedulerConsole.Program|Program Finished.
在此先感谢大家,希望有人能帮助我理解问题。
这是正确的行为。
您为 NLog.config 配置了六个规则,这六个规则中的三个将在您的代码中触发。 (Trace/Debug/Info)
<logger name="*" minlevel="Trace" writeTo="logfile" />
<logger name="*" minlevel="Trace" writeTo="logconsole" />
应该足以记录每个级别条目一次
问题是您多次添加记录器,例如
<logger name="*" minlevel="Trace" writeTo="logfile, logconsole" />
<logger name="*" minlevel="Debug" writeTo="logfile, logconsole" />
添加两个记录器:一个用于从 Trace
开始的所有事件,第二个用于从 Debug
级别开始的所有级别。
1.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"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<variable name="myvar" value="myvalue"/>
<targets>
<target name="logfile" xsi:type="File" fileName="log-dest\Log.txt" />
<target name="logconsole" xsi:type="Console" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile, logconsole" />
</rules>
</nlog>
2.program.cs
class Program
{
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
try
{
Logger.Info("Program Started.");
}
catch (Exception ex)
{
Logger.Error(ex, "Something went wrong...");
}
finally
{
Logger.Info("Program Finished.");
NLog.LogManager.Shutdown();
}
}
}
3.result