我创建了一个使用NLog的Log File类,希望同时写入多个日志文件。这似乎工作正常,直到我添加变量混合。
更改变量似乎会更改日志文件的所有实例的变量设置,而不是我正在使用的特定实例。
以下是我编程的结构:
LogClass - 基本上是一个给我一些额外功能的包装器。 ' SetVariable'是我用来设置特定变量(称为dqwAlertName)
使用这个日志类,我传递了我想要使用的特定记录器:
Public iLogger as new Logger(NLog.LogManager.GetLogger("dataQualityWatcher"),True)
该语句使用" dataQualityWatcher"实例化日志记录类。记录器和设置Debug = True(我只是用它来允许更详细的日志记录,可以打开和关闭)。
说了......上面的陈述也是另一个类对象:
dataQualityWatcher Class - 这是一名观察者'被称为多次并连续运行。如果您熟悉FileSystemWatcher,它的工作方式与此类似。它基本上监视特定值的数据并引发事件。
在此类中,我使用以下代码实例化上述记录器:
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个日志文件:
这种情况发生了。但是,创建的最后一个dataQualityWatch对象将运行SetVariable方法=&#34; Test3&#34; (在这个例子中)。现在该变量已设置,所有3个Logger将开始记录到该文件(即Test3-DataQualityWatcher.log)。
我只能假设有一种更好的方法可以使用变量实现这一点,以便它们适用于特定日志实例的生命周期,但我似乎无法弄清楚它!
提前致谢并抱歉非常非常长的帖子。
答案 0 :(得分:1)
据我所知,您正在尝试使用一个目标登录多个文件。
这对于变量的使用效果不佳,因为它们是static
(VB.net中的Shared
) - 所以这不是线程安全的。
执行此操作的其他选项包括:
<rules>
或为每条消息传递额外的属性,并使用事件属性: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
编写一个子类,以减少它的冗长。或
创建目标&amp;以编程方式规则(在VB.NET中)。 See tutorial (in C#)
如果表现非常重要,请选择1或3。