欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.Net Core项目如何添加日志功能详解

程序员文章站 2022-06-17 21:18:37
一、微软内置的日志组件 在.net core中使用模板新建的web api项目时,会自动加入日志功能。只需要在控制器中注入ilogger就可以了。命名空间为:micros...

一、微软内置的日志组件

在.net core中使用模板新建的web api项目时,会自动加入日志功能。只需要在控制器中注入ilogger就可以了。命名空间为:microsoft.extensions.logging

.Net Core项目如何添加日志功能详解

会发现只有error被打印到了控制台,trace没有被打印。那是因为在appsetting.json中配置了logging>console>default的等级为debug,日志的等级大于等于debug才会输出到控制台。在这里说一下loglevel:trace<debug<information<warning<error<critical<none

当打开appsettings.development.json文件你会发现跟appsettings.json配置不同。如下:

{
 "logging": {
 "includescopes": false,
 "loglevel": {
 "default": "debug",
 "system": "information",
 "microsoft": "information"
 }
 }
}

例如:

"system": "information" 表示命名空间以system开头的类中且日志等级大于等于information才会输出到控制台。

"default": "debug" 表示除以system和microsoft开头的命名空间日志等级大约等于debug才会输出到控制台。

这里说明一下到底是在什么时候,读取了appsettings.json中的配置了了? 其实是在program中 webhost.createdefaultbuilder(arge)

打开源码发现

.Net Core项目如何添加日志功能详解

当然我们可以不用微软提供的默认配置

public class program
 {
 public static void main(string[] args)
 {
  //指定配置文件路径
  var configbuilder = new configurationbuilder()
     .setbasepath(directory.getcurrentdirectory())
    .addjsonfile($"appsettings.json", true, true)
    .addjsonfile($"appsettings.{environmentname.development}.json", true, true);

  var config = configbuilder.build();
  
  var host = new webhostbuilder()
   .usekestrel()
   .usestartup<startup>()
   .usecontentroot(directory.getcurrentdirectory())
   .useurls(config["appsettings:url"])//设置启动时的地址
   .build();
  host.run();
 }
 }

配置文件为:

{
 "appsettings": {
 "url": "http://0.0.0.0:6000"
 },
 "logging": {
 "includescopes": false,
 "debug": {
 "loglevel": {
 "default": "info"
 }
 },
 "console": {
 "loglevel": {
 "default": "warning"
 }
 }
 }
}

startup为:

public class startup
 {
 public iconfiguration configuration { get; private set; }
 public startup(ihostingenvironment env)//在构造函数中注入 ihostingenvironment 
 {
  configuration = new configurationbuilder()
    .setbasepath(env.contentrootpath)
    .addjsonfile($"appsettings.json")
    .build();
 }
 public void configureservices(iservicecollection services)
 {
  services.addmvc();
 }

 public void configure(iapplicationbuilder app,
  ihostingenvironment env,
  iloggerfactory loggerfactory)
 {
  if (env.isdevelopment())
  {
  app.usedeveloperexceptionpage();
  }
  //添加控制台输出
  loggerfactory.addconsole(configuration.getsection("logging"));
  loggerfactory.adddebug();

  app.usemvc();
 }
 }

但是微软提供的内置的日志组件没有实现将日志记录到文件、数据库上。下面介绍nlog

二、nlog

首先使用nuget添加nlog,然后在startup的configure中添加以下代码

public void configure(iapplicationbuilder app,
  ihostingenvironment env,
  iloggerfactory loggerfactory)
 {
  if (env.isdevelopment())
  {
  app.usedeveloperexceptionpage();
  }
  //添加控制台输出
  loggerfactory.addconsole(configuration.getsection("logging"));
  loggerfactory.adddebug();

  loggerfactory.addnlog();//添加nlog
  nlog.logmanager.loadconfiguration($@"{env.contentrootpath}/nlog.config");//指定nlog的配置文件

  app.usemvc();
 }

配置nlog的配置文件

<?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">-->
 <targets>
 <target name="allfile" xsi:type="file" filename="./logs/${shortdate}/all.log" layout="${longdate}|${message} ${exception}" />
 <target name="debugfile" xsi:type="file" filename="./logs/${shortdate}/debug.log" layout="${longdate}|${message} ${exception}" />
 <target name="infofile" xsi:type="file" filename="./logs/${shortdate}/info.log" layout="${longdate}|${message} ${exception}" />
 <target name="warnfile" xsi:type="file" filename="./logs/${shortdate}/warn.log" layout="${longdate}|${message} ${exception}" />
 <target name="errorfile" xsi:type="file" filename="./logs/${shortdate}/error.log" layout="${longdate}|${message} ${exception}" />
 <target name="fatalfile" xsi:type="file" filename="./logs/${shortdate}/fatal.log" layout="${longdate}|${message} ${exception}" />
   <target name="network" xsi:type="network" address="udp://chinacloudapp.cn:4561" layout="development|${longdate}|${event-properties:item=eventid.id}|${logger}|${uppercase:${level}}|${message} ${exception}" />//将日志通过网络输出
 <target name="debuge" xsi:type="console"/>//将日志输出到控制台
 </targets>

 <rules>
 <logger name="*" minlevel="trace" writeto="allfile,debuge" />
 <logger name="*" level="info" writeto="infofile" />
 <logger name="*" level="debug" writeto="debugfile" />
 <logger name="*" level="warn" writeto="warnfile" />
 <logger name="*" level="error" writeto="errorfile" />
 <logger name="*" level="fatal" writeto="fatalfile" />
 
 </rules>
</nlog>

xsi:type=“file”存储日志为文件格式 ,

xsi:type="console" 表示为控制台输出。

filename="./logs/${shortdate}/all.log" 表示存储文件路径。

layout="${longdate}|${message} ${exception}" 表示为文件内容的布局。

rules标签下面表示,对应等级的日志写到对应target中。如

<logger name="*" level="info" writeto="infofile" /> 表示等级为info的日志写到target名称为infofile的文件中。

<logger name="*" minlevel="trace" writeto="allfile,debuge" /> 表示日志等级大于trace的日志写到target名称为allfile和debuge(控制台输出)中。

同样在使用的时候,只需要在用到的地方注入ilogger,就可以使用了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。