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

  • 相关阅读:
    Oracle根据表的大小排序SQL语句
    设置新时间校正服务器NTP SERVER
    ORACLE设置密码无过期
    查看端口是否开通的命令行语句
    ORACLE基本操作备忘
    ORACLE数据导入导出后新数据库中某些表添加操作报错[ORA-12899]
    ORACLE数据库在导入导出时序列不一致的问题
    第一章:走近java-深入理解java虚拟机-读书总结
    智能指针的实现
    随机数的生成:给定1-n的随机数生成器randn(),生成1-m的随机数
  • 原文地址:https://www.cnblogs.com/afei-24/p/10744297.html
Copyright © 2011-2022 走看看