循序漸進學.Net Core Web Api開發系列【10】:使用日誌

来源:https://www.cnblogs.com/seabluescn/archive/2018/07/10/9283672.html
-Advertisement-
Play Games

本篇介紹日誌的使用,包括系統預設的控制台日誌和第三方NLog日誌管理。 ...


系列目錄

循序漸進學.Net Core Web Api開發系列目錄

 本系列涉及到的源碼下載地址:https://github.com/seabluescn/Blog_WebApi

 

一、本篇概述

本篇介紹日誌的使用,包括系統預設的控制台日誌和第三方NLog日誌管理。

 

二、使用系統控制台日誌

1、使用內置日誌

    [Produces("application/json")]
    [Route("api/Article")]
    public class ArticleController : Controller
    {      private readonly ILogger _logger;
        public ArticleController(SalesContext context, ILogger<ArticleController> logger)
        {          
            _logger = logger;
        }       

        [HttpGet("logger")]
        public void TestLogger()
        {
            _logger.LogCritical("LogCritical");
            _logger.LogError("LogError");          
            _logger.LogWarning("LogWarning");
            _logger.LogInformation("LogInformation");
            _logger.LogDebug("LogDebug");

            return;
        }
    }

預設只能看到前三條記錄:

主要原因是日誌的最低級別預設為Warring,如果要顯示其他級別日誌,需要修改application.json文件。 

{  
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Error"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Infomation"
      }
    }
  }
}

日誌級別優先順序如下順序:

Critical > Error > Warning > Information > Debug

調整日誌級別為Information 或Debug以後會顯示太多無關的日誌信息,可以配置預設級別為Warring,而自己項目命名空間的日誌級別為Debug。

"Console": {
      "LogLevel": {
        "Default": "Warning",
        "SaleService.Controllers": "DEBUG"
      }
    }

 

2、幾點說明

1)目前日誌已經可以正常工作了,把項目發佈到Linux環境下,通過配置Supervisor可以把控制台的內容輸出到文件系統,建議在調試環境下採用Debug日誌級別,而在生成環境採用Error日誌級別。配置Supervisor的內容可以參考:循序漸進學.Net Core Web Api開發系列【7】:項目發佈

 2)如果稍微瞭解依賴註入(DI)的知識,就可以理解我們在Controoler中使用ILogger是採用標準的構造函數註入的方式,但是問題是用戶並沒有註冊該服務,其實是系統在CreateDefaultBuilder時幫我們註冊了日誌服務。可以看幾段源碼的片段:

CreateDefaultBuilder:
using System;
using System.IO;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace Microsoft.AspNetCore
{   
    public static class WebHost
    { 
        public static IWebHostBuilder CreateDefaultBuilder(string[] args)
        {
            return WebHostBuilderIISExtensions.UseIISIntegration(HostingAbstractionsWebHostBuilderExtensions.UseContentRoot(WebHostBuilderKestrelExtensions.UseKestrel(new WebHostBuilder()), Directory.GetCurrentDirectory()).ConfigureAppConfiguration(delegate(WebHostBuilderContext hostingContext, IConfigurationBuilder config)
            {
                IHostingEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
                JsonConfigurationExtensions.AddJsonFile(JsonConfigurationExtensions.AddJsonFile(config, "appsettings.json", true, true), string.Format("appsettings.{0}.json", hostingEnvironment.EnvironmentName), true, true);
                if (HostingEnvironmentExtensions.IsDevelopment(hostingEnvironment))
                {
                    Assembly assembly = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName));
                    if (assembly != null)
                    {
                        UserSecretsConfigurationExtensions.AddUserSecrets(config, assembly, true);
                    }
                }
                EnvironmentVariablesExtensions.AddEnvironmentVariables(config);
                if (args != null)
                {
                    CommandLineConfigurationExtensions.AddCommandLine(config, args);
                }
            }).ConfigureLogging(delegate(WebHostBuilderContext hostingContext, ILoggingBuilder logging)
            {
                LoggingBuilderExtensions.AddConfiguration(logging, hostingContext.Configuration.GetSection("Logging"));
                logging.AddConsole();
                logging.AddDebug();
            })).UseDefaultServiceProvider(delegate(WebHostBuilderContext context, ServiceProviderOptions options)
            {
                options.ValidateScopes = HostingEnvironmentExtensions.IsDevelopment(context.HostingEnvironment);
            });
        }
    }
}
AddConsole:
using System;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Console;

namespace Microsoft.Extensions.Logging
{   
    public static class ConsoleLoggerExtensions
    {       
        public static ILoggingBuilder AddConsole(this ILoggingBuilder builder)
        {
            builder.Services.AddSingleton<ILoggerProvider, ConsoleLoggerProvider>();
            return builder;
        }       
    }
}

 

三、使用NLog

1、通過NuGet獲取包:NLog.Web.AspNetCore

2、修改Startup類的Configure方法:

 public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }       

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddNLog(); loggerFactory.ConfigureNLog("nlog.config"); //如果採用預設配置文件nlog.config,該語句可以省略 } }

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">
  <targets>
    <target xsi:type="File" name="logfile" fileName="${basedir}/logs/${shortdate}_all.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True}|${uppercase:${level}}|${message} ${exception}" />
    <target xsi:type="File" name="debugfile" fileName="${basedir}/logs/${shortdate}_debug.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True}|${uppercase:${level}}|${message} ${exception}" />
    <target xsi:type="File" name="errfile" fileName="${basedir}/logs/${shortdate}_error.log" keepFileOpen="false" layout="${longdate}|${callsite:fileName=True}|${uppercase:${level}}|${message} ${exception}" />
  </targets>
  <rules>
    <logger name="*" level="Debug" writeTo="debugfile" />
    <logger name="*" level="Error" writeTo="errfile" />    
    <logger name="*" minlevel="Trace" writeTo="logfile" />
  </rules>
</nlog>

項目發佈時修改配置文件,只保留errfile即可。

以上就是全部代碼,Controller中的代碼無需修改。

 

3、兩個註意點

1)目前我們已經採用NLog來進行日誌的記錄,此時系統預設的日誌仍然是正常工作的,項目發佈時建議把系統預設的日誌級別改成Error,nlog的輸出日誌只保留errfile,以免造成伺服器磁碟空間浪費。

2)項目發佈時nlog.config文件可能不會發佈到目標目錄,需要修改該文件的文件屬性:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 問題的提出: 俄羅斯方塊允許90度的坡,是不是有點不夠科學#(滑稽) 想辦法加一種會“滑坡”的方塊 本文兩大部分: 詳細的描繪是怎樣的“流動” 寫代碼,並整合進游戲 本文基於我寫的 俄羅斯方塊(一):簡版 事先上兩個動圖, 說明下我想做什麼 第一部分 首先是假象圖 這是一個長條逐漸“癱軟”的過程 歸 ...
  • 12、函數: 函數的功能: 定義:在真實的項目開發過程中,有些代碼會重覆利用,我們可以把它提出來,做成公共的代碼,供團隊來使用,這個我們封裝的代碼段,就是函數(功能)。 優點: 1、提高代碼的利用率。 2、減少開發時間。 3、減少代碼冗餘。 4、可維護性提高。 5、方便調試代碼。 函數的定義格式: ...
  • jdk目錄相關介紹: bin:存放的是java的相關開發工具 db:顧名思義jre附帶的輕量級資料庫 include:存放的是調用系統資源的介面文件 jre:java的運行環境 lib:核心的類庫 src.zip:java的開源代碼 JVM:指的是java虛擬機(作用:解釋class文件並且通知系統 ...
  • 參考了網路上各路大神的實現方法。主要使用了io.h庫 #include <iostream> #include <iostream> #include <cstring> #include <cstring> #include <io.h> #include <io.h> using namespa ...
  • 早在2014年oracle發佈了jdk 8,在裡面增加了lambda模塊。於是java程式員們又多了一種新的編程方式:函數式編程,也就是lambda表達式。我自己用lambda表達式也差不多快4年了,但在工作中卻鮮有看到同事使用這種編程方式,即使有些使用了,但感覺好像對其特性也不是很瞭解。我看了一上 ...
  • Valid Anagram 題目 思路與解答 答案 Valid Palindrome 題目 思路與解答 答案 Valid Palindrome II 題目 思路與解答 答案 Valid Parentheses 題目 思路與解答 答案 Valid Perfect Square 題目 思路與解答 答案 ...
  • Web的暴力破解通常用於網站的登錄視窗,其他的地方當然也可以用。比如某個網站需要驗證身份證ID時,可以在字典中批量的寫入合法的身份證ID,然後輸入頁面測試。這種方法手工都能做,只要有足夠的耐心。 ...
  • #!/usr/bin/env python #Python 3.7.0 元祖常用方法 __author__ = "lrtao2010" #元祖和列表類似,只不過元祖一旦被創建一級元素不可更改(增刪改)。 # a = ('123',['abc'],'b',345,['6','7','d'],) # a... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...