.net Core 2.0使用NLog


最近研究了一下NLog的使用方式,簡單的入了一下門。

實現的功能,對於不同的日志,進行不同的記錄,分別有系統運行日志,和個人在程序中寫的異常日志。發布之后放在了IIS上。進行查看日志的信息

參考了兩篇博客。 

1.http://www.voidcn.com/blog/aojiancc2/article/p-6672009.html
2.http://www.cnblogs.com/linezero/p/Logging.html

個人覺得還是第一篇寫的詳細。第二篇可能是大神寫的吧,一些細節並沒喲特別的注意到。

那兩篇博客已經寫很詳細了,我再重復一下,以及提醒一下像我一樣的小菜們,需要注意的事項,以及個人在其中的一些疑惑。

首先我們建一個Core 2.0的項目,由於目前2.0 沒有正式發布,如果想用2.0 需要裝preview版的vs 

我們需要引入這些包,我們會用到。這是我的*.csproj文件的部分。(在這里需要注意下,如果是Core2.0的項目直接用2.0以上包,不然在vs中運行是沒有問題的,在windows環境中運行也是沒有問題的,但是到了Linux中就會出問題,在 restore 時,會給你報錯,讓你把包升級到2.0以上。這個問題自己原來也沒有注意到,本來想着這些版本控制之類的東西,肯定是向下兼容的。可是前兩天,在Linux上用docker 進行測試發布的時候就出現了這個問題。)

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0-preview1-final" />
    <PackageReference Include="NLog" Version="5.0.0-beta09" />
    <PackageReference Include="NLog.Web.AspNetCore" Version="4.4.1" />
    <PackageReference Include="System.Text.Encoding.CodePages" Version="4.3.0" />
  </ItemGroup>

打開我們的startUp.cs 文件

添加下邊的代碼

        public void Configure(IApplicationBuilder app, IHostingEnvironment env ,ILoggerFactory loggerFactory)
        {
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//這是為了防止中文亂碼
            loggerFactory.AddNLog();//添加NLog
            env.ConfigureNLog("nlog.config");//讀取Nlog配置文件
           //other Code
        }

在ConfigServie方法中不需要進行依賴注入的配置

由於這里我們添加了讀取Nlog的配置文件的信息

所以我們要添加“nlog.config的文件”

新建一個 xml文件 名稱為 你的 env.ConfigureNLog("nlog.config");里邊穿的字符串參數的名稱。

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
 3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4       autoReload="true"
 5       internalLogLevel="Warn"
 6       internalLogFile="internal-nlog.txt">
 7 
 8   <!--define various log targets-->
 9   <targets>
10 
11     <!--write logs to file-->
12     <target xsi:type="File" name="allfile" fileName="nlog-all-${shortdate}.log"
13                  layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
14 
15     <target xsi:type="File" name="ownFile-web" fileName="nlog-my-${shortdate}.log"
16                  layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />
17 
18     <target xsi:type="Null" name="blackhole" />
19 
20   </targets>
21 
22   <rules>
23     <!--All logs, including from Microsoft-->
24     <logger name="*" minlevel="Trace" writeTo="allfile" />
25 
26     <!--Skip Microsoft logs and so log only own logs-->
27     <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
28     <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
29   </rules>
30 
31 
32 </nlog>
nlog.config

在HomeControler中進行如下修改(我結合了他們兩個人的用法)

 public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        static Logger Logger = LogManager.GetCurrentClassLogger();
        public HomeController(ILogger<HomeController> logger)
        {
            this._logger = logger;
        }
        public IActionResult Index()
        {
            Logger.Info("普通信息日志-----------");
            Logger.Debug("調試日志-----------");
            Logger.Error("錯誤日志-----------");
            Logger.Fatal("異常日志-----------");
            Logger.Warn("警告日志-----------");
            Logger.Trace("跟蹤日志-----------");
            Logger.Log(NLog.LogLevel.Warn, "Log日志------------------");

            _logger.LogInformation("你訪問了首頁");
            _logger.LogWarning("警告信息");
            _logger.LogError("錯誤信息");
           // _logger.LogDebug(NLog.LogLevel.Fatal, "NLog 致命日志");
            return View();
        }
}

可能有人會疑問:構造函數中的logger是怎么穿進去的,沒有進行依賴注入。我個人了解的也不是特別的深入,目測是通過app.addNlog()。進行注入的。

之后我們修改一下我們的appsetting.json文件,把其中的日志級別調整為Information的。默認是Debug的

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

這時候我們直接運行F5在/bin/Debug/netcoreapp2.0文件夾下是看不到日志文件的,在我們的項目的根目錄下打開dos窗口。dotnet restore 一下,然后dotnet run 一下訪問一下那個地址,之后再進入那個文件夾就可以看到日志文件了。

對這兩個文件進行說明一下,第一個是網站運行時所有的日志記錄,第二個只是有我們自己寫的異常日志記錄。

由於我要放在iis上,所以我要發布一下,在VS中直接發布也行,用 dotnet publish 進行發布也可以我用的是第一種,發布完成之后。這個時候我們如果直接運行的話,是沒有辦法運行原因是發布的時候。沒有將我們寫的nlog.config 文件放在發布的目錄中去,我們需要手動的將這個文件復制到我們的發布的目錄中。(另一中解決方法是:右擊文件->屬性->復制到輸出目錄)

之后設置一下發布的這個文件夾的權限,把Everyone這個角色添加進去,並給它讀寫的權限。

之后在iis上綁定這個發布的目錄,在應用程序池中把剛才綁定到iis上的網站,改為無托管模式。之后將網站重新啟動一下,在瀏覽器中運行輸入你綁定的域名。可以直接訪問這個網址了。

如果出現一下錯誤。請先進入發布程序的那個文件夾,執行一下dotnet run 如果項目可以成功運行,請檢查一下everyone是否有讀寫的權限,重啟一下iis服務器。如果都不行,請重新publish。就可以解決這個問題。

這是我運行之后的生成的日志文件目錄是publishoutput

 


免責聲明!

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



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