0x00 前言
上周元旦之前项目要求nlog自定义记录,要区分文件夹/文件名称做区分,这周就来看看。
基于nlog实现自定义目录、文件名(其实就是动态变量传参)
0x01 环境配置
1、xml配置,项目目录下,文件名为nlog.conifg(自动寻找配置,记得修改属性为始终复制)
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true"
internalLogLevel="Warn"
internalLogFile="internal-nlog.txt">
<!--define various log targets-->
<targets>
<!--自定义日志-->
<target xsi:type="File" name="CustArgsLog" fileName="logs/CustLog/${scopeproperty:item=custArgs1}/${scopeproperty:item=custArgs2}/sync_${scopeproperty:item=custArgs3}.log"
layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
</targets>
<rules>
<!--All logs, including from Microsoft-->
<logger name="CustLog" minlevel="Trace" writeTo="CustArgsLog"/>
</rules>
</nlog>
2、项目配置
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="5.2.8" />
</ItemGroup>
</Project>
0x02 代码编写,测试demo
public static void Main()
{
var r = Enumerable.Range(1, 10).Select(x => Task.Run(TaskRun)).ToArray();
Task.WaitAll(r);
foreach (var item in Enumerable.Range(1, 10))
{
TaskRun();
}
Console.WriteLine();
Console.WriteLine($"任务结束=================主线程ID为{Environment.CurrentManagedThreadId}");
}
public static void TaskRun()
{
Thread.Sleep(1000);
var log = NLog.LogManager.GetLogger("CustLog");
var threedId = Environment.CurrentManagedThreadId;
//线程ID分目录1
NLog.ScopeContext.PushProperty("custArgs1", $"这是参数1-线程ID为{threedId}");
//1、2、3的目录2
NLog.ScopeContext.PushProperty("custArgs2", Random.Shared.Next(1, 4));
//0或1的文件
NLog.ScopeContext.PushProperty("custArgs3", DateTime.Now.Ticks % 2);
log.Info($"测试log内容,打印时间{DateTime.Now}");
NLog.ScopeContext.Clear();
}
代码运行结果
备注:ScopeContext上下文是基于线程AsyncLocal(可在不同方法作用域增加参数,最终打印时能拿到线程中所有的参数),如果是主线程请用完随手清空;日期类型建议手动转换成字符串;
0x03 参考地址
1、Nlog Context
Context · NLog/NLog Wiki (github.com)
2、Nlog配置文件通用变量