我试图将我的日志存储到网络中的驱动器中。我写了一个nlog扩展模块:
module NLogExtension
open System.Text
open NLog
open NLog.LayoutRenderers
open NLog.Config
open System.IO
[<LayoutRenderer("FindAvailableDrive")>]
type FindAvailableDriveLayoutRenderer() =
inherit LayoutRenderer()
let mutable validDrive = ""
[<DefaultParameter>]
member val DriveCandidates = "" with get, set
member private x.findValidDrive(): string =
if x.DriveCandidates = null || x.DriveCandidates = ""
then
if Directory.Exists("V:")
then validDrive <- "V:"
else validDrive <- "S:"
else validDrive <- "S:"
validDrive
override x.Append(builder: StringBuilder, logEvent: LogEventInfo) = builder.Append(x.findValidDrive(): string) |> ignore
这将存储在V:或S:如果V不存在。
这是App.config文件中的nlog部分:
<nlog
xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<extensions>
<add assembly="Solk.NLogExtension" />
</extensions>
<targets>
<target name="logfile" xsi:type="File" fileName="logfile.txt" />
<target name="indexCheckLog"
xsi:type="File"
fileName="${FindAvailableDrive}/logs/indexChecklog.txt"
layout="${callsite} - ${message}"
archiveFileName="${FindAvailableDrive}/logs/archives/log.info.${shortdate}.txt"
archiveEvery="Day"
archiveNumbering = "Rolling"
maxArchiveFiles="7"
concurrentWrites="false"
/>
<target name="console" xsi:type="Console" />
</targets>
<rules>
<logger name="indexCheckLogger" minlevel="Trace" writeTo="indexCheckLog" final="true"/>
<logger name="*" minlevel="Trace" writeTo="logfile" />
<logger name="*" minlevel="Info" writeTo="console" />
</rules>
</nlog>
我关注的目标是indexCheckLog。如您所见,当前日志和存档都使用扩展名${FindAvailableDrive}
。您可以看到我使用程序集Solk.NLogExtension
在文件顶部添加了扩展标记(Solk是程序集标题和项目名称,NLogExtension是模块的名称,可以在扩展模块的第一行中看到)
但是,这些文件夹中没有单个日志。不在V或S中。不确定我做错了什么,没有抛出任何异常或任何正在发生的事情的迹象。