最近研究了一下NLog的使用方式,简单的入了一下门。html
实现的功能,对于不一样的日志,进行不一样的记录,分别有系统运行日志,和我的在程序中写的异常日志。发布以后放在了IIS上。进行查看日志的信息web
参考了两篇博客。 docker
1.http://www.voidcn.com/blog/aojiancc2/article/p-6672009.html 2.http://www.cnblogs.com/linezero/p/Logging.html
我的以为仍是第一篇写的详细。第二篇多是大神写的吧,一些细节并没哟特别的注意到。json
那两篇博客已经写很详细了,我再重复一下,以及提醒一下像我同样的小菜们,须要注意的事项,以及我的在其中的一些疑惑。windows
首先咱们建一个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 文件app
添加下边的代码ide
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