带有多个日志文件的Nlog变量和日志文件问题

时间:2016-12-01 17:14:39

标签: vb.net nlog

我创建了一个使用NLog的Log File类,希望同时写入多个日志文件。这似乎工作正常,直到我添加变量混合。

问题

更改变量似乎会更改日志文件的所有实例的变量设置,而不是我正在使用的特定实例。

我的代码

以下是我编程的结构:

LogClass - 基本上是一个给我一些额外功能的包装器。 ' SetVariable'是我用来设置特定变量(称为dqwAlertName)

Logging Class

使用这个日志类,我传递了我想要使用的特定记录器:

Public iLogger as new Logger(NLog.LogManager.GetLogger("dataQualityWatcher"),True)

该语句使用" dataQualityWatcher"实例化日志记录类。记录器和设置Debug = True(我只是用它来允许更详细的日志记录,可以打开和关闭)。

说了......上面的陈述也是另一个类对象:

dataQualityWatcher Class - 这是一名观察者'被称为多次并连续运行。如果您熟悉FileSystemWatcher,它的工作方式与此类似。它基本上监视特定值的数据并引发事件。

dataQualityWatcher Class

在此类中,我使用以下代码实例化上述记录器:

Public iLogger as new Logger(NLog.LogManager.GetLogger("dataQualityWatcher"), True)

iLogger.SetVariable("dqwAlertName", _AlertName)

第一行实例化,第二行将设置变量。 Logging Class SetVariable方法非常基本:

Public Sub SetVariable(variableName as string, value as String)
    'Set variable context for the logger
    NLog.LogManager.Configuration.Variables(variableName) = value
End Sub

我正在以下列方式在NLog.config文件中使用该变量:

<variable name="LogLayout" value="[${date:format=MM/dd/yyyy h\:mm\:ss.fff tt}] [${gdc:item=location}]  |  ${level}  | ${message}" />
<variable name="InfoLayout" value="[${date:format=MM/dd/yyyy h\:mm\:ss.fff tt}] ${gdc:item=SoftwareName} Version ${gdc:item=SoftwareVersion}  -  ${message}" />
<variable name="DebugInfoLayout" value="[${date:format=MM/dd/yyyy h\:mm\:ss.fff tt}] ${message}" />
<variable name="logDir" value="C:/Log/PWTester/" />
<variable name="dqwAlertName" value="" />

<targets>
    <target name="dataQualityWatcher" xsi:type="File" fileName="${logDir}/LogFiles/${var:dqwAlertName}-DataQualityWatcher.log" layout="${LogLayout}" />
</targets>

<rules>
    <logger name="dataQualityWatcher" minlevel="Trace" writeTo="dataQualityWatcher" />
</rules>

问题:

我经营多名观察员&#39; (我称之为)用以下代码创建该对象并分配属性:

 dataWatch.Add(New dataQualityWatcher(True) With {.Tags = lstTags, .AlertTimerInterval = Convert.ToInt64(intTimerMilliseconds), .AlertGroupID = Convert.ToInt64(CARow(0)), .EmailGroupID = Convert.ToInt64(CARow(1)), .CustomSubject = CARow(3), .CustomMessage = CARow(4), .AlertName = DataAlertGroupName, .Debug = blnVerboseLogging, .HistorianServer = SH})

多个版本示例

我运行上面的代码:.AlertName = {&#34; Test1&#34;,&#34; Test2&#34;,&#34; Test3&#34;}。其他参数也会改变,每次都会实例化一个新对象。在此示例中,实例化了 3 dataQualityWatcher对象,它还实例化了 3个Logger对象

每次实现新的dataQualityWatcher对象时,它都会实例化一个Logger,然后写入该文件。 AlertName变量通过上面的SetVariable方法传递。

我希望写3个日志文件:

  1. 测试1-DataQualityWatcher.log
  2. 的Test2-DataQualityWatcher.log
  3. Test3的-DataQualityWatcher.log
  4. 这种情况发生了。但是,创建的最后一个dataQualityWatch对象将运行SetVariable方法=&#34; Test3&#34; (在这个例子中)。现在该变量已设置,所有3个Logger将开始记录到该文件(即Test3-DataQualityWatcher.log)。

    我只能假设有一种更好的方法可以使用变量实现这一点,以便它们适用于特定日志实例的生命周期,但我似乎无法弄清楚它!

    提前致谢并抱歉非常非常长的帖子。

1 个答案:

答案 0 :(得分:1)

据我所知,您正在尝试使用一个目标登录多个文件。

这对于变量的使用效果不佳,因为它们是static(VB.net中的Shared) - 所以这不是线程安全的。

执行此操作的其他选项包括:

  1. 在nlog.config中创建多个文件目标,并设置右<rules>
  2. 为每条消息传递额外的属性,并使用事件属性:fileName="${logDir}/LogFiles/${event-properties:dqwAlertName}-DataQualityWatcher.log",VB.NET调用:

    Dim theEvent As New LogEventInfo(LogLevel.Debug, "", "Pass my custom value")
    theEvent.Properties("MyValue") = "My custom string".
    

    您可以为Logger编写一个子类,以减少它的冗长。或

  3. 创建目标&amp;以编程方式规则(在VB.NET中)。 See tutorial (in C#)

  4. 如果表现非常重要,请选择1或3。