1

在线是否有上下文信息列表(即 ${longdate}、${level}、${message})?我想将日志文件设置在用户的 AppData\Local 文件夹中。可能是 ${appdatalocal} 吗?我将如何访问要作为电子邮件附件发送的文件
message.Attachments.Add("${appdatalocal}\somefolder\Application.log")

4

1 回答 1

2

有关NLog 支持的 LayoutRenderer 列表,请参阅此链接。请注意,其中一些布局渲染器已添加到 NLog 2.0(9 月刚刚作为测试版发布)。有一些 LayoutRenderer 可以让您指定“特殊”文件夹(如我的文档、我的音乐等)。还有一个 LayoutRenderer 可以检索环境变量的值。您可以使用 LayoutRenderers 来定义文件名:

${basedir}/${shortdate}.log

或者

${environment:variable=TEMP}/${processname}.log

至于以编程方式访问生成的文件名,我不知道该怎么做,尽管我确实有一个想法......

您可以使用与用于定义文件名的布局相同的布局来配置 MethodCallTarget(请参阅上面链接中的文档 - 或者,更好的是,请参阅 NLog 帮助文件)。在记录到该目标的 NLog.config 文件(或 app.config,如果您配置内联)中定义单个记录器规则。编写将由 MethodCallTarget 调用的静态方法 LogMethod。在返回字符串的同一个类上编写另一个静态方法 GetFilename。GetFilename 只是使用配置为写入 MethodCallTarget 的记录器记录一条消息。NLog 调用 LogMethod。在 LogMethod 内部,您将收到完全格式化的消息。由于您将布局配置为与文件名布局相同(即仅计算文件名所需的参数),记录的消息的值应该是文件的路径。由于 LogMethod 必须是静态方法(NLog 要求),因此您没有太多选择“文件名”的存储位置。我只是放入了一个静态字符串变量。

像这样(基于 MethodCallTarget 下的 NLog 帮助文件中的示例):

public class Example
{
  private static filename;

  //
  // This is the method that NLog will call when you log with the logger that is configured
  // to write to the MethodCallTarget
  //
  public static void LogMethod(string level, string message)
  {
    filename = message;
  }

  public static string GetLogFile()
  {
    Logger logger = LogManager.GetLogger("filenamelogger");
    filenamelogger.Info("logging a message just to get the result");
    return filename;
  }
}

配置如下:

  <variable fn="${basedir}/${processname}.log" />
  <targets> 
    <target name="m" xsi:type="MethodCall" className="Example, MethodCall" 
            methodName="LogMethod"> 
      <parameter layout=${fn} /> 
    </target> 
    <target name="f" xsi:type="File"
            layout="${longdate} ${loggername} ${level} ${message}" 
            fileName="${fn}">
    </target>
  </targets> 
  <rules> 
    <logger name="filenamelogger" minlevel="Debug" writeTo="m" final="true" /> 
    <logger name="*" minlevel="Debug" writeTo="f" />
  </rules> 

显然这不是线程安全的,但它确实显示了一种获取布局结果的方法。

于 2010-10-27T22:16:40.280 回答