asp.net core 使用NLog记录日志到txt文件
一、使用VisualStudioCode创建一个webapi项目(也可以是mvc等)、一个类库(用于封装记录日志方法,当然如果使用依赖注入到控制台项目,就不需要此类库了)。
二、在类库中添加NLog、NLog.Web.AspNetCore引用(NLog.Web.AspNetCore 是为 ASP.NET Core 添加了对于 NLog 的平台支持),
webapi项目添加对该类库的引用,这样控制台就无需添加nlog的引用了。
三、在类库中自定义类,简单封装记录日志方法,代码如下:
using System; using Microsoft.Extensions.Logging; using NLog; namespace common { public class NLogHelper { //每创建一个Logger都会有一定的性能损耗,所以定义静态变量 private static Logger nLogger = LogManager.GetCurrentClassLogger(); public static void Info(string msg) { nLogger.Info(msg); } public static void Error(string msg, Exception ex = null) { if (ex == null) nLogger.Error(msg); else nLogger.Error(ex,msg); } } }
四、webapi项目配置NLog
1、添加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" throwConfigExceptions="true" autoReload="true"> <!--加载ASP.NET Core插件--> <extensions> <add assembly="NLog.Web.AspNetCore"/> </extensions> <!--输出目的地--> <targets> <!--输出到文件,记录level为info的日志--> <target xsi:type="File" name="info-file" layout="${longdate}|${uppercase:${level}}|${event-properties:item=EventId.Id}${newline}位置:${callsite:className=True:methodName=True:fileName=True:includeSourcePath=True:skipFrames=1}${newline}${message}${newline}${exception}${newline}" fileName="c:\logfiles\api\info-${shortdate}.log" archiveFileName="c:\logfiles\info-${shortdate}.log" archiveAboveSize="10485760" archiveNumbering="Rolling" concurrentWrites="true" maxArchiveFiles="100000" keepFileOpen="false" /> <!--输出到文件,记录level为error的日志--> <target xsi:type="File" name="error-file" layout="${longdate}|${uppercase:${level}}|${event-properties:item=EventId.Id}${newline}位置:${callsite:className=True:methodName=True:fileName=True:includeSourcePath=True:skipFrames=1}${newline}${message}${newline}${exception}${newline}" fileName="c:\logfiles\api\error-${shortdate}.log" archiveFileName="c:\logfiles\error-${shortdate}.log" archiveAboveSize="10485760" archiveNumbering="Rolling" concurrentWrites="true" maxArchiveFiles="100000" keepFileOpen="false" /> <!--write to the void aka just remove--> <target xsi:type="Null" name="blackhole" /> </targets> <!--写入目的地的规则--> <rules> <!--记录level为info的日志--> <!-- 跳过以Microsoft.*开头的日志 --> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> <logger name="*" level="Info" writeTo="info-file" /> <!--记录level为error的日志--> <logger name="*" level="Error" writeTo="error-file" /> </rules> </nlog>
nlog 节点必须是 xml 文件的根节点,包含三个主要的子节点:extensions、targets、rules。
extensions节点:用来加载nlog扩展工具,这里加载NLog.Web.AspNetCore 是为 ASP.NET Core 添加了对于 NLog 的平台支持。
targets节点:包含输出的日志的一些设置(比如的日志的路径、类型、布局、txt文件的分割等)。
rules节点:将需要日志级别关联到targets里设置的日志。
targets节点的子节点描述:
layout表示输出日志到txt的排版格式
fileName表示txt文件名,这里我把日志文件存在在C盘(linux系统,改下路径即可)
maxArchiveFiles表示滚动日志文件上限数
archiveFileName表示滚动日志存放路径,超过单个文件大小,会生成如error-2019-03-30.1.log的文件
archiveAboveSize表示每个日志文件大小的最大值(单位:字节),10485760=10M
2、在 Startup.cs的Configure方法配置nlog,如下:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } //配置NLog Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//这是为了防止中文乱码 loggerFactory.AddNLog();//添加NLog env.ConfigureNLog("nlog.config");//读取Nlog配置文件 app.UseHttpsRedirection(); app.UseMvc(); }
五、使用NLog
在webapi的HomeController里代码如下:
[Route("api/Home/[action]")] [ApiController] public class HomeController : ControllerBase { public ActionResult<IEnumerable<string>> Get() { NLogHelper.Info("这是info日志"); NLogHelper.Error("这是error日志",new Exception("测试")); //这里随便返回一下 return new string[] { "value1", "value2" }; } }
运行:https://localhost:5001/api/home/get
在C盘生成文件,如下:
打开txt文件,日志格式如下:
六、源码
码云:https://gitee.com/qk2017/CoreNLogDemo
CSDN:https://download.csdn.net/download/coderk2014/11074608