在线是否有上下文信息列表(即$ {longdate},$ {level},$ {message})?我想将日志文件设置在用户的AppData \ Local文件夹中。它可能是$ {appdatalocal}吗?我如何访问要作为电子邮件附件发送的文件可能像
message.Attachments.Add("${appdatalocal}\somefolder\Application.log")
?
答案 0 :(得分:2)
请参阅此link以获取NLog支持的LayoutRenderer列表。请注意,其中一些布局渲染器已添加到NLog 2.0中(它在9月刚刚发布为测试版)。有一些LayoutRenderers允许您指定“特殊”文件夹(如我的文档,我的音乐等)。还有一个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要求),因此在存储“filename”的地方没有太多选择。我只是输入一个静态字符串变量。
这样的事情(根据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>
显然这不是线程安全的,但它确实显示了获取布局结果的方法。