net Core 使用日志NLog

引用NLog.Web.AspNetCore

Startup中注册NLog 服务

复制代码
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddNLog();//添加NLog  
            app.AddNLogWeb();
            env.ConfigureNLog("nlog.config");//读取Nlog配置文件  
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
复制代码

添加NLog配置文件nlog.Conifg

复制代码
<?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"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

  <!-- optional, add some variables
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <variable name="myvar" value="myvalue"/>

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs.
   -->
  <targets>
    <target xsi:type ="File"
    name="file"
    header="------------------------------Start------------------------------"
    footer="------------------------------End------------------------------"
    fileName="${basedir}/Logs/${shortdate}.log"
    layout="${longdate} - ${level:uppercase=true}:${message} ${callsite:fileName=true} ${exception:format=Type,Message,Method,StackTrace:maxInnerExceptionLevel=5:innerFormat=ShortType,Message,Method,StackTrace}"
    keepFileOpen="false"
    archiveFileName="${basedir}/App_Data/Logs/Backup_${shortdate}.{##}.log"
    archiveNumbering="Sequence"
    archiveEvery="Day"
    maxArchiveFiles="30">

    </target>
    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
    -->

    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
  </targets>

  <rules>
    <!-- add your logging rules here -->
    <logger name="*" minlevel="Error" writeTo="file" />
    <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->
  </rules>
</nlog>
复制代码
<!--说明 xsi:type="File"指定输出到文件类型;fileName指定输出文件的存放位置和文件名(可自定义),其中  
      ${basedir}是程序所在的路径;  
      ${shortdate}是日期(具体到日)。   
      layout指定输出文件内容的样式   
      ${level}是日志的等级;  
      ${longdate}是日期(具体到毫秒),  
      ${message}是具体要输出的内容。-->  

简单封装NLog操作

复制代码
定义一个ILogger接口
public interface ILogger
    {
        void Debug(string message);
        void Debug(string message, Exception exception);
        void Error(string message);
        void Error(string message, Exception exception);
        void Fatal(string message);
        void Fatal(string message, Exception exception);
        void Info(string message);
        void Info(string message, Exception exception);
        void Warn(string message);
        void Warn(string message, Exception exception);
    }

定义一个NLogLogger类
public class NLogLogger : ILogger
    {
        private readonly Logger logger = LogManager.GetCurrentClassLogger();

        public void Debug(string message)
        {
            logger.Debug(message);
        }

        public void Debug(string message, Exception exception)
        {
            logger.Debug(exception, message);
        }

        public void Error(string message)
        {
            logger.Error(message);
        }

        public void Error(string message, Exception exception)
        {
            logger.Error(exception, message);
        }

        public void Fatal(string message)
        {
            logger.Fatal(message);
        }

        public void Fatal(string message, Exception exception)
        {
            logger.Fatal(exception, message);
        }

        public void Info(string message)
        {
            logger.Info(message);
        }

        public void Info(string message, Exception exception)
        {
            logger.Info(exception, message);
        }

        public void Warn(string message)
        {
            logger.Warn(message);
        }

        public void Warn(string message, Exception exception)
        {
            logger.Warn(exception, message);
        }
    }
复制代码

在全局异常过滤器中简单使用

复制代码
定义一个ExpFilter类 继承IExceptionFilter
public class ExpFilter : IExceptionFilter
    {
        readonly ILoggerFactory _loggerFactory;
        readonly IHostingEnvironment _env;
        public ExpFilter(ILoggerFactory loggerFactory, IHostingEnvironment env)
        {
            _loggerFactory = loggerFactory;
            _env = env;
        }
        public void OnException(ExceptionContext context)
        {
            Exception exp = context.Exception;
            Exception innerEx = exp.InnerException == null ? exp : exp.InnerException;
            while (innerEx.InnerException != null)
            {
                innerEx = innerEx.InnerException;
            }
            NLogLogger nlog = new Blog.Common.Log.NLogLogger();
            bool isAjaxCall = context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest";
            if (isAjaxCall)
            {

                nlog.Error(innerEx.Message);
                JsonConvert.SerializeObject(new { status = 1, msg = "请求发生错误,请联系管理员" });
            }
            else
            {
                nlog.Error("Error", exp);
                ViewResult viewResult = new ViewResult();
                viewResult.ViewName = "~/Views/Shared/Error.cshtml";
                context.Result = viewResult; ;
            }
            context.ExceptionHandled = true;
            
        }
    }
复制代码

在Startup添加全局异常过滤器

services.AddMvc(option=> option.Filters.Add<ExpFilter>());

 

posted @   fy___~  阅读(100)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示