【问题标题】:How to log each instance of a Class into different files with Nlog?如何使用 Nlog 将 Class 的每个实例记录到不同的文件中?
【发布时间】:2015-07-08 15:43:57
【问题描述】:

我有一个项目要同时测试八台相同的设备。我需要能够为每台设备写入日志。我还需要另一个包含系统日志消息的日志文件。过去我已经编写了自己的日志记录,但想尝试 Nlog。我写了一个简单的测试,看看这是否可行,但我没有取得太大的成功。我想做的是让TempObject 的每个实例都登录到它自己的文件中。目前以下代码会登录到每个日志文件中:

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">

  <targets>
    <target name="logfile" xsi:type="File" fileName="logfile.txt" />
    <target name="myObj1" xsi:type="File" fileName="myObj1.txt" />
    <target name="myObj2" xsi:type="File" fileName="myObj2.txt" />
    <target name="myObj3" xsi:type="File" fileName="myObj3.txt" />
    <target name="myObj4" xsi:type="File" fileName="myObj4.txt" />
    <target name="console" xsi:type="Console" />
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile" />
    <logger name="*" minlevel="Info" writeTo="myObj1" />
    <logger name="*" minlevel="Info" writeTo="myObj2" />
    <logger name="*" minlevel="Info" writeTo="myObj3" />
    <logger name="*" minlevel="Info" writeTo="myObj4" />
    <logger name="*" minlevel="Info" writeTo="console" />
  </rules>
</nlog>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
  private static Logger logger = LogManager.GetCurrentClassLogger();

  private TempObject myObj1 = new TempObject(1);
  private TempObject myObj2 = new TempObject(2);
  private TempObject myObj3 = new TempObject(3);
  private TempObject myObj4 = new TempObject(4);

  public MainWindow()
  {
    InitializeComponent();
    logger.Info("this is the first log message");        
    myObj1.LogMessage();
    myObj2.LogMessage();
    myObj3.LogMessage();
    myObj4.LogMessage();
    SetUpDisplay();
  }
}

TempObject.cs

public class TempObject
{
  private int myUUT;

  private static Logger logger = LogManager.GetCurrentClassLogger();

  public TempObject(int uutNumber)
  {
    myUUT = uutNumber;
  }

  public void LogMessage()
  {
    logger.Info("UUT" + myUUT);
  }
}

【问题讨论】:

  • 您能否澄清一下 - 使用您提供的当前代码,所有实例都登录到同一个日志文件中。
  • 当前对于每个 TempObject 实例调用 logger.Info("UUT" + myUUT);将登录到以下每个日志文件:logfile、myObj1、myObj2、myObj3 myObj4。我希望 TempObject 的 myObj1 实例仅登录到 myObj1 日志文件,TempObject 的 myObj2 实例仅登录到 myObj2 日志文件,TempObject 的 myObj3 实例仅登录到 myObj3 日志文件,TempObject 的 myObj4 实例仅登录到 myObj4 日志文件.
  • 嗯。由于 Nlog 仅在配置中正确设置文件名,因此这可能很乏味。您可以在更改目标后使用 Nlog 的 ReconfigExistingLoggers,但是每次有日志语句时都必须调用它(但这是在运行时出于错误原因操作配置文件)

标签: c# wpf nlog


【解决方案1】:

我必须在 TempObject 中更改以下内容,它可以工作。

public class TempObject
{
  private int myUUT;

  private Logger myLogger;

  public TempObject(int uutNumber)
  {
    myUUT = uutNumber;
    string logString = "myObj" + myUUT;
    myLogger = LogManager.GetLogger(logString);
  }

  public void LogMessage(string msg)
  {
    myLogger.Info("UUT" + myUUT+ "|" + msg);
  }
}

和配置文件的规则部分:

<rules>
  <logger name="*" minlevel="Info" writeTo="logfile" />
  <logger name="myObj1" minlevel="Info" writeTo="myObj1" />
  <logger name="myObj2" minlevel="Info" writeTo="myObj2" />
  <logger name="myObj3" minlevel="Info" writeTo="myObj3" />
  <logger name="myObj4" minlevel="Info" writeTo="myObj4" />
  <logger name="*" minlevel="Info" writeTo="console" />
</rules>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2015-02-21
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2011-12-16
    相关资源
    最近更新 更多