ASP.NET Core 2.0 使用NLog實現日志記錄


1、安裝NuGet包

運行:Install-Package NLog.Web.AspNetCore

運行:Install-Package NLog

在csproj中編輯:

<PackageReference Include="NLog" Version="4.5.3" />
<PackageReference Include="NLog.Web.AspNetCore" Version="4.5.3" />

Github源碼示例

2、創建一個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:\temp\internal-nlog.txt">
  <!-- 要寫的目標-->
  <targets>
    <!--將日志寫入文件  -->
    <target xsi:type="File" name="allfile" fileName="D:\temp\nlog-all-${shortdate}.log"
            layout="${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />

    <!-- 啟用asp.net核心布局渲染器 -->
    <target xsi:type="File" name="ownFile-web" fileName="D:\temp\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>
    <!--所有的記錄,包括從微軟-->
    <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--跳過非關鍵微軟日志,因此只記錄自己的日志-->
    <logger name="Microsoft.*" maxlevel="Info" final="true" />
    <!-- BlackHole -->
    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
  </rules>
</nlog>
View Code

布局渲染器是在布局中使用的模板宏,例如${message}${level}等等

NLog支持創建自定義布局渲染器。有關更多信息,請參閱:擴展NLog

 

NLog軟件包 
$ {activityid} - 將一個System.Diagnostics跟蹤關聯ID放入日志中。
$ {all-event-properties} - 記錄所有事件上下文數據。
$ {appdomain} - 當前的應用程序域。
$ {assembly-version} - 默認應用程序域中可執行文件的版本。
$ {basedir} - 當前應用程序域的基本目錄。
$ {callsite} - 呼叫站點(類名稱,方法名稱和源信息)。
$ {callsite-linenumber} - 呼叫站點源行號。
$ {counter} - 一個計數器值(每個布局渲染都會增加)。
$ {currentdir} - 應用程序的當前工作目錄。
$ {date} - 當前日期和時間。
$ {document-uri} - 托管當前Silverlight應用程序的HTML頁面的URI。
$ {environment} - 環境變量。
$ {event-properties} - 記錄事件屬性數據 - 重命名$ {event-context}。
$ {exception} - 通過調用其中一個Logger * Exception()方法提供的異常信息。
$ {file-contents} - 渲染指定文件的內容。
$ {gc} - 關於垃圾收集器的信息。
$ {gdc} - 全局診斷上下文項目。字典結構來保存每個應用程序實例值。
$ {guid} - 全局唯一標識符(GUID)。
$ {identity} - 線程標識信息(名稱和認證信息)。
$ {install-context} - 安裝參數(傳遞給InstallNLogConfig)。
$ {level} - 日志級別。
$ {literal} - 一個字符串文字。
$ {log4jxmlevent} - 與log4j,Chainsaw和NLogViewer兼容的XML事件描述。
$ {logger} - 記錄器名稱。
$ {longdate} - 日期和時間格式很長,可排序yyyy-MM-dd HH:mm:ss.ffff。
$ {machinename} - 進程正在運行的機器名稱。
$ {mdc} - 映射的診斷上下文 - 一個線程局部結構。
$ {mdlc} - 異步映射的診斷上下文 - 一個線程局部結構。
$ {message} - 格式化的日志消息。
$ {ndc} - 嵌套的診斷上下文 - 一個線程局部結構。
$ {ndlc} - 異步嵌套診斷上下文 - 一個線程局部結構。
$ {newline} - 換行符。
$ {nlogdir} - NLog.dll所在的目錄。
$ {performancecounter} - 性能計數器。
$ {processid} - 當前進程的標識符。
$ {processinfo} - 關於正在運行的進程的信息。
$ {processname} - 當前進程的名稱。
$ {processtime} - 格式為HH:mm:ss.mmm的處理時間。
$ {qpc} - 高精度計時器,基於從QueryPerformanceCounter()返回的值(可選地轉換為秒)。
$ {registry} - 來自注冊表的值。
$ {sequenceid} - 日志序列標識
$ {shortdate} - 可排序格式的短日期yyyy-MM-dd。
$ {sl-appinfo} - 有關Silverlight應用程序的信息。
$ {specialfolder} - 系統特殊文件夾路徑(包括我的文檔,我的音樂,程序文件,桌面等)。
$ {stacktrace} - 堆棧跟蹤渲染器。
$ {tempdir} - 一個臨時目錄。
$ {threadid} - 當前線程的標識符。
$ {threadname} - 當前線程的名稱。
$ {ticks} - 當前日期和時間的Ticks值。
$ {time} - 以24小時可排序格式HH:mm:ss.mmm的時間。
$ {var} - 渲染變量(4.1中新增)
$ {windows-identity} - 線程Windows身份信息(用戶名)。
包裝
$ {cached} - 將緩存應用於另一個布局輸出。
$ {filesystem-normalize} - 通過用安全字符替換文件名中不允許的字符。
$ {json-encode} - 使用JSON規則轉義另一個布局的輸出。
$ {lowercase} - 將另一個布局輸出的結果轉換為小寫。
$ {onexception} - 僅在為日志消息定義異常時才輸出內部布局。
$ {pad} - 將填充應用於另一個布局輸出。
$ {replace} - 用另一個字符串替換另一個布局輸出中的字符串。
$ {replace-newlines} - 用另一個字符串替換換行符。
$ {rot13} - 用ROT-13解碼“encrypted”文本。
$ {trim-whitespace} - 修剪另一個布局渲染器的結果中的空白。
$ {uppercase} - 將另一個布局輸出的結果轉換為大寫。
$ {url-encode} - 編碼另一個布局輸出的結果以用於URL。
$ {when} - 只有在滿足指定條件時才輸出內部布局。
$ {whenEmpty} - 當內部布局產生空結果時輸出替代布局。
$ {WrapLine} - 在指定的行長度處包裝另一個布局輸出的結果。
$ {xml-encode} - 將另一個布局輸出的結果轉換為XML兼容。
NLog.Extended軟件包 
$ {appsetting} - 應用程序配置設置。
NLog.Web包 
$ {aspnet-MVC-Action} - ASP.NET MVC動作名稱
$ {aspnet-MVC-Controller} - ASP.NET MVC控制器名稱
$ {aspnet-Application} - ASP.NET應用程序變量。
$ {aspnet-Item} - ASP.NET HttpContext項目變量。
$ {aspnet-TraceIdentifier} - ASP.NET跟蹤標識符
$ {aspnet-Request} - ASP.NET請求變量。
$ {aspnet-Request-Cookie} - ASP.NET請求cookie內容。
$ {aspnet-Request-Host} - ASP.NET請求主機。
$ {aspnet-Request-Method} - ASP.NET請求方法(GET,POST等)。
$ {aspnet-Request-IP} - 客戶端IP。
$ {aspnet-Request-QueryString} - ASP.NET請求查詢字符串。
$ {aspnet-Request-Referrer} - ASP.NET請求引用者。
$ {aspnet-Request-UserAgent} - ASP.NET請求useragent。
$ {aspnet-Request-Url} - ASP.NET請求URL。
$ {aspnet-Session} - ASP.NET Session變量。
$ {aspnet-SessionId} - ASP.NET會話ID變量。
$ {aspnet-User-isAuthenticated} - ASP.NET用戶身份驗證?
$ {aspnet-User-AuthType} - ASP.NET用戶身份驗證。
$ {aspnet-User-Identity} - ASP.NET用戶變量。
$ {iis-site-name} - IIS站點名稱。
外包裝
外部軟件包,不由NLog團隊維護。

$ {xml} - 轉換為XML格式

$ {gelf} - 將日志轉換為GELF格式。
View Code

將自定義值傳遞給布局

即使布局渲染器提供了許多預定義的值,但您可能需要將特定於應用程序的值傳遞給布局您可以通過向事件添加自定義屬性來在代碼中傳遞自己的值。然后使用$ {event-properties}渲染器檢索值

3、在csproj手動編輯文件並添加

  <ItemGroup>
    <Content Update="nlog.config" CopyToOutputDirectory="Always" />
  </ItemGroup>

4、更新program.cs

        public static void Main(string[] args)
        {
            // NLog:首先設置記錄器以捕獲所有錯誤
            var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
            try
            {
                logger.Debug("init main");
                BuildWebHost(args).Run();
            }
            catch (Exception exception)
            {
                // NLog:catch安裝錯誤 
                logger.Error(exception, "Stopped program because of exception");
                throw;
            }
            finally
            {
                //確保在退出應用程序之前刷新並停止內部定時器/線程(避免Linux上的分段錯誤)
                NLog.LogManager.Shutdown();
            }
        }

        public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureLogging(logging =>
                {
                    logging.ClearProviders();
                    logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
                })
                .UseNLog()   // NLog:setup NLog用於依賴注入 
                .Build();
View Code

5、配置appsettings.json

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning",
      "Microsoft": "Information"
    }
  }
}
View Code

6、寫日志

        private readonly ILogger _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
            _logger.LogDebug(1, "NLog injected into HomeController");
        }
        public IActionResult Index()
        {
            _logger.LogInformation("Hello, this is the index!");        
            return View();
        }
View Code

7、輸出示例

 

 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM