为什么要进行日志记录呢? 为什么要存至数据库呢? 只能说日志记录是每个系统都应当有的.
好的日志记录方式可以提供我们足够多定位问题的依据. 查找系统或软件或项目的错误或异常记录. 程序在运行时就像一个机器人, 我们可以从所记录的日志看出它正在做什么, 是不是按预期的设计在做, 用来判断运行状态是否是正常的.
日志中包括主机名, 时间, 日志级别, 日志消息, 异常明细, 异常类型.
NetCore 在包含 Startup 的项目上使用 Nuget 包管理工具添加 NLog.web.AspNetCore 依赖, 然后添加 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">
- <targets>
- <target xsi:type="Database" name="database"
- connectionString="Data Source=.;Initial Catalog=LogServer;User ID=sa;Password=123456;"
- commandText="insert into TestLog
- ([LogTime], [LogLevel], [Message],
- [Host],[ExpType],[MethodName],[ExDetail])
- values (@LogTime,@LogLevel, @Message,
- @Host,@ExpType,@MethodName,@ExDetail)
- ;">
- <parameter name="@Host" layout="${machinename}" />
- <parameter name="@LogTime" layout="${longdate}"/><!-- 日志发生时间 -->
- <parameter name="@LogLevel" layout="${level}"/><!-- 日志等级 -->
- <parameter name="@Message" layout="${message}"/><!-- 日志信息 -->
- <parameter name="@MethodName" layout="${callsite:methodName=true}" />
- <parameter name="@ExpType" layout="${exception:format=type}" />
- <parameter name="@ExDetail" layout="${exception:format=tostring}" />
- </target>
- </targets>
- <rules>
- <logger name="*" level="Fatal" writeTo="database"/>
- <logger name="*" level="Warn" writeTo="database"/>
- <logger name="*" level="Debug" writeTo="database"/>
- <logger name="*" level="Error" writeTo="database"/>
- <logger name="*" level="Info" writeTo="database"/>
- <logger name="*" level="Trace" writeTo="database"/>
- </rules>
- </nlog>
当中的 LogServer 是数据库名, TestLog 是表名.
然后再去数据库创建相对应的库与表, 建表语句:
- CREATE TABLE TestLog(
- [Id] [bigint] IDENTITY(1,1) NOT NULL,
- [Host] [varchar](350) NULL,
- [LogTime] [varchar](350) NULL,
- [LogLevel] [varchar](350) NULL,
- [Message] [varchar](max) NULL,
- [MethodName] [varchar](350) NULL,
- [ExpType] [varchar](350) NULL,
- [ExDetail] [varchar](max) NULL,
- CONSTRAINT [PK_TestLog] PRIMARY KEY CLUSTERED
- (
- [Id] ASC
- )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
- ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
然后在 Startup 的 构造函数中更改如下: 在构造函数中添加 IHostingEnvironment env
然后 env.ConfigureNLog("NLog.config");
- public Startup(IConfiguration configuration, IHostingEnvironment env)
- {
- env.ConfigureNLog("NLog.config");
- Configuration = configuration;
- }
然后在要添加 LogHelper 类的项目上使用 Nuget 包管理工具添加 NLog 依赖 LogHelper 代码如下:
- /// <summary>
- /// 日志记录类;
- /// 严重级别从小到大: Trace,Debug,Info,Warn,Error,Fatal
- /// </summary>
- public class LogHelper
- {
- /// <summary>
- /// NLog 的实例对象
- /// </summary>
- public static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
- }
在项目自带的 ValuesController 中添加一个测试写日志的方法
- [HttpGet]
- [Route("log")]
- public ActionResult TestLog()
- {
- LogHelper.Logger.Trace("测试日志");
- LogHelper.Logger.Debug("测试日志");
- LogHelper.Logger.Info("测试日志");
- LogHelper.Logger.Warn("测试日志");
- LogHelper.Logger.Error("测试日志");
- LogHelper.Logger.Fatal("测试日志");
- return Succeed();
- }
然后启动项目, 访问刚刚那个接口地址, 就可以看到日志表中已经添加进去这几个日志了.
到这里也就完成了日志记录到数据的操作了.
在下一篇中将介绍如何使用过滤器来进行全局异常处理, 处理那些未处理的异常或自定义抛出的异常.
有需要源码的在下方评论或私信~ 给我的 SVN 访客账户密码下载, 代码未放在 GitHub 上.
来源: https://www.cnblogs.com/levywang/p/coreframe_4.html