Asp.Net Core用NLog记录日志操作方法_实用技巧

来源:脚本之家  责任编辑:小易  

1、CORS的原理:CORS定义百一种跨域访问的机度制,可以让AJAX实现跨域访问。CORS 允许问一个答域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简版单,只需由服务器发送一个权响应标头即可www.zgxue.com防采集请勿采集本网。

需求

1.日志自动写入到数据库、写入到文件

服务器版本是多少

2.appsettings.json数据库连接更改后,不需要去改NLog中的连接地址,启动网站或项目时自动检测变动然后去更改,以appsettings.json为准,保持同步。

这是因为.net core为了跨平台,编译的方式使用的是dotnet publish-r 版本,例如发布到windows X64的机器上,使用的命令就应该是dotnet publish-r win-x64这样的命令进行发布。而运行方式呢,使用的是

3.写入日志时,除了NLog自带的字段,新增LogType自定义字段记录日志类型,例如网站日志、中间件日志等

查了一下,可以用命令行生成相应的文件: Scaffold-DbContext\"Server=.\\SQLExpress;Database=SchoolDB;Trusted_Connection=True;Microsoft.EntityFrameworkCore.SqlServer-OutputDir Models

4.统一的写日志方法,不用每次get一个logger对象(或依赖注入)来记日志

新框架没用过,.Net Core 2.0感觉应该是支持的。这里有一篇帖子,你可以参考一下。www.bamn.cn/course/volume/3991 实在不行你就转url吧,就像检测用户一样,凡是没有访问权限的都转到那个页面。

安装包

在nuget中安装NLogNLog.Web.AspNetCore ,这两个是NLog相关的包。

在asp.net core 里非常建议使用entity framework,因为新的entity framework core定义了一套接口标准,就如同ado.net一样,只要有厂家实现了这套接口就行,而且厂家的实现肯定会更好一些。在asp.

还需要安装NLog写入数据库的数据库适配器,我这里写入到MySQL数据库,所以安装MySql.Data

如果是写入到SQL server数据库,需要安装Microsoft.Data.SqlClient

NLog.config 配置文件内容

网站根目录下新建NLog.config配置文件,记得右击该文件“属性”,复制到输出目录:“始终复制”

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" autoReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="NlogRecords.log"> <!--Nlog内部日志记录为Off关闭。除非纠错,不可以设为Trace否则速度很慢,起码Debug以上--> <extensions> <add assembly="NLog.Web.AspNetCore" /> </extensions> <targets> <!--通过数据库记录日志 配置 dbProvider请选择mysql或是sqlserver,同时注意连接字符串,需要安装对应的sql数据提供程序 MYSQL: dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" connectionString="server=localhost;database=BaseMIS;user=root;password=123456" MSSQL: dbProvider="Microsoft.Data.SqlClient" connectionString="Server=127.0.0.1;Database=BaseMIS;User ID=sa;Password=123456" --> <target name="log_database" xsi:type="Database" dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" connectionString="server=192.168.137.10;database=TestNLog;user=root;password=mysql@local"> <commandText> INSERT INTO TblLogrecords (LogDate,LogLevel,LogType,Logger,Message,MachineName,MachineIp,NetRequestMethod ,NetRequestUrl,NetUserIsauthenticated,NetUserAuthtype,NetUserIdentity,Exception) VALUES (@LogDate,@LogLevel,@LogType,@Logger,@Message,@MachineName,@MachineIp,@NetRequestMethod ,@NetRequestUrl,@NetUserIsauthenticated,@NetUserAuthtype,@NetUserIdentity,@Exception); </commandText> <parameter name="@LogDate" layout="${date}" /> <parameter name="@LogLevel" layout="${level}" /> <parameter name="@LogType" layout="${event-properties:item=LogType}" /> <parameter name="@Logger" layout="${logger}" /> <parameter name="@Message" layout="${message}" /> <parameter name="@MachineName" layout="${machinename}" /> <parameter name="@MachineIp" layout="${aspnet-request-ip}" /> <parameter name="@NetRequestMethod" layout="${aspnet-request-method}" /> <parameter name="@NetRequestUrl" layout="${aspnet-request-url}" /> <parameter name="@NetUserIsauthenticated" layout="${aspnet-user-isauthenticated}" /> <parameter name="@NetUserAuthtype" layout="${aspnet-user-authtype}" /> <parameter name="@NetUserIdentity" layout="${aspnet-user-identity}" /> <parameter name="@Exception" layout="${exception:tostring}" /> </target> <target name="log_file" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} | ${level:uppercase=false} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" /> </targets> <rules> <!--跳过所有级别的Microsoft组件的日志记录--> <logger name="Microsoft.*" final="true" /> <!-- BlackHole without writeTo --> <!--只通过数据库记录日志,如果给了name名字,cs里用日志记录的时候,取logger需要把name当做参数--> <logger name="logdb" writeTo="log_database" /> <logger name="logfile" writeTo="log_file" /> </rules></nlog>

配置文件解读 nlog根节点: autoReload属性,true时,如果NLog.config文件有变动,会自动应用新配置(但是会有延迟,过几秒才会应用起来) internalLogLevel属性,设定后,输出的是NLog内部自己的日志记录,如果遇到NLog异常/配置文件没配好,可以把Off改为Trace或Debug来查看NlogRecords.log里的内容 internalLogFile属性,可以设定路径,例如默认的c:\temp\nlog-internal.log 新增了extensions节点,因为引用了NLog.Web.AspNetCore包 targets节点中是各种记录方式的配置第一个target节点,可以看到name是log_database,这里的name和下方logger中writeTo属性对应 xsi:type="Database",就是写入数据库了 dbProvider属性是数据库适配器,MySQL是MySql.Data.MySqlClient.MySqlConnection, MySql.Data,SQL server是Microsoft.Data.SqlClient,其他数据库适配器可在官方文档内查看 connectionString即连接字符串了 commandText子节点是插入数据库时insert语句,可以看到我这里是写入到TblLogrecords表,表结构下文会展示出来 parameter子节点是insert语句的各个参数: 有个name="@LogType"参数,layout="${event-properties:item=LogType}",表示@LogType参数的值从event-properties中的LogType中取,这个后文会写到用法其余参数均是NLog自带的内容,aspnet-开头的是NLog.Web.AspNetCore包中提供的方法 layout render官方文档 第二个target节点,可以看到name是log_file,这里的name和下方logger中writeTo属性对应 xsi:type="File",即写入到文件 fileName属性是文件名,这里是写入到当前目录下的logs文件夹,并且按日期归档 layout属性是写入日志的格式 rules节点是各个日志记录器logger的配置 第一个logger配置跳过所有Microsoft组件的日志记录,final 标记当前规则为最后一个规则。其后的规则即时匹配也不会被运行。第二个logger name="logdb",该日志记录器名为logdb,是适配log_database规则,即写入数据库,如果要适配多条规则,用逗号隔开其余规则可以参考https://www.zgxue.com/article/173004.htm  数据库配置数据表结构

这里数据库为TestNLog:

CREATE DATABASE IF NOT EXISTS `TestNLog`;USE `TestNLog`;-- Dumping structure for table TestNLog.TblLogrecordsCREATE TABLE IF NOT EXISTS `TblLogrecords` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `LogDate` datetime(6) NOT NULL, `LogLevel` varchar(50) NOT NULL, `LogType` varchar(50) DEFAULT NULL, `Logger` varchar(256) NOT NULL, `Message` longtext, `MachineName` varchar(50) DEFAULT NULL, `MachineIp` varchar(50) DEFAULT NULL, `NetRequestMethod` varchar(10) DEFAULT NULL, `NetRequestUrl` varchar(500) DEFAULT NULL, `NetUserIsauthenticated` varchar(10) DEFAULT NULL, `NetUserAuthtype` varchar(50) DEFAULT NULL, `NetUserIdentity` varchar(50) DEFAULT NULL, `Exception` longtext, PRIMARY KEY (`Id`)) ENGINE=InnoDB AUTO_INCREMENT=96 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

网站配置连接

appsettings.json中增加ConectionStrings节点:

"ConectionStrings": { "MySqlConnection": "server=192.168.137.10;database=TestNLog;user=root;password=mysql@local" }

统一日志记录方法

网站下新建CommonUtils文件夹,添加NLogUtil.cs文件(包含LogType定义):

using NLog;using NLog.Config;using System;using System.ComponentModel;using System.Linq;using System.Xml.Linq;namespace NLogUsage.CommonUtils{ public enum LogType { [Description("网站")] Web, [Description("数据库")] DataBase, [Description("Api接口")] ApiRequest, [Description("中间件")] Middleware } public static class NLogUtil { public static Logger dbLogger = LogManager.GetLogger("logdb"); public static Logger fileLogger = LogManager.GetLogger("logfile"); /// <summary> /// 写日志到数据库 /// </summary> /// <param name="logLevel">日志等级</param> /// <param name="logType">日志类型</param> /// <param name="message">信息</param> /// <param name="exception">异常</param> public static void WriteDBLog(LogLevel logLevel, LogType logType, string message, Exception exception = null) { LogEventInfo theEvent = new LogEventInfo(logLevel, dbLogger.Name, message); theEvent.Properties["LogType"] = logType.ToString(); theEvent.Exception = exception; dbLogger.Log(theEvent); } /// <summary> /// 写日志到文件 /// </summary> /// <param name="logLevel">日志等级</param> /// <param name="logType">日志类型</param> /// <param name="message">信息</param> /// <param name="exception">异常</param> public static void WriteFileLog(LogLevel logLevel, LogType logType, string message, Exception exception = null) { LogEventInfo theEvent = new LogEventInfo(logLevel, fileLogger.Name, message); theEvent.Properties["LogType"] = logType.ToString(); theEvent.Exception = exception; fileLogger.Log(theEvent); } /// <summary> /// 确保NLog配置文件sql连接字符串正确 /// </summary> /// <param name="nlogPath"></param> /// <param name="sqlConnectionStr"></param> public static void EnsureNlogConfig(string nlogPath, string sqlConnectionStr) { XDocument xd = XDocument.Load(nlogPath); if (xd.Root.Elements().FirstOrDefault(a => a.Name.LocalName == "targets") is XElement targetsNode && targetsNode != null && targetsNode.Elements().FirstOrDefault(a => a.Name.LocalName == "target" && a.Attribute("name").Value == "log_database") is XElement targetNode && targetNode != null) { if (!targetNode.Attribute("connectionString").Value.Equals(sqlConnectionStr))//不一致则修改 { //这里暂时没有考虑dbProvider的变动 targetNode.Attribute("connectionString").Value = sqlConnectionStr; xd.Save(nlogPath); //编辑后重新载入配置文件(不依靠NLog自己的autoReload,有延迟) LogManager.Configuration = new XmlLoggingConfiguration(nlogPath); } } } }}

配置NLog依赖注入

网站Program.cs文件中,在CreateHostBuilder方法中添加以下内容:

//using NLog.Web;.ConfigureLogging(logging => { logging.ClearProviders(); logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); }).UseNLog(); // NLog: 依赖注入Nlog

完成后如下图所示:

启动项目同步连接字符串

修改网站启动Program.cs中的逻辑:

//using NLogUsage.CommonUtils;//using Microsoft.Extensions.DependencyInjection;public static void Main(string[] args){ //CreateHostBuilder(args).Build().Run(); var host = CreateHostBuilder(args).Build(); try { using (IServiceScope scope = host.Services.CreateScope()) { IConfiguration configuration = scope.ServiceProvider.GetRequiredService<IConfiguration>(); //获取到appsettings.json中的连接字符串 string sqlString = configuration.GetSection("ConectionStrings:MySqlConnection").Value; //确保NLog.config中连接字符串与appsettings.json中同步 NLogUtil.EnsureNlogConfig("NLog.config", sqlString); } //throw new Exception("测试异常");//for test //其他项目启动时需要做的事情 //code NLogUtil.WriteDBLog(NLog.LogLevel.Trace, LogType.Web, "网站启动成功"); host.Run(); } catch (Exception ex) { //使用nlog写到本地日志文件(万一数据库没创建/连接成功) string errorMessage = "网站启动初始化数据异常"; NLogUtil.WriteFileLog(NLog.LogLevel.Error, LogType.Web, errorMessage, new Exception(errorMessage, ex)); NLogUtil.WriteDBLog(NLog.LogLevel.Error, LogType.Web, errorMessage, new Exception(errorMessage, ex)); throw; }}

修改完成后,如下图所示:

启动验证

启动项目,可以正常记录日志到数据库和文件:

以上就是本次介绍的全部相关知识点,感谢大家的学习和对真格学网的支持。

1、CORS的原理:CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。2、tomcat如何配置cors的跨域请求:在tomcat中,有一个和cors相关的拦截器:CORS Filter该过滤器可以通过添加必需的访问控制请求头Access-Control-*对象来进行跨域。同时还可以对一些请求进行拦截。如果请求是无效的,或者是不被允许的,该请求被拒绝或者禁止。其在web.xml文件中的基本配置如下:CorsFilterorg.apache.catalina.filters.CorsFiltercors.allowed.originscors.allowed.methodsGET,POST,HEAD,OPTIONS,PUTcors.allowed.headersContent-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Access-Control-Allow-Origincors.exposed.headersAccess-Control-Allow-Origin,Access-Control-Allow-Credentialscors.support.credentialstruecors.preflight.maxage10CorsFilterwxrefund/*3、cors.allowed.origins:允许访问资源的源列表。表示任何来源都可以访问该资源。否则,只有配置的白名单的来源可以访问该资源,其中白名单用逗号隔开,如,。4、cors.allowed.methods:允许访问的http请求方法,如GET,POST,HEAD,OPTIONS,PUT等,方法名用逗号隔开。5、cors.allowed.headers:在实际请求时可使用的请求头列表,用逗号隔开。如Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Access-Control-Allow-Origin。这些头也将返回作为访问控制的一部分内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • asp.net core与nlog集成的完整步骤
  • asp.net core开发教程之logging利用nlog写日志文件
  • 使用nlog给asp.net core做请求监控的方法
  • asp.net core部署前期准备 使用hyper-v安装ubuntu server 16.10
  • asp.net 安全的截取指定长度的html或者ubb字符串
  • c#.net 动态读取 走马灯代码实例分享
  • 用类的继承关系(重写父类的方法)实现简易后台代码模板
  • asp.net使用odp即oracle连接方式的的防注入登录验证程序
  • asp.net中动态控制rdlc报表
  • asp.net页面某些选项进行提示判断具体实现
  • asp.net+js实现的ajax sugguest搜索提示效果
  • .net基础之自定义泛型分析
  • .net开发:为程式码加上行号的方法详解
  • 如何在ASP NET Core中实现CORS跨域
  • 如何在ASP NET Core中实现CORS跨域
  • 请问:ASP.net mvc5和asp.net.core有什么区别呢?在今后的发展中这个前景怎么样?
  • ASP.net core是什么,和ASP.net一样吗?
  • iis挂载上asp.net core 之后成功了,但是每天都会出问题
  • asp.net core mvc 是不是未包含使用UA 动态选择displayModel
  • 请问asp.net core mvc怎么使用ef连接现有数据库?
  • Asp.Net Core 设置 .html 页为起始页
  • asp.net core里面,EF和NH哪个对Oracle的支持更好?
  • net core 可以开发 winform吗
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧asp.net core与nlog集成的完整步骤asp.net core开发教程之logging利用nlog写日志文件使用nlog给asp.net core做请求监控的方法asp.net core部署前期准备 使用hyper-v安装ubuntu server 16.10asp.net 安全的截取指定长度的html或者ubb字符串c#.net 动态读取 走马灯代码实例分享用类的继承关系(重写父类的方法)实现简易后台代码模板asp.net使用odp即oracle连接方式的的防注入登录验证程序asp.net中动态控制rdlc报表asp.net页面某些选项进行提示判断具体实现asp.net+js实现的ajax sugguest搜索提示效果.net基础之自定义泛型分析.net开发:为程式码加上行号的方法详解java正则表达式 pattern和matche未将对象引用设置到对象的实例 (asp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net汉字转拼音和获取汉字首字asp.net对路径"xxxxx"asp.net webapi连接数据库的方法asp.net mvc5网站开发咨询管理的架构(十linq重写博客垃圾图片回收算法.net core应用类型(portable apps & selvs2005 水晶报表在时部署时遇到的问题较为全面的asp.net提交验证方案分析 (上)asp.net_table控件の单元格纵向合并示例全面剖析.net环境下的缓存技术asp.net使用h5新特性实现异步上传的示例vb.net进度条的方法代码
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved