Eri*_*k Z 5 configuration nlog
是否可以将 NLog 配置为如果 d: 存在则将日志写入 d:\logs,如果 d: 不存在则将日志写入 c:\logs?
我认为您可以结合使用自定义 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 的更多信息。
| 归档时间: |
|
| 查看次数: |
1210 次 |
| 最近记录: |