net Core 使用日志NLog
引用NLog.Web.AspNetCore
Startup中注册NLog 服务
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddNLog();//添加NLog app.AddNLogWeb(); env.ConfigureNLog("nlog.config");//读取Nlog配置文件 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }
添加NLog配置文件nlog.Conifg
<?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" throwExceptions="false" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> <!-- optional, add some variables https://github.com/nlog/NLog/wiki/Configuration-file#variables --> <variable name="myvar" value="myvalue"/> <!-- See https://github.com/nlog/nlog/wiki/Configuration-file for information on customizing logging rules and outputs. --> <targets> <target xsi:type ="File" name="file" header="------------------------------Start------------------------------" footer="------------------------------End------------------------------" fileName="${basedir}/Logs/${shortdate}.log" layout="${longdate} - ${level:uppercase=true}:${message} ${callsite:fileName=true} ${exception:format=Type,Message,Method,StackTrace:maxInnerExceptionLevel=5:innerFormat=ShortType,Message,Method,StackTrace}" keepFileOpen="false" archiveFileName="${basedir}/App_Data/Logs/Backup_${shortdate}.{##}.log" archiveNumbering="Sequence" archiveEvery="Day" maxArchiveFiles="30"> </target> <!-- add your targets here See https://github.com/nlog/NLog/wiki/Targets for possible targets. See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. --> <!-- Write events to a file with the date in the filename. <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> --> </targets> <rules> <!-- add your logging rules here --> <logger name="*" minlevel="Error" writeTo="file" /> <!-- Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" <logger name="*" minlevel="Debug" writeTo="f" /> --> </rules> </nlog>
<!--说明 xsi:type="File"指定输出到文件类型;fileName指定输出文件的存放位置和文件名(可自定义),其中 ${basedir}是程序所在的路径; ${shortdate}是日期(具体到日)。 layout指定输出文件内容的样式 ${level}是日志的等级; ${longdate}是日期(具体到毫秒), ${message}是具体要输出的内容。-->
简单封装NLog操作
定义一个ILogger接口 public interface ILogger { void Debug(string message); void Debug(string message, Exception exception); void Error(string message); void Error(string message, Exception exception); void Fatal(string message); void Fatal(string message, Exception exception); void Info(string message); void Info(string message, Exception exception); void Warn(string message); void Warn(string message, Exception exception); } 定义一个NLogLogger类 public class NLogLogger : ILogger { private readonly Logger logger = LogManager.GetCurrentClassLogger(); public void Debug(string message) { logger.Debug(message); } public void Debug(string message, Exception exception) { logger.Debug(exception, message); } public void Error(string message) { logger.Error(message); } public void Error(string message, Exception exception) { logger.Error(exception, message); } public void Fatal(string message) { logger.Fatal(message); } public void Fatal(string message, Exception exception) { logger.Fatal(exception, message); } public void Info(string message) { logger.Info(message); } public void Info(string message, Exception exception) { logger.Info(exception, message); } public void Warn(string message) { logger.Warn(message); } public void Warn(string message, Exception exception) { logger.Warn(exception, message); } }
在全局异常过滤器中简单使用
定义一个ExpFilter类 继承IExceptionFilter public class ExpFilter : IExceptionFilter { readonly ILoggerFactory _loggerFactory; readonly IHostingEnvironment _env; public ExpFilter(ILoggerFactory loggerFactory, IHostingEnvironment env) { _loggerFactory = loggerFactory; _env = env; } public void OnException(ExceptionContext context) { Exception exp = context.Exception; Exception innerEx = exp.InnerException == null ? exp : exp.InnerException; while (innerEx.InnerException != null) { innerEx = innerEx.InnerException; } NLogLogger nlog = new Blog.Common.Log.NLogLogger(); bool isAjaxCall = context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest"; if (isAjaxCall) { nlog.Error(innerEx.Message); JsonConvert.SerializeObject(new { status = 1, msg = "请求发生错误,请联系管理员" }); } else { nlog.Error("Error", exp); ViewResult viewResult = new ViewResult(); viewResult.ViewName = "~/Views/Shared/Error.cshtml"; context.Result = viewResult; ; } context.ExceptionHandled = true; } }
在Startup添加全局异常过滤器
services.AddMvc(option=> option.Filters.Add<ExpFilter>());
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)