ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件

  应用离不开日志,虽然现在使用VS有强大的调试功能,开发过程中不复杂的情况懒得输出日志了(想起print和echo的有木有),但在一些复杂的过程中以及应用日常运行中的日志还是非常有用。

  ASP.NET Core提供了内置的日志,但没弄明白这么把它输出到文件, 只能在VS的输出中查看, 谁知道怎么弄告诉我一下。(ASP.NET Core 系列目录) 本例 GitHub

一、内置日志的使用

  上一篇:如何在后台运行一个任务  中使用到了内置的日志,直接在构造中注入一下,然后直接使用即可, 非常方便

        public TokenRefreshService(ILogger<TokenRefreshService> logger)
        {
            _logger = logger;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            _logger.LogInformation("Service starting");
           //************
        }

然后在【输出】窗口中就可以看到输出的日志了:

想把它输出到txt中, 没找到相应的方法,试试常见的Nlog吧

二、使用Nlog将日志输出到文件

A.安装Nlog

在NuGet中搜索并安装 NLog.Web.AspNetCore , 当前版本是4.5.4

B.添加配置文件

新建一个文件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"
      throwConfigExceptions="true"
      internalLogLevel="info"
      internalLogFile="d:\log\internal-nlog.txt">

  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file  -->
    <target xsi:type="File" name="allfile" fileName="d:\log\nlog-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${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="d:\log\nlog-own-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />
  </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 -->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>

C.修改Program.cs文件

在 .UseStartup<Startup>() 后添加一句 .UseNLog()

三、注意事项

按照第二节的描述,NLog已经可以正常使用了,有些细节做一下简要说明:

1. 文件nlog.config的这个名字应该是默认读取的文件名,如果用了别的名字,可以在Program.cs文件中通过 ConfigureNLog 方法设置,见下面代码示例。

2. 现在如第一节内置的例子中一样, VS的输出框仍然在输入日志,也就是二者都在生效状态,想只用Nlog,可以调用 logging.ClearProviders();

代码示例:

 1     public class Program
 2     {
 3         public static void Main(string[] args)
 4         {
 5             NLog.Web.NLogBuilder.ConfigureNLog("nlog1.config");  //假如没有用默认的名字,多写了一个1
 6             CreateWebHostBuilder(args).Build().Run();
 7         }
 8
 9         public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
10             WebHost.CreateDefaultBuilder(args)
11                 .UseStartup<Startup>()
12                 .ConfigureLogging(logging =>
13                 {
14                     logging.ClearProviders(); //移除已经注册的其他日志处理程序
15                     logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //设置最小的日志级别
16                 })
17                 .UseNLog();
18     }

四、NLog配置简要说明

“简要”的说一下NLog的配置:

1.上文提到了一个日志级别,这个级别大概分为6个,由低到高如下:

1 logger.LogTrace();
2 logger.LogDebug();
3 logger.LogInformation();
4 logger.LogWarning();
5 logger.LogError();
6 logger.LogCritical();

2. 通过上面的例子,看输出的日志文件有3个, 这是在nlog.config中配置的, 通过文件名可以找到对应的配置。

  • internal-nlog 记录了NLog的启动及加载config的信息。
  • nlog-all 记录了所有日志
  • nlog-own 记录了我们自定义的日志

这是为什么呢?config中有两个关键标签<targets>和 <rules>

  • <targets>   用于配置输出相关内容,比如 type 属性可选项为File、Mail、Console等,用于设置输出目标,layout属性用于设置输出信息的组成元素及格式。
  • <rules> : 这里有个坑,一看这个标签,简单理解成了“规则”,而恰好例子中的两个<rule>正好对应了上面的两个<target>,writeTo属性指定了对应的<target>。可仔细一看,两个的<rule>配置差不多,为什么下面的一个就只输出了我们自定义的log呢?看帮助才知道这是一个“路由表”,日志是从上到下匹配的。 <logger name="Microsoft.*" maxlevel="Info" final="true" /> 一句话的 final="true" 过滤掉了"Microsoft.*"的日志。

原文地址:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_12.html

时间: 2024-10-06 11:15:54

ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件的相关文章

ASP.NET Core的路由[5]:内联路由约束的检验

当某个请求能够被成功路由的前提是它满足某个Route对象设置的路由规则,具体来说,当前请求的URL不仅需要满足路由模板体现的路径模式,请求还需要满足Route对象的所有约束.路由系统采用IRouteConstraint接口来表示路由约束,所以我们在接下来的内容中将路由约束统称为RouteConstraint. 在大部分情况下,约束都是针对路由模板中定义的某个路由参数,其目的在于验证URL携带的某部分的内容是否有效.不过也有一些约束与路由参数无关,这些约束规范往往是除URL之前的其他请求元素,比如

十、内置对象

十.内置对象 ECMA-262对内置对象的定义是:"由ECMAScript实现提供的.不依赖宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了."意思就是说,开发人员不必显示地实例化内置对象:因为它们已经实例化了.ECMA-262只定义了两个内置对象:Global和Math.   1.Global对象 Global(全局)对象是ECMAScript中一个特别的对象,因为这个对象是不存在的.在ECMAScript中不属于任何其他对象的属性和方法,都属于它的属性和方法.

NET Core 3.0 AutoFac替换内置DI的新姿势

原文:NET Core 3.0 AutoFac替换内置DI的新姿势 .NET Core 3.0 和 以往版本不同,替换AutoFac服务的方式有了一定的变化,在尝试着升级项目的时候出现了一些问题. 原来在NET Core 2.1时候,AutoFac返回一个 IServiceProvider 参数注入到ConfigureServices .NET Core 服务中,基本大痣是这样做的. 首先我们需要一个重写 Autofac.Module 的方法,这将用于将我们 Register [数据访问层] 以

从零开始一个个人博客 by asp.net core and angular(二)

上一篇帖子讲了用了哪些技术,这个帖子就先介绍介绍api项目吧,项目就是一个普通的webapi项目,账户系统用的identity ,什么是identity呢? 其实就是官方封装好的一系列的可以用来操作数据库的类,对用户信息进行增删改查.主要牵扯的类有如下几个: UserManager SignInManager RoleManager 上面列出的是我项目牵扯的大家有兴趣的可以去官方接口文档那里看看api namespace Microsoft.AspNetCore.Identity这个是命名空间

微信html5六人九人十二人牛牛斗牛斗公牛棋牌架设解析H5文件方法

解析H5文件方法 每一个小程序页面是由同路径下同名的四个不同后缀文件的组成,如:index.js.index.wxml.index.wxss.index.json..js后缀的文件是脚本文件,.json后缀的文件是配置文件,.wxss后缀的是样式表文件,.wxml后缀的文件是页面结构文件. 上面的意思就已经很清楚了.翻译过来就是: 微信html5六人九人十二人牛牛(h5.ttkmwl.com)斗牛斗公牛棋牌架设解析H5文件方法 .js就是javascript .wxss相当于css .wxml相

十五.内置函数的有关

2019-09-25-23:28:09 内置函数的使用 一.数据类型(4种) 1.int() 2.float() 这个是浮点数 3.bool() 4.complex() 创建一个复数. 第一个参数为实部, 第二个参数为虚部(感觉会很少用到这个) 二.进制转换 1.bin() 将给的参数转换成二进制 2.oct() 将给的参数转换成八进制 hex() 将给的参数转换成十六进制 三.数学运算 1.abs()            返回绝对值 2.divmode()     返回商和余数 3.roun

Oracle学习笔记十四 内置程序包

扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STANDARD 定义和扩展PL/SQL语言环境 DBMS_LOB 提供对 LOB数据类型进行操作的功能 DBMS_OUTPUT 处理PL/SQL块和子程序输出调试信息 DBMS_RANDOM 提供随机数生成器 DBMS_SQL 允许用户使用动态 SQL DBMS_XMLDOM 用DOM模型读写XML类型的数

菜鸟日记之JSP二 内置对象的理解

·最近学习JSP了,对编程和网络又有了一些理解.无论是现实中人与人的交流,还是网络世界的接触,都是在相互表达自己的意思让别人知道,并理解对方的信息.然后我们知道的事情不断的变多,会又交杂出新的内容,不断地碰撞,最后形成世界的百态人生.现实如此,网络亦然. 网络上最普遍的是信息, 最珍贵的也是信息. (引用网上,自己的理解) 1.request对象 request 对象是 javax.servlet.httpServletRequest类型的对象. 该对象代表了客户端的请求信息,主要用于接受通过H

模拟Springboot二:内置tomcat

既然要将tomcat内置到项目中,并且能够成功的启动项目就要知道 tomcat  做了哪些事情 ,那么就必须先搞明白 一个 普通的web项目是如何被我们本地配置的tomcat启动并运行的 (1). 先告诉tomcat 要运行哪些项目 (也就是在使用eclipse.idea启动项目前对tomcat的配置工作.或linux上将编译后的war包拷贝到webapp下)    从而在 后面在启动tomcat时,tomcat就会加载编译后的.class项目 (2). tomcat在加载编译后的项目时也会加载