[.Net Core] 在 Mvc 中简单使用日志组件

[.Net Core] 在 Mvc 中简单使用日志组件

 

在 Mvc 中简单使用日志组件

  基于 .Net Core 2.0,本文只是蜻蜓点水,并非深入浅出。

 

目录

  • 使用内置的日志组件
  • 简单过渡到第三方组件 - NLog

 

使用内置的日志

  下面使用控制器 HomeController.cs 进行演示。

  需要 using Microsoft.Extensions.Logging;

 

  方案一:

复制代码
    public class HomeController : Controller
    {
        private readonly ILogger _logger ;

        public HomeController(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger(typeof(HomeController));
        }
    }
复制代码

 

  方案二:

复制代码
    public class HomeController : Controller
    {
        private readonly ILogger _logger ;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }
    }
复制代码

 

  方案三:

复制代码
    public class HomeController : Controller
    {
        private readonly ILogger _logger ;

        public HomeController(ILogger logger)
        {
            _logger = logger;
        }
    }
复制代码

 

  三种都是通过注入的方式获取日志记录器对象,在过去,我们会自己独立封装类似这些 Debug、Info 和 Error 等不同日志等级的方法,现在我们看看内置的方法是如何使用的?

 

  在 HomeController 内添加 Index() 方法进行测试。

复制代码
        public IActionResult Index()
        {
            _logger.LogDebug($"测试:{DateTime.Now.ToString(CultureInfo.InvariantCulture)}");
            _logger.LogError($"测试:{DateTime.Now.ToString(CultureInfo.InvariantCulture)}");
            _logger.LogInformation($"测试:{DateTime.Now.ToString(CultureInfo.InvariantCulture)}");

            return Json(Guid.NewGuid());
        }
复制代码

 

  在输出结果中我们可以看到,不同日志的等级在控制台中会以不同的颜色进行标注。

 

  每种级别的 Log 都有多个方法重载,如 LogInformation() ,示例演示的代码中使用的是比较简单一种,也就是最后一种。

复制代码
        //
        // 摘要:
        //     Formats and writes an informational log message.
        //
        // 参数:
        //   logger:
        //     The Microsoft.Extensions.Logging.ILogger to write to.
        //
        //   eventId:
        //     The event id associated with the log.
        //
        //   message:
        //     Format string of the log message.
        //
        //   args:
        //     An object array that contains zero or more objects to format.
        public static void LogInformation(this ILogger logger, EventId eventId, string message, params object[] args);
        //
        // 摘要:
        //     Formats and writes an informational log message.
        //
        // 参数:
        //   logger:
        //     The Microsoft.Extensions.Logging.ILogger to write to.
        //
        //   exception:
        //     The exception to log.
        //
        //   message:
        //     Format string of the log message.
        //
        //   args:
        //     An object array that contains zero or more objects to format.
        public static void LogInformation(this ILogger logger, Exception exception, string message, params object[] args);
        //
        // 摘要:
        //     Formats and writes an informational log message.
        //
        // 参数:
        //   logger:
        //     The Microsoft.Extensions.Logging.ILogger to write to.
        //
        //   message:
        //     Format string of the log message.
        //
        //   args:
        //     An object array that contains zero or more objects to format.
        public static void LogInformation(this ILogger logger, string message, params object[] args);
复制代码

  

  其它细节以及详情,或者希望使用其它日志组件可参考官方文档:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?tabs=aspnetcore2x

 

简单过渡到第三方组件 - NLog

  Nuget 安装 NLog.Web.AspNetCore(目前 Nuget 最新为 4.4.1,但是官方的教程却是 4.5 的,小编使用 4.4.1 进行演示)。如需 4.5+ 可参考官方:https://github.com/NLog/NLog.Web/wiki/Getting-started-with-ASP.NET-Core-2

 

  下面演示如何将内置的组件简单的移植到 NLog 中。

  先在根目录创建配置文件 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="info"
      internalLogFile="c:\temp\internal-nlog.txt">


  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file  -->
    <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

    <!-- another file log, only own logs. Uses some ASP.NET core renderers -->
    <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-own-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--All logs, including from Microsoft-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip non-critical Microsoft logs and so log only own logs-->
    <logger name="Microsoft.*" maxLevel="Info" final="true" /> <!-- BlackHole without writeTo -->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>
复制代码

 

  修改 Startup.cs 类中的 Configure() 方法,其它地方都不需要做出任何修改。

复制代码
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddNLog();    //添加NLog  
            env.ConfigureNLog("nlog.config");    //读取Nlog配置文件  

            //...        
        }
复制代码

 

  启动程序,你会发现:

 

 

 

【原文】http://www.cnblogs.com/liqingwen/p/8613538.html 


相关的文章:

  《[.Net Core] 简单读取 json 配置文件

  《[.Net Core] 简单使用 Mvc 内置的 Ioc

  《[.Net Core] 简单使用 Mvc 内置的 Ioc(续)

  《[.Net Core] 在 Mvc 中简单使用日志组件

 
  • 感谢您的阅读。喜欢的、有用的就请大哥大嫂们赏几个小钱花花,没钱的就请高抬贵手“推荐一下”吧!你的物质和精神支持是博主强大的写作动力。欢迎转载!
  • 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高(其实是个菜B),不足和错误之处在所难免,希望大家能够批评指出。
  • 我的博客:http://www.cnblogs.com/liqingwen/
  • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!

 

 

 

 

 

[.Net Core] 简单使用 Mvc 内置的 Ioc(续)

 

简单使用 Mvc 内置的 Ioc(续)

  本文基于 .NET Core 2.0。

  上一章《[.Net Core] 简单使用 Mvc 内置的 Ioc》已经对日常 Mvc 中的 Ioc 的简单用法进行了说明,此外还有一些需要补充的内容。

  接下来会围绕着这些疑问进行回答:AOP 中 Filter 和 Ioc 的结合使用是啥样子的呢? 怎样直接获取 Ioc 中的实例对象,而不是以构造函数的方式进行获取呢?

 

目录

  • 场景一:Ioc 结合过滤器 Filter 使用
  • 场景二:直接获取 Ioc 管理的对象

 

场景一:Ioc 结合过滤器 Filter 使用

  先编写一个过滤器 ExceptionFilter.cs,继承 IExceptionFilter,主要是用于错误时记录日志,使用的命名空间是 Microsoft.AspNetCore.Mvc.Filters。

复制代码
using Microsoft.AspNetCore.Mvc.Filters;

namespace IocCoreDemo
{
    public class ExceptionFilter : IExceptionFilter
    {
        private readonly LogService _logService;

        public ExceptionFilter(LogService logService)
        {
            _logService = logService;
        }

        public void OnException(ExceptionContext context)
        {
            _logService.Error(context.Exception.Message);
        }
    }
}
复制代码

 

  LogService.cs 打印日志的类:

复制代码
    public class LogService
    {
        public void Error(string message)
        {
            Console.WriteLine(message);
        }
    }
复制代码

 

  我在控制器 Demo4Controller.cs 内部的 Index() 方法中显式的让它抛出尚未实现的异常来进行测试:

复制代码
    public class Demo4Controller : Controller
    {
        public IActionResult Index()
        {
            throw new NotImplementedException();
        }
    }
复制代码

 

  接下来,是在核心的 Startup.cs 中的 ConfigureServices() 方法内修改代码,小编使用 AddSingleton() 作为示例方法进行注入:

复制代码
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton(typeof(ExceptionFilter));     //注入 ExceptionFilter
            services.AddSingleton(typeof(LogService));          //注入 LogService

            services.AddMvc(x => {
                //创建一个 ServiceProvider 对象
                var provider = services.BuildServiceProvider();
                var filter = provider.GetService<ExceptionFilter>();

                //添加过滤器
                x.Filters.Add(filter);
            });
        }
复制代码

 

 

  启动程序并跳转到路径 http://localhost:port/demo4 后,我们发现能够触发异常过滤器:

 

场景二:直接获取 Ioc 管理的对象

  测试用的服务类 Demo5Service.cs:

复制代码
    public class Demo5Service
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }
复制代码

 

  方法一

  我们可以在控制器内通过 this.HttpContext.RequestServices.GetService() 的方式获取已经注入 Ioc 内的服务对象,如控制器 Demo5Controller.cs:

复制代码
    public class Demo5Controller : Controller
    {
        public IActionResult Index()
        {
            var demoService = (Demo5Service) this.HttpContext.RequestServices.GetService(typeof(Demo5Service));
            return Json(demoService.Test());
        }
    }
复制代码

 

  不要忘记在 Startup.cs 中注入服务类:

 

 

  执行结果:

 

  方法二

  通过场景一知道:ServiceProvider 类中的 GetService() 方法可以获取已经注入的 Ioc 对象,这样我们可以考虑从如何获取该对象(ServiceProvider 类对象)着手。

  下面,我在 Startup.cs 类中添加一个静态的 ServiceProvider 类成员属性,方便可以从外部获取:

复制代码
    public class Startup
    {
        public static ServiceProvider ServiceProvider { get; private set; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddSingleton<Demo5Service>();

            ServiceProvider = services.BuildServiceProvider();
        }

        //...
    }
复制代码

 

 

   之后,我们可以采取这样的方式获取 Ioc 中已经注入的对象:

复制代码
    public class Demo5Controller : Controller
    {
        public IActionResult Index()
        {
            var demoService = (Demo5Service)Startup.ServiceProvider.GetService(typeof(Demo5Service));
            return Json(demoService.Test());
        }
    }
复制代码

 

 

原文:http://www.cnblogs.com/liqingwen/p/8585119.html

 

 

 

----

 

简单使用 Mvc 内置的 Ioc(续)

  本文基于 .NET Core 2.0。

  上一章《[.Net Core] 简单使用 Mvc 内置的 Ioc》已经对日常 Mvc 中的 Ioc 的简单用法进行了说明,此外还有一些需要补充的内容。

  接下来会围绕着这些疑问进行回答:AOP 中 Filter 和 Ioc 的结合使用是啥样子的呢? 怎样直接获取 Ioc 中的实例对象,而不是以构造函数的方式进行获取呢?

 

目录

  • 场景一:Ioc 结合过滤器 Filter 使用
  • 场景二:直接获取 Ioc 管理的对象

 

场景一:Ioc 结合过滤器 Filter 使用

  先编写一个过滤器 ExceptionFilter.cs,继承 IExceptionFilter,主要是用于错误时记录日志,使用的命名空间是 Microsoft.AspNetCore.Mvc.Filters。

复制代码
using Microsoft.AspNetCore.Mvc.Filters;

namespace IocCoreDemo
{
    public class ExceptionFilter : IExceptionFilter
    {
        private readonly LogService _logService;

        public ExceptionFilter(LogService logService)
        {
            _logService = logService;
        }

        public void OnException(ExceptionContext context)
        {
            _logService.Error(context.Exception.Message);
        }
    }
}
复制代码

 

  LogService.cs 打印日志的类:

复制代码
    public class LogService
    {
        public void Error(string message)
        {
            Console.WriteLine(message);
        }
    }
复制代码

 

  我在控制器 Demo4Controller.cs 内部的 Index() 方法中显式的让它抛出尚未实现的异常来进行测试:

复制代码
    public class Demo4Controller : Controller
    {
        public IActionResult Index()
        {
            throw new NotImplementedException();
        }
    }
复制代码

 

  接下来,是在核心的 Startup.cs 中的 ConfigureServices() 方法内修改代码,小编使用 AddSingleton() 作为示例方法进行注入:

复制代码
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton(typeof(ExceptionFilter));     //注入 ExceptionFilter
            services.AddSingleton(typeof(LogService));          //注入 LogService

            services.AddMvc(x => {
                //创建一个 ServiceProvider 对象
                var provider = services.BuildServiceProvider();
                var filter = provider.GetService<ExceptionFilter>();

                //添加过滤器
                x.Filters.Add(filter);
            });
        }
复制代码

 

 

  启动程序并跳转到路径 http://localhost:port/demo4 后,我们发现能够触发异常过滤器:

 

场景二:直接获取 Ioc 管理的对象

  测试用的服务类 Demo5Service.cs:

复制代码
    public class Demo5Service
    {
        public string Test()
        {
            return Guid.NewGuid().ToString();
        }
    }
复制代码

 

  方法一

  我们可以在控制器内通过 this.HttpContext.RequestServices.GetService() 的方式获取已经注入 Ioc 内的服务对象,如控制器 Demo5Controller.cs:

复制代码
    public class Demo5Controller : Controller
    {
        public IActionResult Index()
        {
            var demoService = (Demo5Service) this.HttpContext.RequestServices.GetService(typeof(Demo5Service));
            return Json(demoService.Test());
        }
    }
复制代码

 

  不要忘记在 Startup.cs 中注入服务类:

 

 

  执行结果:

 

  方法二

  通过场景一知道:ServiceProvider 类中的 GetService() 方法可以获取已经注入的 Ioc 对象,这样我们可以考虑从如何获取该对象(ServiceProvider 类对象)着手。

  下面,我在 Startup.cs 类中添加一个静态的 ServiceProvider 类成员属性,方便可以从外部获取:

复制代码
    public class Startup
    {
        public static ServiceProvider ServiceProvider { get; private set; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            services.AddSingleton<Demo5Service>();

            ServiceProvider = services.BuildServiceProvider();
        }

        //...
    }
复制代码

 

 

   之后,我们可以采取这样的方式获取 Ioc 中已经注入的对象:

复制代码
    public class Demo5Controller : Controller
    {
        public IActionResult Index()
        {
            var demoService = (Demo5Service)Startup.ServiceProvider.GetService(typeof(Demo5Service));
            return Json(demoService.Test());
        }
    }
复制代码

 

 

原文:http://www.cnblogs.com/liqingwen/p/8585119.html


相关的文章:

  《[.Net Core] 简单读取 json 配置文件

  《[.Net Core] 简单使用 Mvc 内置的 Ioc

  《[.Net Core] 简单使用 Mvc 内置的 Ioc(续)

  《[.Net Core] 在 Mvc 中简单使用日志组件

 
  • 感谢您的阅读。喜欢的、有用的就请大哥大嫂们赏几个小钱花花,没钱的就请高抬贵手“推荐一下”吧!你的物质和精神支持是博主强大的写作动力。欢迎转载!
  • 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高(其实是个菜B),不足和错误之处在所难免,希望大家能够批评指出。
  • 我的博客:http://www.cnblogs.com/liqingwen/
  • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!

 

 

 

 


相关的文章:

  《[.Net Core] 简单读取 json 配置文件

  《[.Net Core] 简单使用 Mvc 内置的 Ioc

  《[.Net Core] 简单使用 Mvc 内置的 Ioc(续)

  《[.Net Core] 在 Mvc 中简单使用日志组件

 
  • 感谢您的阅读。喜欢的、有用的就请大哥大嫂们赏几个小钱花花,没钱的就请高抬贵手“推荐一下”吧!你的物质和精神支持是博主强大的写作动力。欢迎转载!
  • 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高(其实是个菜B),不足和错误之处在所难免,希望大家能够批评指出。
  • 我的博客:http://www.cnblogs.com/liqingwen/
  • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
000
posted @ 2018-03-21 21:54  ~雨落忧伤~  阅读(88)  评论(0编辑  收藏  举报