zoukankan      html  css  js  c++  java
  • Asp.net Core中使用NLog,并封装成公共的日志方法

    1、安装NLog

    "NLog.Extensions.Logging": "1.0.0-rtm-alpha4"

    2、配置NLog

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                loggerFactory.AddConsole(Configuration.GetSection("Logging"));
                loggerFactory.AddDebug();
                //配置NLog
                loggerFactory.AddNLog();
                env.ConfigureNLog("nlog.config");
    
                app.UseApplicationInsightsRequestTelemetry();

    3、nlog.config

    <?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="Debug"
          internalLogToTrace="true">
    
      <targets>
        <target name="logfile"
                xsi:type="File"
                fileName="logs/${shortdate}.log"
                layout="${longdate} [${level:uppercase=true}] ${callsite:className=true:methodName=true:skipFrames=1} ${message} ${exception} @${callsite:fileName=true:includeSourcePath=true}" />
        <target name="console"
                xsi:type="ColoredConsole"
                layout="${longdate} [${level:uppercase=true}] ${callsite:className=true:methodName=true:skipFrames=1} ${message} ${exception} @${callsite:fileName=true:includeSourcePath=true}"/>
        <target xsi:type="Null" name="blackhole" />
      </targets>
    
      <rules>
        <!-- 除非调试需要,把 .NET Core 程序集的 Debug 输出都屏蔽 Trace -》Debug-》 Information -》Warning-》 Error-》 Critical-->
        <logger name="Microsoft.*" minLevel="Trace" writeTo="blackhole" final="true" />
        <!-- 除非调试需要,把系统的 Debug 输出都屏蔽 -->
        <logger name="System.*" minLevel="Trace" writeTo="blackhole" final="true" />
        
        <logger name="*" minlevel="Debug" writeTo="logfile,console" />
      </rules>
    </nlog>

    NLog的异常等级:Trace -》Debug-》 Information -》Warning-》 Error-》 Critical

    注意配置文件中可以移除Microsoft和System开头的组件输出的日志,不然日志会非常多

    NLog的更多配置请参考:https://github.com/NLog/NLog/wiki/Callsite-layout-renderer

    4、封装成公共方法

    using NLog;
    using System;
    using System.Diagnostics;
    
    namespace UFX.Tools
    {
        public class LogHelper
        {
            private static readonly Logger log = LogManager.GetLogger("");
            public static void Error(object msg, Exception exp = null)
            {
                if (exp == null)
                    log.Error("#" + msg);
                else
                    log.Error("#" + msg + "  " + exp.ToString());
            }
    
            public static void Debug(object msg, Exception exp = null)
            {
                if (exp == null)
                    log.Debug("#" + msg);
                else
                    log.Debug("#" + msg + "  " + exp.ToString());
            }
    
            public static void Info(object msg, Exception exp = null)
            {
                if (exp == null)
                    log.Info("#" + msg);
                else
                    log.Info("#" + msg + "  " + exp.ToString());
            }
    
    
            public static void Warn(object msg, Exception exp = null)
            {
                if (exp == null)
                    log.Warn("#" + msg);
                else
                    log.Warn("#" + msg + "  " + exp.ToString());
            }
        }
    }

    5、其他方法中使用直接LogHelper.Debug("")等即可

    但你会发现日志输出的方法中,所有异常都来自Tools.LogHelper,这样就不能准确的返回异常的方法,代码位置了,在.Net Core之前的版本中,我们可以通过StackFrames来找到调用方法,但是.Net Core这个方法不管用了。

    好在NLog已经为我们考虑到这个问题了,配置文件中直接可以定义需要打印的方法名称,需要网上寻找的Frame个数

    ${callsite:className=true:methodName=true:skipFrames=1}

    更多配置请参考:https://github.com/NLog/NLog/wiki/Callsite-layout-renderer

    using NLog;using System;using System.Diagnostics;
    namespace UFX.Tools{    public class LogHelper    {        private static readonly Logger log = LogManager.GetLogger("");        public static void Error(object msg, Exception exp = null)        {            if (exp == null)                log.Error("#" + msg);            else                log.Error("#" + msg + "  " + exp.ToString());        }
            public static void Debug(object msg, Exception exp = null)        {            if (exp == null)                log.Debug("#" + msg);            else                log.Debug("#" + msg + "  " + exp.ToString());        }
            public static void Info(object msg, Exception exp = null)        {            if (exp == null)                log.Info("#" + msg);            else                log.Info("#" + msg + "  " + exp.ToString());        }

            public static void Warn(object msg, Exception exp = null)        {            if (exp == null)                log.Warn("#" + msg);            else                log.Warn("#" + msg + "  " + exp.ToString());        }    }}

  • 相关阅读:
    windows 7 wifi热点配置
    Java中的try catch finaly先后调用顺序
    redis php扩展
    mysql索引
    cmd操作数据库的常用命令
    php ajax解决跨越问题
    git常用命令
    php,redis分布式锁防并发
    php商城下单,可以购买多件商品,redis防高并发
    php商城秒杀,redis防高并发
  • 原文地址:https://www.cnblogs.com/qidian10/p/6105339.html
Copyright © 2011-2022 走看看