前言
在使用nlog 记录日志时,需要在配置文件传递许多通用的参数,比如人员信息,IP,端口等等这些常用且通用的参数,但是又不想去每次记录日志时都去传递这些参数。
因此可以把他设置为nlog的全局变量,在配置文件中仅仅只需要将需要记录的信息使用 ${username} 这样的方式来直接使用
新增全局变量注入类
public class NKLayoutRenderer
{
/// <summary>
/// 注册Nlog全局变量
/// </summary>
public static void RegisterLogGlobalParameters()
{
// 获取当前程序集中所有类型
var allTypes = Assembly.GetExecutingAssembly().GetTypes().ToList();
// 获取当前命名空间名称
var currentNamespace = typeof(NKLayoutRenderer).Namespace;
// 查找带有指定标签的类
var matchingTypes = allTypes.Where(t => t.Namespace == currentNamespace && t.GetCustomAttributes(typeof(LayoutRendererAttribute), true).Length > 0)
.ToList();
foreach (var type in matchingTypes)
{
//创建对应实例
var layoutRenderer = Activator.CreateInstance(type);
//获取标签中的参数
var attribute = type.GetCustomAttribute<LayoutRendererAttribute>();
//获取LayoutRenderer中注册全局变量的方法
var methodInfo = typeof(LayoutRenderer).GetMethod("Register", new Type[] { typeof(string) });
// 创建泛型类型参数数组
var typeArguments = new Type[] { type };
// 为泛型方法提供类型参数
var genericMethod = methodInfo.MakeGenericMethod(typeArguments);
// 调用泛型方法,注册日志全局变量
genericMethod.Invoke(layoutRenderer, new object[]
{
attribute.Name
});
}
}
}
//日志记录地址
[LayoutRenderer("LogRootPath")]
public class LogRootPathLayoutRenderer : LayoutRenderer
{
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
var path = GlobalContext.SystemConfig.LogRootPath ?? "/app/log/";
builder.Append(path);
}
}
//用户名
[LayoutRenderer("UserName")]
public class UserNameLayoutRenderer : LayoutRenderer
{
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
var user = GlobalContext.ServiceProvider.GetCurrentUser();
builder.Append(user?.Name);
}
}
}
根据自身项目,修改和扩展需要传递的参数,一般只传递通用参数
然后在去注入一下
/// <summary>
/// 注册Nlog全局变量
/// </summary>
/// <param name="services"></param>
/// <returns></returns>
public static IServiceCollection AddNLogLayoutRenderer(this IServiceCollection services)
{
NKLayoutRenderer.RegisterLogGlobalParameters();
return services;
}
完成后,在nlog 配置文件中就可以直接使用 ${UserName}和${LogRootPath}
那么如何单独传递某一个参数呢?假设,我需要记录一个登录日志,需要传递一个登录名,和密码。
这个登录名仅仅只在登录日志中使用到了,所以就不建议做成全局的,只需要在记录登录日志的地方,单独的将登录名传递给nlog
//单独设置某一个参数
LogManager.Configuration.Variables["LoginName"] ="张三";
然后,配置文件中需要通过${var:LoginName} 来获取对应的参数
类似于这样
如果是LogManager 的配置为空或者报错,请先检查你的nlog 是否成功注册,上述例子。必须在nlog 注册之后才能正常使用。
也就是下边这段代码之后
//加载nlog 配置文件
LogManager.LoadConfiguration("nlog配置文件地址");