zoukankan      html  css  js  c++  java
  • .net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

    .net core 3.1 使用nlog记录日志 NLog.Web.AspNetCore

    背景

    .net core 中已经集成了log的方法, 但是只能控制台输出不能写入文件等等. 常见第三方的的日志工具包括log4net, nlog等等, 本文介绍nlog

    一. 引用程序集, nuget 安装NLog.Web.AspNetCore

    二. 创建nlog.config配置文件, 可以直接复制下面的配置文件内容

    具体的配置说明 可以参考 https://www.cjavapy.com/article/183/ 

    <?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="Off"
    internalLogFile="c: empinternal-nlog.txt">

    <!-- enable asp.net core layout renderers -->
    <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <!-- the targets to write to -->
    <targets>
    <!-- write logs to file -->
    <target xsi:type="File" name="allfile" fileName="${basedir}/logs/${logger}/${shortdate}.log"
    layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace} ${newline} ${exception:format=tostring} ${newline}" />

    <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
    <target xsi:type="Debugger" name="debugger" layout="${date:format=HH:mm:ss.fff}: ${message}" />
    </targets>

    <!-- rules to map from logger name to target -->
    <rules>
    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxlevel="Error" final="true" />
    <logger name="*" minlevel="Debug" writeTo="debugger" />
    <logger name="*" minlevel="Info" writeTo="allfile" />
    </rules>
    </nlog>

    复制代码
    <?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="Off"
          internalLogFile="c:	empinternal-nlog.txt">
    
      <!-- enable asp.net core layout renderers -->
      <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
      </extensions>
    
      <!-- the targets to write to -->
      <targets>
        <!-- write logs to file  -->
        <target xsi:type="File" name="allfile" fileName="${basedir}/logs/${logger}/${shortdate}.log"
                layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace} ${newline} ${exception:format=tostring} ${newline}" />
    
        <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
        <target xsi:type="Debugger" name="debugger" layout="${date:format=HH:mm:ss.fff}: ${message}"  />
      </targets>
    
      <!-- rules to map from logger name to target -->
      <rules>
        <!--Skip non-critical Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" maxlevel="Error" final="true" />
        <logger name="*" minlevel="Debug" writeTo="debugger" />
        <logger name="*" minlevel="Info" writeTo="allfile" />
      </rules>
    </nlog>
    复制代码

    三. Program.cs 注入, UseNLog()

    复制代码
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    })
                .UseNLog();// 添加这句 注入nlog
    复制代码

    四. 控制器里使用

    复制代码
            /// <summary>
            /// 日志
            /// </summary>
            private readonly ILogger<DemoController> _logger;
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="logger"></param>
            public DemoController(ILogger<DemoController> logger)
            {
                _logger = logger;
            }
    
            public IActionResult Test()
            {
                _logger.LogError("我是日志内容");
                return Ok("ok");
            }
    复制代码

    结果

    在输出里面会有结果

     也可以在日志文件里看见

    五. 封装

    虽然.net core 推荐依赖注入, 但是这种使用方式还是会不方便, 所以我可以封装成一个类, 需要的时候直接用. 代码如下:

    复制代码
    /// <summary>
        /// Nlog日志帮助类
        /// Trace 包含大量的信息,例如 protocol payloads。一般仅在开发环境中启用, 仅输出不存文件。
        /// Debug  比 Trance 级别稍微粗略,一般仅在开发环境中启用, 仅输出不存文件。
        /// Info 一般在生产环境中启用。
        /// Warn 一般用于可恢复或临时性错误的非关键问题。
        /// Error 一般是异常信息。
        /// Fatal - 非常严重的错误!
        /// </summary>
        public class NLogHelper
        {
            readonly Logger logger;
    
            private NLogHelper(Logger logger)
            {
                this.logger = logger;
            }
    
            /// <summary>
            /// 自定义 ${logger} (我用于区分文件夹)
            /// </summary>
            /// <param name="name"></param>
            public NLogHelper(string name) : this(NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetLogger(name))
            {
            }
    
            /// <summary>
            /// 默认 ${logger} (Default 文件夹下)
            /// </summary>
            public static NLogHelper Default { get; private set; }
            static NLogHelper()
            {
                Default = new NLogHelper(NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetLogger("Default"));
            }
    
            public void Debug(string msg, params object[] args)
            {
                logger.Debug(msg, args);
            }
            public void Debug(string msg, Exception err)
            {
                logger.Debug(err, msg);
            }
    
            public void Info(string msg, params object[] args)
            {
                logger.Info(msg, args);
            }
    
            public void Info(string msg, Exception err)
            {
                logger.Info(err, msg);
            }
    
            public void Trace(string msg, params object[] args)
            {
                logger.Trace(msg, args);
            }
    
            public void Trace(string msg, Exception err)
            {
                logger.Trace(err, msg);
            }
    
            public void Error(string msg, params object[] args)
            {
                logger.Error(msg, args);
            }
    
            public void Error(string msg, Exception err)
            {
                logger.Error(err, msg);
            }
    
            public void Fatal(string msg, params object[] args)
            {
                logger.Fatal(msg, args);
            }
    
            public void Fatal(string msg, Exception err)
            {
                logger.Fatal(err, msg);
            }
        }
    复制代码

    使用方式

            public IActionResult Test()
            {
                NLogHelper.Default.Fatal("默认logger");
                new NLogHelper("Diy").Error("自定义logger");
                return Ok("ok");
            }
  • 相关阅读:
    centos 启动报错 “error:failure reading sector 0x9b268 from 'hd0'”
    Jenkins安装及插件管理
    svn关联Jenkins自动发布代码
    LVS逻辑卷的创建、扩展、销毁
    Linux上安装SVN服务端及SVN的可视化工具
    CentOS7下配置防火墙放过Keepalived
    Prometheus apache_exporter 监控配置
    CentOS启动报错:Error at boot time: "[Firmware Bug]: TSC_DEADLINE disabled due to Errata
    linux上安装open***
    python学习day15 Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
  • 原文地址:https://www.cnblogs.com/zxtceq/p/14149159.html
Copyright © 2011-2022 走看看