在项目开发中,日志系统是系统的一个重要组成模块,经过在程序中记录运行日志、错误日志,可让咱们对于系统的运行状况作到很好的掌控。同时,收集日志不只仅能够用于诊断排查错误,因为日志一样也是大量的数据,经过对这些数据进行集中分析,能够产生极大的价值。
在微服务的系统架构中,因为一个系统会被拆成不少个功能模块,每一个模块负责不一样的功能,对于日志系统的要求也会更高,比较常见的有 EFLK(ElasticSearch + Filebeat + LogStash + Kibana) 方案,而对于咱们这种单体应用来讲,因为程序的代码比较集中,因此咱们主要采用手写日志帮助类或是使用第三方组件的形式进行日志信息的记录。html
系列目录地址:ASP.NET Core 项目实战
仓储地址:https://github.com/Lanesra712/Grapefruit.VuCoregit
在 ASP.NET Core 中,巨硬为咱们提供了一个 ILogger 接口,经过 ILogger 接口,咱们能够很方便的将日志信息输出到控制台中,不过,在控制台中查看日志信息会显得不太方便,所以,咱们能够经过实现该接口或是直接使用第三方的框架来实现将日志信息记录到别的存储介质中。github
在 .NET Framework 时代,对于第三方的日志框架的选择,绝大多数童鞋首选的都会是 log4net 这一根据 Log4j 移植的日志框架,不过,因为 log4net 目前已经接近有3年的时间没更新了,因此就不在考虑范围内。综合比较下官方文档中推荐的几款第三方日志框架,最终仍是选择 NLog 这一目前使用人数相对来讲比较多的框架,毕竟用户多的话,遇到什么问题也好找资料。web
一般,咱们会将日志信息记录到 txt or log 文件中,虽然你能够经过修改日志布局让日志信息具备良好的可读性,不过在信息多的状况下查阅时仍是会显得不太方便。由于不只作到对于错误信息作到记录,还须要记录程序在运行时的访问日志,因此将日志信息写入到关系型数据库中就不是特别合适了。mongodb
而 MongoDB 做为一个文档型的 NoSQL 数据库,相比于传统的关系型数据库,NoSQL 数据库具备更好的扩展性、以及能提供更出色的性能,所以,我最终选择将日志信息记录到 MongoDB 中。固然,最主要的缘由仍是目前在工做中有开始尝试用 MongoDB 存储用户上传的文件,在找资料的过程当中看到有使用 MongoDB 存储日志的案例,Grapefruit.VuCore 既然做为一个学习项目,因此就要多尝试尝试啊。shell
由于是第一次使用 MongoDB,因此咱们须要提早安装 MongoDB Server,我是直接安装到个人开发机上(Windows 10),因此这里只是演示如何在 Windows 上进行 MongoDB 的安装与配置,如何在 Linux or Docker 中进行安装配置,我将在后面的文章中进行演示。毕竟,这个项目的最终准备经过 Docker 部署到 Linux 上的,总在 Windows 上玩是不合适滴。数据库
首先,打开 MongoDB 官网获取到咱们的安装包下载地址(MongoDB Community Download),选择 Server tab 后按照咱们的操做系统选择安装包下载便可。json
双击下载好的 msi 文件,开始安装,这里我选择 Complete(完整)安装,若是你想要指定安装的组件和安装的位置,你能够选择 Custom(自定义安装)。windows
在 MongoDB 以前的版本中,若是咱们须要将 MongoDB Server 做为 Windows 服务,须要咱们在安装完成以后进行配置,可是从 MongoDB 4.0 开始,咱们就能够在安装期间直接配置和启动咱们的 MongoDB 做为 Windows 服务了,当咱们安装成功后就会自动启动 MongoDB 服务。嗯,相信我,若是你上网搜索 Windows 下的 MongoDB 安装,你会发现 90% 的文章由于是针对 MongoDB 以前版本的,都会在安装完成以后须要你指定日志地址、指定存储地址,配置 Windows 服务啊,而若是你和我同样,安装的是 MongoDB 4.0 以上的版本,这些通通都不要,是否是很超值。架构
这里勾选上 Install MongoD as a Service,当咱们安装完成后就会自动启动 MongoDB 服务,同时,对于这里的配置项,咱们不作任何的改动。
Service Name:建立的 Windows 服务名称,若是已经存在了,则须要更换名称
Data Directory:存储数据的目录
Log Directory:存储 MongoDB Log 日志的目录
点击 Next 以后,安装程序会询问你是否须要安装 MongoDB Compass,MongoDB Compass 是官方的一个可视化管理工具,毕竟老是用黑乎乎的 shell 仍是不太方便的,这里看你本身的需求,决定是否安装这个工具。
当咱们安装完成后,MongoDB 的服务也就已经启动了,此时,你就能够链接上你的 MongoDB Server 了,这里我是使用 Navicat 进行链接。对于这个服务,你一样能够在计算机管理中对这个服务进行管理。
在默认状况下,当咱们安装好 MongoDB 后是不容许远程访问以及不存在任何的用户权限的。而这些,在咱们正式使用中都是须要考虑的。
首先,配置咱们的 MongoDB Server 以容许用户进行远程访问。找到程序安装路径下面的 mongod.cfg 文件(若是你使用的是默认配置,则该文件位于 C:\Program Files\MongoDB\Server\4.0\bin),修改 bindIp 属性值为 0.0.0.0,重启 MongoDB 服务,确保 27017 端口外界能够访问后,则能够远程访问咱们的 MongoDB 服务。
当咱们容许远程访问咱们的 MongoDB 服务后,咱们更应该为 MongoDB 配置权限。与咱们常用的 SQL Server 或是 MySQL 不一样,MongoDB 中的权限是针对每个数据库的,也就是说咱们须要为使用到的数据库建立用户并配置权限。
打开 Navicat,链接安装好的 MongoDB 服务。
第一步将默认数据库切换到 admin 数据库,建立一个管理员用户,这里我就将管理员用户的角色设置为 root 用户。
//切换到 admin 数据库 use admin //建立一个管理员用户 db.createUser( { user: "user name", pwd: "user password", roles: [ { role: "root", db: "admin" } ] } )
当咱们建立好管理员用户后,咱们就能够为数据库配置用户与权限了。右击链接名称,新建一个数据库 GrapefruitVuCore,切换到 GrapefruitVuCore 数据库后,新建一个能够读写的用户 grapefruit。用户都建立完成后,关闭咱们的 MongoDB 链接。
//切换到 admin 数据库 use GrapefruitVuCore //建立一个管理员用户 db.createUser( { user: "grapefruit", pwd: "grapefruit", roles: [ { role: "readWrite", db: "GrapefruitVuCore" } ] } )
当用户已经建立完成以后,咱们就能够修改配置文件,启用权限控制。仍是在 mongod.cfg 中,取消 security 节点的注释,添加受权配置,修改完成后,重启服务,此时,MongoDB 就必须经过帐户密码登陆了。
当服务重启以后,若是你仍是按照以前的方式链接,则会提示你权限不足,你须要修改 Navicat 的链接配置。将验证方式修改为 Password,输入帐户、密码,并指定须要登陆的数据库,从新链接便可。
PS:这里,我使用帐户、密码登陆进入 GrapefruitVuCore 后,右侧的链接下面是没有显示这个数据库的,但这个数据库是真实存在的,不晓得这是个啥问题。
MongoDB 内置的用户角色权限:
read:容许用户读取受权的数据库
readWrite:容许用户读写受权的数据库
dbAdmin:容许用户在受权的数据库中执行管理操做,如索引建立、删除,查看统计或访问system.profile
userAdmin:容许用户向 system.users 集合写入,能够在指定数据库里建立、删除和管理用户
clusterAdmin:只在 admin 数据库中可用,赋予用户全部分片和复制集相关函数的管理权限。
readAnyDatabase:只在 admin 数据库中可用,赋予用户全部数据库的读权限
readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户全部数据库的读写权限
userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户全部数据库的 userAdmin 权限
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户全部数据库的 dbAdmin 权限。
root:只在admin数据库中可用。超级帐号,超级权限
当咱们安装配置好 MongoDB 后,有了存储日志信息的介质,咱们就可使用 NLog 来记录咱们的程序日志信息了。首先,咱们须要为项目中添加对于 NLog 的引用,右击 Grapefruit.WebApi 打开管理 Nuget 程序包页面或是使用程序包管理器控制台选中默认项目为 Grapefruit.WebApi,添加 NLog、NLog.Web.AspNetCore、NLog.Mongo。
Install-Package NLog Install-Package NLog.Web.AspNetCore Install-Package NLog.Mongo
NLog 和 NLog.Web.AspNetCore 为 ASP.NET Core 添加了对于 NLog 的平台支持,在 NLog 中,咱们能够经过继承 NLog.Targets.TargetWithLayout 来为 NLog 添加更多的输出介质支持,而 NLog.Mongo 就是为 NLog 添加输出日志信息到 MongoDB 的支持。嗯,尝试了本身写,一直有问题,最后仍是用的别人写好的,哈哈哈,水平太菜。
当咱们添加好引用后,在 Grapefruit.WebApi 下添加一个 NLog 的配置文件 nlog.config(文件名所有须要小写),右键 nlog.config,打开属性窗口,将复制到输出目录修改为较新才复制或是老是复制均可以。
在配置文件中,nlog 节点必须是 xml 文件的根节点,同时包含三个主要的子节点:extensions、targets、rules。
extensions:当你不只仅只使用 NLog 这一个基础的 dll ,并使用了一些基于 NLog 扩展的工具时,你就须要在 extensions 节点下面添加引用的程序集名称。例如,这里,我添加了 NLog.Web.AspNetCore 这个程序集从而达到 NLog 对于 ASP.NET Core 的支持,以及添加了 NLog.Mongo 这个程序集用来将日志信息输出到 MongoDB 中。
targets:targets 节点下包含了咱们须要输出的日志的信息内容以及日志信息的布局,例如,这里我按照日期输出两个文件 nlog-all-date.log 和 nlog-own-date.log,分别记录全部的日志信息以及咱们自定义记录的信息。由于咱们是须要将日志信息写入 MongoDB 中的,这里我也添加了一个子节点用来设置写入 MongoDB 数据库中的数据字段。
rules:rules 节点是将须要记录的日志级别关联到记录日志的方式上。这里,我是将只要是 Trace 以上的都进行日志记录。
<?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" internalLogLevel="info" internalLogFile="c:\Temp\GrapefruitVuCore\internal-nlog.txt"> <!-- enable asp.net core and mongodb layout renderers --> <extensions> <add assembly="NLog.Web.AspNetCore"/> <add assembly="NLog.Mongo"/> </extensions> <!--internal-nlog:NLog启动及加载config信息--> <!--nlog-all:全部日志记录信息--> <!--nlog-own:自定义日志记录信息--> <!-- the targets to write to --> <targets> <!-- write logs to file --> <target xsi:type="File" name="allfile" fileName="c:\Temp\GrapefruitVuCore\nlog-all-${shortdate}.log" layout="日志记录时间:${longdate}${newline}日志级别:${uppercase:${level}}${newline}日志来源:${logger}${newline}日志信息:${message}${newline}错误信息:${exception:format=tostring}${newline}==============================================================${newline}" /> <!-- another file log, only own logs. Uses some ASP.NET core renderers --> <target xsi:type="File" name="ownFile-web" fileName="c:\Temp\GrapefruitVuCore\nlog-own-${shortdate}.log" layout="日志记录时间:${longdate}${newline}日志级别:${uppercase:${level}}${newline}日志来源:${logger}${newline}日志信息:${message}${newline}错误信息:${exception:format=tostring}${newline}url: ${aspnet-request-url}${newline}action: ${aspnet-mvc-action}${newline}==============================================================${newline}" /> <!-- write log to mongodb--> <target xsi:type="Mongo" name="mongo" databaseName="GrapefruitVuCore" collectionName="Logs" connectionString="mongodb://grapefruit:grapefruit@localhost:27017/GrapefruitVuCore" cappedCollectionSize="26214400"> <property name="LongDate" layout="${longdate}" bsonType="DateTime" /> <property name="Level" layout="${level}" /> <property name="Logger" layout="${logger}"/> <property name="Message" layout="${message}" /> <property name="Exception" layout="${exception:format=tostring}" /> <property name="Url" layout="${aspnet-request-url}" /> <property name="Action" layout="${aspnet-mvc-action}" /> <property name="UserName" layout="${windows-identity}" /> </target> </targets> <!-- rules to map from logger name to target --> <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" /> <!--Skip non-critical Microsoft logs and so log only own logs--> <logger name="Microsoft.*" maxLevel="Info" final="true" /> <!-- BlackHole without writeTo --> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> <!--Add logs to mongodb--> <logger name="*" minlevel="Trace" writeTo="mongo"/> </rules> </nlog>
当咱们设置好配置文件后就能够在 Program.cs 中启用 NLog 去记录日志。运行咱们的项目后,就能够查看记录的日志信息了,这里我在 txt 文件中和 MongoDB 中都有记录日志信息,具体看你本身的需求了。
public class Program { public static void Main(string[] args) { //加载日志配置信息文件后去捕获全部的错误 var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger(); try { logger.Info("Init Log API Information"); CreateWebHostBuilder(args).Build().Run(); } catch (Exception ex) { logger.Error(ex, "Stop Log Information Because Of Exception"); } finally { LogManager.Shutdown(); } } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .ConfigureLogging(logging => { logging.ClearProviders();//移除其它已经注册的日志处理程序 logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);//记录最小日志级别 }) .UseNLog();//注入 NLog 服务 }
另外,在 appsettings.json 中指定的 Logging 配置会覆盖任何对于 SetMinimumLevel 方法的调用。所以,你能够删除配置文件中的 default 属性,或是根据你本身的须要进行调整。
{ "Logging": { "LogLevel": { "Default": "Trace", "Microsoft": "Information" } } }
本章主要是演示如何在 Windows 上安装 MongoDB Server 以及在 ASP.NET Core 项目中使用 NLog 将日志信息记录到 MongoDB 中。在咱们使用这些这些第三方开源框架时,可能会遇到不少问题,当你没法解决的时候,项目的 Issue 是个好地方,多搜搜,很大可能你就会获得解决方案。