菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

nlog 设置全局变量

2156人阅读 2023/11/30 11:19 总访问:960087 评论:0 收藏:0 手机
分类: Csharp

前言

在使用nlog 记录日志时,需要在配置文件传递许多通用的参数,比如人员信息,IP,端口等等这些常用且通用的参数,但是又不想去每次记录日志时都去传递这些参数。
因此可以把他设置为nlog的全局变量,在配置文件中仅仅只需要将需要记录的信息使用  ${username} 这样的方式来直接使用

新增全局变量注入类

  1.  public class NKLayoutRenderer
  2.     {
  3.         /// <summary>
  4.         /// 注册Nlog全局变量
  5.         /// </summary>
  6.         public static void RegisterLogGlobalParameters()
  7.         {
  8.             // 获取当前程序集中所有类型
  9.             var allTypes = Assembly.GetExecutingAssembly().GetTypes().ToList();
  10.             // 获取当前命名空间名称
  11.             var currentNamespace = typeof(NKLayoutRenderer).Namespace;
  12.             // 查找带有指定标签的类
  13.             var matchingTypes = allTypes.Where(t => t.Namespace == currentNamespace && t.GetCustomAttributes(typeof(LayoutRendererAttribute), true).Length > 0)
  14.                 .ToList();
  15.             foreach (var type in matchingTypes)
  16.             {
  17.                 //创建对应实例
  18.                 var layoutRenderer = Activator.CreateInstance(type);
  19.                 //获取标签中的参数
  20.                 var attribute = type.GetCustomAttribute<LayoutRendererAttribute>();
  21.                 //获取LayoutRenderer中注册全局变量的方法
  22.                 var methodInfo = typeof(LayoutRenderer).GetMethod("Register"new Type[] { typeof(string) });
  23.                 // 创建泛型类型参数数组
  24.                 var typeArguments = new Type[] { type };
  25.                 // 为泛型方法提供类型参数
  26.                 var genericMethod = methodInfo.MakeGenericMethod(typeArguments);
  27.                 // 调用泛型方法,注册日志全局变量
  28.                 genericMethod.Invoke(layoutRenderer, new object[]
  29.                 {
  30.                     attribute.Name
  31.                 });
  32.             }
  33.         }
  34.     }
  35.     //日志记录地址
  36.     [LayoutRenderer("LogRootPath")]
  37.     public class LogRootPathLayoutRenderer : LayoutRenderer
  38.     {
  39.         protected override void Append(StringBuilder builder, LogEventInfo logEvent)
  40.         {
  41.             var path = GlobalContext.SystemConfig.LogRootPath ?? "/app/log/";
  42.             builder.Append(path);
  43.         }
  44.     }
  45.     //用户名
  46.     [LayoutRenderer("UserName")]
  47.     public class UserNameLayoutRenderer : LayoutRenderer
  48.     {
  49.         protected override void Append(StringBuilder builder, LogEventInfo logEvent)
  50.         {
  51.             var user = GlobalContext.ServiceProvider.GetCurrentUser();
  52.             builder.Append(user?.Name);
  53.         }
  54.     }
  55.  }

根据自身项目,修改和扩展需要传递的参数,一般只传递通用参数
然后在去注入一下

  1.    /// <summary>
  2.         /// 注册Nlog全局变量
  3.         /// </summary>
  4.         /// <param name="services"></param>
  5.         /// <returns></returns>
  6.         public static IServiceCollection AddNLogLayoutRenderer(this IServiceCollection services)
  7.         {
  8.             NKLayoutRenderer.RegisterLogGlobalParameters();
  9.             return services;
  10.         }

完成后,在nlog 配置文件中就可以直接使用 ${UserName}和${LogRootPath}


那么如何单独传递某一个参数呢?假设,我需要记录一个登录日志,需要传递一个登录名,和密码。
这个登录名仅仅只在登录日志中使用到了,所以就不建议做成全局的,只需要在记录登录日志的地方,单独的将登录名传递给nlog

  1.  //单独设置某一个参数
  2.  LogManager.Configuration.Variables["LoginName"] ="张三";

然后,配置文件中需要通过${var:LoginName} 来获取对应的参数
类似于这样



如果是LogManager 的配置为空或者报错,请先检查你的nlog 是否成功注册,上述例子。必须在nlog 注册之后才能正常使用。
也就是下边这段代码之后

  1.  //加载nlog 配置文件
  2.  LogManager.LoadConfiguration("nlog配置文件地址");


评价

Net Core使用日志 nlog

一:使用Nuget执行命令下载NLog相关依赖 Install-Package NLog.Extensions.Logging -Pre Install-Package NLo...

.net core3.1使用nlog缺少trace与debug

检查你的appsettings.json配置文件 关于日志等级的设置: { &quot;Logging&quot;: { &quot;LogLevel&quot;: { ...

.net core3.x使用nlog

下载依赖:&lt;ItemGroup&gt; &lt;PackageReferenceInclude=&quot;Nlog&quot;Version=&quot;4.7.13&quot;/&gt; &lt;Packa...

nlog日志等级

NLog允许的日志级别由高到低依次是:FatalErrorWarnInfoDebugTraceOff 最低日志等级设置: &lt;logger name=&quot;*&quot...

nlog跳过微软的日志只显示我们自己的日志

如果记录微软的日志会记录大量的日志信息,可能很多信息我们并不需要所以可以跳过,方法如下: &lt;targets&gt; &lt;!--...

nlog 规则rules

路由规则区域定义了日志的路由规则。实际上它是一个简单的路由表,对每一个日志源/记录者的名称和记录等级的组合,定义了一...

nlog扩展官方文档

https://nlog-project.org/2015/06/30/extending-nlog-is-easy.html

扩展nlog获取我们想要的内容,比如获取代理过后的ip地址

一:自定义一个NLOG模板用来获取经过nginx转发后的ip地址自定义一个类继承AspNetLayoutRendererBase:usingNLog; usingNLo...