最近研究了一下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>
在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