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文件下生成日志文件。

  • 相关阅读:
    可以说微软做的用户体验还不如这家泡菜厂
    如何在Visual Studio 工程之间共享静态内容 (js, css, img, etc.)
    使用JavaScript序列化任意复杂的对象
    使用ReSharper打造团队代码检查流程
    分享我们项目中基于EF事务机制的架构
    3句英文让你成为专业的欧美外包开发者
    linux 开机自启动脚本
    nginx 配置简单网站项目(linux下)
    python2 与 python3 如何实现共存
    centos 安装mysql
  • 原文地址:https://www.cnblogs.com/afei-24/p/10744297.html
Copyright © 2011-2022 走看看