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

(14)ASP.NET Core 中的日志记录

程序员文章站 2023-10-19 11:56:35
1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API。本文介绍了如何将日志记录API与内置提供应用程序一起使用。 2.添加日志提供程序 日志记录提供应用程序显示或存储日志。例如,控制台提供应用程序在控制台上显示日志,Azure Application In ......

1.前言

asp.net core支持适用于各种内置和第三方日志记录提供应用程序的日志记录api。本文介绍了如何将日志记录api与内置提供应用程序一起使用。

2.添加日志提供程序

日志记录提供应用程序显示或存储日志。例如,控制台提供应用程序在控制台上显示日志,azure application insights提供应用程序将这些日志存储在azure application insights中。要添加提供应用程序,请在program.cs中调用提供程序的add{provider name}扩展方法:

public static void main(string[] args)
{
    var webhost = new webhostbuilder()
        .usekestrel()
        .usecontentroot(directory.getcurrentdirectory())
        .configureappconfiguration((hostingcontext, config) =>
        {
            var env = hostingcontext.hostingenvironment;
            config.addjsonfile("appsettings.json", optional: true, reloadonchange: true)
                  .addjsonfile($"appsettings.{env.environmentname}.json",
                      optional: true, reloadonchange: true);
            config.addenvironmentvariables();
        })
        .configurelogging((hostingcontext, logging) =>
        {
            //添加appsettings.json中关于日志的logging节点配置
            logging.addconfiguration(hostingcontext.configuration.getsection("logging"));
            //日志控制台记录提供程序
            logging.addconsole();
            //日志debug记录提供程序
logging.adddebug();
            //日志eventsource记录提供程序
logging.addeventsourcelogger();
        })
        .usestartup<startup>()
        .build();
    webhost.run();
}

默认项目模板调用createdefaultbuilder,该操作将添加日志记录(控制台、debug、eventsource)提供给应用程序:

public static void main(string[] args)
{
    createwebhostbuilder(args).build().run();
}
public static iwebhostbuilder createwebhostbuilder(string[] args) =>
    webhost.createdefaultbuilder(args)
        .usestartup<startup>();

3.创建日志

创建日志可以从依赖注入(di)中获取ilogger<tcategoryname>对象。以下razor页面示例会创建级别为information且类别为aboutmodel类(models/aboutmodel)的日志:

public class aboutmodel
{
    private readonly ilogger _logger;
    public aboutmodel(ilogger<aboutmodel> logger)
 {
    //ilogger是core内置日志组件,默认已经注入,无需再次手动注入
        _logger = logger;
    }
    public void onget()
    {
        var message = $"about page visited at {datetime.utcnow.tolongtimestring()}";
        _logger.loginformation("message displayed: {message}", message);
    }
}
private readonly ilogger<aboutmodel> _logger;
public homecontroller(ilogger<aboutmodel> logger)
{
    _logger = logger;
}
public iactionresult index()
{
    aboutmodel aboutmodel = new aboutmodel(_logger);
    aboutmodel.onget();
    return view();
}

通过kestral服务器启动调试:
(14)ASP.NET Core 中的日志记录
看看控制台输出日志记录:
(14)ASP.NET Core 中的日志记录
日志“级别”代表所记录事件的严重程度。日志“类别”是与每个日志关联的字符串。ilogger<t>实例会创建“类别”为类型t的完全限定名称的日志。

3.1启动时(startup)创建日志

要将日志写入startup类,构造函数签名需包含ilogger参数:

public class startup
{
    private readonly ilogger _logger;
    public startup(iconfiguration configuration, ilogger<startup> logger)
    {
        configuration = configuration;
        _logger = logger;
    }
    public iconfiguration configuration { get; }
    public void configureservices(iservicecollection services)
    {
        _logger.loginformation("added todorepository to services");
    }
    public void configure(iapplicationbuilder app, ihostingenvironment env)
    {
        if (env.isdevelopment())
        {
            _logger.loginformation("in development environment");
        }
    }
}

通过kestral服务器启动调试看看控制台输出日志记录:
(14)ASP.NET Core 中的日志记录

3.2在程序中(program)创建日志

如果使用createdefaultbuilder,则可自行选择提供应用程序来替换默认应用程序。调用 clearproviders,然后添加所需的应用程序。

public class program
{
    public static void main(string[] args)
    {
        var host = createwebhostbuilder(args).build();
        var logger = host.services.getrequiredservice<ilogger<program>>();
        logger.loginformation("seeded the database.");
        host.run();
    }
    public static iwebhostbuilder createwebhostbuilder(string[] args) =>
    webhost.createdefaultbuilder(args)
    .usestartup<startup>()
    .configurelogging(logging =>
    {
        logging.clearproviders();
        logging.addconsole();
    });
}

通过kestral服务器启动调试看看控制台输出日志记录:

(14)ASP.NET Core 中的日志记录

4.configuration

日志记录提供程序配置由一个或多个配置提供程序提供:
●文件格式(ini、json 和 xml)。
●命令行参数。
●环境变量。
●内存中的.net对象。
●未加密的机密管理器存储。
●加密的用户存储,如 azure key vault。
●(已安装或已创建的)自定义提供程序。
例如,日志记录配置通常由应用设置文件的logging部分提供。以下示例显示了典型 appsettings.development.json 文件的内容:

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

logging属性可具有loglevel和日志提供程序属性(显示控制台)。logging下的loglevel属性指定了用于记录所选类别的最低级别。在本例中,system和microsoft类别在information级别记录,其他均在debug级别记录。如果提供程序支持日志作用域,则includescopes将指示是否启用这些域。

5.日志级别

每个日志都指定了一个loglevel值。日志级别指示严重性或重要程度。如果loglevel是warning级别,那么跟踪trace,debug,information级别将不会记录。asp.net core 定义了以下日志级别(按严重性从低到高排列): 
●跟踪trace = 0
●调试debug = 1
●信息 information = 2
●警告 warning = 3
●错误 error = 4
●严重 critical = 5

6.内置日志记录提供程序

●控制台:logging.addconsole(); dotnet run 查看控制台日志记录输出。  
●调试:logging.adddebug(); 在 linux 中,此提供程序将日志写入 /var/log/message。
●eventsource:logging.addeventsourcelogger();在windows中,它使用perfview实用工具收集和查看日志,但尚无支持linux或macos的事件集合和显示工具。
●eventlog:logging.addeventlog();向windows事件日志发送日志输出。
●tracesource:logging.addtracesource(sourceswitchname);应用必须在.net framework(而非.net core)上运行。

7.第三方日志记录提供程序

适用于asp.net core的第三方日志记录框架,链接地址官方文档中有:
●elmah.io(github 存储库)
●gelf(github 存储库)
●jsnlog(github 存储库)
●kisslog.net(github 存储库)
●loggr(github 存储库)
●nlog(github 存储库)
●sentry(github 存储库)
●serilog(github 存储库)
●stackdriver(github 存储库)
例如使用nlog:nlog是一个灵活的免费日志记录平台,适用于各种.net平台,包括.net标准。nlog可以轻松写入多个目标。(数据库,文件,控制台)并即时更改日志记录配置。

8.总结

这篇主要讲了asp.net core内置的日志提供程序,内置的日志自带功能还是有限,比如不能写入到.txt文件或数据库中。在项目使用中还是要考虑使用第三方日志提供程序。本篇对于内置的日志提供程序还有:日志消息模板、日志作用域、azure中的日志记录、日志事件id等未介绍,具体再参考官方文档。

参考文献:
asp.net core 中的日志记录