• NetCore 使用Nlog自定义日志写入路径配置方式


    在一些特定场景的业务需求下,日志需要写入到不同的路径下提供日志分析。
    第一种:默认Nlog可以通过日志级别来区分路径,
    ——优点是不需要额外配置,开箱即用
    ——缺点是不够灵活,如果超过级别数量,则不满足需求

    第二种:通过定义FileTarget来根据业务写入不同的地址

    废话不多说了,直接上代码
    1、创建NetCore,并且引入Nlog和NLog.Web.AspNetCore 这个就不介绍和贴图了

    2、创建nlog配置文件

    注意配置文件里面的:

    <variable name="cuspath" value="" />


    相当于根据变量的方式来定义日志输出目录
    github文档说明地址:https://github.com/NLog/NLog/wiki/Configuration-file
    在输入文件名称中加入变量名称:

    fileName="logs/${var:cuspath}nlog-all-${shortdate}.log"
    上面,默认是输出到logs/目录中
    <?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"
          throwConfigExceptions="true"
          internalLogLevel="info">
    
      <!-- enable asp.net core layout renderers -->
      <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
      </extensions>
      <variable name="cuspath" value="" />
      <!-- the targets to write to -->
      <targets>
        <!-- write logs to file  -->
        <target xsi:type="File" name="allfile" fileName="logs/${var:cuspath}nlog-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
    
        <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
        <target xsi:type="File" name="ownFile-web" fileName="logs/${var:cuspath}nlog-all-${shortdate}.log"
                layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />
      </targets>
    
      <!-- rules to map from logger name to target -->
      <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />
    
        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Info" final="true" />
        <!-- BlackHole -->
    
        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
      </rules>
    </nlog>
    

      

    3、注册,在Starup.cs文件中

    Configure方法里面注册下
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                
    
                loggerFactory.AddNLog();
                env.ConfigureNLog("nlog.config");
    
                
    
                app.UseMvc();
            }
    

      

     
    4、Program.cs
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .UseNLog();
    

      

    5、为了扩展,我们新建一个类来处理日志的写入

    namespace FytSoa.Common
    {
        /// <summary>
        /// 日志模块
        /// </summary>
        public class Logger
        {
            NLog.Logger _logger;
            private Logger(NLog.Logger logger)
            {
                _logger = logger;
            }
            public Logger(string name) : this(LogManager.GetLogger(name))
            {
    
            }
    
            /// <summary>
            /// 单例
            /// </summary>
            public static Logger Default { get; private set; }
            static Logger()
            {
                Default = new Logger(LogManager.GetCurrentClassLogger());
            }
    
            private static string _path = "";
    
            /// <summary>
            /// 自定义输出目录,初始化
            /// </summary>
            public void Setting(string path)
            {
                if (_path != path)
                {
                    _path = path;
                    LogManager.Configuration.Variables["cuspath"] = path+"/";
                }
            }
    
            /// <summary>
            /// 自定义写日志路径
            /// </summary>
            /// <param name="msg">消息</param>
            /// <param name="path">写入地址</param>
            /// <returns></returns>
            public void Process(string msg, string path="")
            {
                _logger.Debug(msg);
            }
    
            #region Debug
            public void Debug(string msg, params object[] args)
            {
                _logger.Debug(msg, args);
                //LogManager.Shutdown();
            }
    
            public void Debug(string msg, Exception err)
            {
                _logger.Debug(err, msg);
                //LogManager.Shutdown();
            }
            #endregion
    
            #region Info
            public void Info(string msg, params object[] args)
            {
                _logger.Info(msg, args);
                //LogManager.Shutdown();
            }
    
            public void Info(string msg, Exception err)
            {
                _logger.Info(err, msg);
                //LogManager.Shutdown();
            }
            #endregion
    
            #region Warn
            public void Warn(string msg, params object[] args)
            {
                _logger.Warn(msg, args);
                //LogManager.Shutdown();
            }
    
            public void Warn(string msg, Exception err)
            {
                _logger.Warn(err, msg);
                //LogManager.Shutdown();
            }
            #endregion
    
            #region Trace
            public void Trace(string msg, params object[] args)
            {
                _logger.Trace(msg, args);
                //LogManager.Shutdown();
            }
    
            public void Trace(string msg, Exception err)
            {
                _logger.Trace(err, msg);
                //LogManager.Shutdown();
            }
            #endregion
    
            #region Error
            public void Error(string msg, params object[] args)
            {
                _logger.Error(msg, args);
                //LogManager.Shutdown();
            }
    
            public void Error(string msg, Exception err)
            {
                _logger.Error(err, msg);
                //LogManager.Shutdown();
            }
            #endregion
    
            #region Fatal
            public void Fatal(string msg, params object[] args)
            {
                _logger.Fatal(msg, args);
                //LogManager.Shutdown();
            }
    
            public void Fatal(string msg, Exception err)
            {
                _logger.Fatal(err, msg);
                //LogManager.Shutdown();
            }
            #endregion
        }
    }
    

     注意:

     public void Setting(string path)
    方法是设置目录输入位置的

    6、使用方法

    默认输出到logs文件夹
    • Logger.Default.Info("TestDefault"+i);
    自定义输入到其他目录
    • 设置输出目录:Logger.Default.Setting("task");   
    • 调用日志方法:Logger.Default.Setting("task_log");
     task_log会输出到logs/task  文件夹
     
     
    开源项目NetCore 2.2   https://github.com/feiyit/FytSoaCms       page razor方式
    NetCore3.1   https://github.com/feiyit/FytSoa3.1         前后端分离
     
    关注我,和小伙伴们在NetCore的代码里一起骚起来
    群号:1060012125,一群内心骚动的小青年
     
     
  • 相关阅读:
    Leetcode 33.搜索旋转排序数组
    Leetcode 32.最长有效括号
    Leetcode 31.下一个排列
    Leetcode 30.与所有单词相关联的子串
    Leetcode 25.k个一组翻转链表
    Leetcode 24.两两交换链表中的节点
    做数据分析需要“搞”人?
    求职互联网数据分析,如何准备行业知识?
    如何利用Social Listening从社会化媒体中“提炼”有价值的信息?
    运营实操|如何利用微信后台数据优化微信运营
  • 原文地址:https://www.cnblogs.com/fuyu-blog/p/11813669.html
Copyright © 2020-2023  润新知