.net app.config文件中的上下文信息

.net app.config文件中的上下文信息,.net,email,app-config,nlog,.net,Email,App Config,Nlog,是否有联机上下文信息列表(即${longdate}、${level}、${message})?我想在用户的AppData\Local文件夹中设置日志文件。可能是${appdatalocal}吗?我将如何访问文件以作为电子邮件附件发送,可能类似于 message.Attachments.Add(“${appdatalocal}\somefolder\Application.log”)?有关NLog支持的LayoutRenderer列表,请参见此。请注意,其中一些布局渲染器已添加到NLog 2.0中

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

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

${basedir}/${shortdate}.log

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

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

类似这样的内容(基于MethodCallTarget下NLog帮助文件中的示例):

配置如下内容:

  <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> 


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

Hmm,我不太清楚这与
app.config
文件的关系;也许你可以详细说明或重新措辞?您是说要在
app.config
中使用环境变量吗?也许我就是不明白这个问题。如果您想从
app.config
访问值,请使用
ConfigurationManager.AppSettings
,但我不确定这是否是您想要的。
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>