使用 NLog 记录到可用驱动器?

Eri*_*k Z 5 configuration nlog

是否可以将 NLog 配置为如果 d: 存在则将日志写入 d:\logs,如果 d: 不存在则将日志写入 c:\logs?

wag*_*ghe 4

我认为您可以结合使用自定义 LayoutRenderer 和 XML 配置来完成此任务。在 XML 配置中,您可以使用 LayoutRenderers 来指定文件名。例如:

<target name="logfile" xsi:type="File" fileName="${basedir}/${shortdate}.log" />
Run Code Online (Sandbox Code Playgroud)

FileTarget 对象将根据${basedir}和${shortdate}布局渲染器的值创建一个文件。

您可以轻松编写自定义 LayoutRenderer,也许将其称为“FindAvailableDrive”,并像这样配置它:

<target name="logfile" xsi:type="File" fileName="${FindAvailableDrive}/logs/${shortdate}.log" />
Run Code Online (Sandbox Code Playgroud)

FindAvailableDrive LayoutRender 可以以驱动器盘符(如“C:”​​)开头,然后进行更改,直到找到有效的驱动器。更进一步,FindAvailableDrive 可以采用一个或多个参数来帮助定义如何搜索有效驱动器:

<target name="logfile" xsi:type="File" fileName="${FindAvailableDrive:Drives=DC}/logs/${shortdate}.log" />
Run Code Online (Sandbox Code Playgroud)

在本例中,FindAvailableDrive 将先检查驱动器 D,然后检查驱动器 C。

下面是一个如何编写此类 LayoutRenderer 的示例(未经测试)(请注意,这是基于我针对 NLog 1.0 编写的现有 LayoutRender,因此其中一些对于 NLog 2.0 可能不是必需的(或有效的):

  [LayoutRenderer("FindAvailableDrive")]
  class FindAvailableDriveLayoutRenderer : LayoutRenderer
  {
    private string validDrive;

    [DefaultParameter]
    public string DriveCandidates { get; set; }

    protected override void Append(StringBuilder builder, LogEventInfo logEvent)
    {
      builder.Append(FindValidDrive());
    }

    protected override int GetEstimatedBufferSize(LogEventInfo logEvent)
    {
      return 2;
    }

    private string FindValidDrive()
    {
      if (!String.IsNullOrEmpty(validDrive)) return validDrive;

      if (String.IsNullOrEmpty(DriveCandidates))
      {
        if (Directory.Exists("C:"))
          validDrive = "C:";
        else
        if (Directory.Exists("D:"))
          validDrive = "D:";
        //And so on if you want to continue to check for valid drives.
        return validDrive;
      }

      validDrive = DriveCandidates.Select(c => string.Format("{0}:", c).Where(d => Directory.Exists(d)).FirstOrDefault();

      //What to do if no drives exists?

      return validDrive;
    }
  }
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看我对另一个问题的回答,了解有关如何在 NLog 中编写和使用自定义 LayoutRenderer 的更多信息。