zoukankan      html  css  js  c++  java
  • 自定义ASP.NET Core日志中间件

      这个日志框架使用的是ASP.NET Core的NLog,用来记录每次请求信息和返回信息。

    1.首先创建一个Web应用项目,我选择的是MVC模板:

      

    2.使用NuGet添加Microsoft.Extensions.Logging和NLog.Extensions.Logging

    3.修改Configure方法:

      

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                loggerFactory.AddNLog(); //添加NLog
                NLog.LogManager.LoadConfiguration("nlog.config");
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                    app.UseHsts();
                }
    
                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseCookiePolicy();
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Index}/{id?}");
                });
            }

    4.添加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"
          internalLogLevel="Warn"
          internalLogFile="internal-nlog.txt">
    
      <!--define various log targets-->
      <targets>
    
        <!--write logs to file-->
        <target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log"
                     layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
    
        <target xsi:type="File" name="ownFile-web" fileName="nlog-my-${shortdate}.log"
                     layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
    
        <target xsi:type="Null" name="blackhole" />
    
      </targets>
    
      <rules>
        <!--All logs, including from Microsoft-->
        <logger name="*" minlevel="Trace" writeTo="allfile" />
    
        <!--Skip Microsoft logs and so log only own logs-->
        <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
        <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
      </rules>
    </nlog>

      注意:运行项目时需要复制nlog.config到debug

    5.接下来开始自定义中间件

      添加一个LogMiddleware类:

        

    public class LogMiddleware
        {
            private readonly RequestDelegate _next;
            private readonly ILogger<LogMiddleware> _logger;
            public LogMiddleware(RequestDelegate next, ILogger<LogMiddleware> logger)
            {
                _next = next;
                _logger = logger;
            }
    
            public async Task Invoke(HttpContext context)
            {
                _logger.LogInformation("Request Url:" + context.Request.Path +Environment.NewLine
                    + "Body:" + context.Request.Body.ToString());
                await _next.Invoke(context);
                _logger.LogInformation("Response Url:" + context.Request.Path + Environment.NewLine
                    + "Body:" + context.Response.Body.ToString());
            }
        }

      再创建一个LogMiddlewareExtensions类:

    /// <summary>
        /// 这是扩展中间件
        /// </summary>
        public static class LogMiddlewareExtensions
        {
            public static IApplicationBuilder UseLog(this IApplicationBuilder builder)
            {
                return builder.UseMiddleware<LogMiddleware>();
            }
        }

      这样就编写好一个自定义的中间件。

    6.在Configure方法中调用app.UseLog()

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                loggerFactory.AddNLog(); //添加NLog
                NLog.LogManager.LoadConfiguration("nlog.config");
                app.UseLog();
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                    app.UseHsts();
                }
    
                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseCookiePolicy();
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Index}/{id?}");
                });
            }

    运行代码,会在debug文件下生成日志文件。

  • 相关阅读:
    Elasticsearch的介绍与安装配置启动问题
    代码发布项目
    gitpython模块
    Paramiko模块
    gojs插件的介绍与使用
    django中如何实现websocket,真正通过websocket实现群聊功能
    如何实现服务端主动给客户端推送消息,websocket详解,以及django如何使用websocket问题
    简单爬取汽车之家新闻(requests模块+bs4)
    http协议版本,响应状态码,正反向代理的区别,与伪静态
    web开发经验——富头像上传编辑器的使用
  • 原文地址:https://www.cnblogs.com/afei-24/p/10744297.html
Copyright © 2011-2022 走看看