当前位置: 移动技术网 > IT编程>开发语言>.net > .Net Core项目如何添加日志功能详解

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

2018年08月08日  | 移动技术网IT编程  | 我要评论

忍者创龙传,致我们终将逝去的青春小说txt,4948男生最贱小游戏

一、微软内置的日志组件

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

会发现只有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)

打开源码发现

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

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,就可以使用了。

总结

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网