在这之前打算用Apache的Log4Net,但是发现其AdoNetAppender方法已经不存在了,无法使用配置文件直接输出到数据库了,因此我便改用了NLog框架。
一、对项目添加NLog
通过Nuget安装NLog NLog.Extensions.Logging、NLog.Web.AspNetCore
二、对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" internalLogLevel="Trace" internalLogFile="internal-nlog.txt"> <!-- define various log targets --> <targets> <!-- write logs to file --> <target xsi:type="File" name="allfile" fileName="${var:configDir}nlog-all.log" layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}"/>
<target xsi:type="File" name="ownFile-web" fileName="${var:configDir}nlog-own.log" layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}| ${message} ${exception} " />
<target xsi:type="Null" name="blackhole" />
<target name="database" xsi:type="Database"> <connectionString>${var:connectionString}</connectionString> <commandText> INSERT INTO [dbo].[System_SqlLog] ([SqlLogId] ,[CreateUserId] ,[CreateUserCode] ,[CreateUserName] ,[CreateTime] ,[OperateSql] ,[EndDateTime] ,[ElapsedTime] ,[Parameter]) VALUES (@SqlLogId ,@CreateUserId ,@CreateUserCode ,@CreateUserName ,@CreateTime ,@OperateSql ,@EndDateTime ,@ElapsedTime ,@Parameter); </commandText> <parameter name="@SqlLogId" layout="${event-context:item=SqlLogId}"/> <parameter name="@CreateUserId" layout="${event-context:item=CreateUserId}" /> <parameter name="@CreateUserCode" layout="${event-context:item=CreateUserCode}"/> <parameter name="@CreateUserName" layout="${event-context:item=CreateUserName}"/> <parameter name="@CreateTime" layout="${event-context:item=CreateTime}"/> <parameter name="@OperateSql" layout="${event-context:item=OperateSql}" /> <parameter name="@EndDateTime" layout="${event-context:item=EndDateTime}" /> <parameter name="@ElapsedTime" layout="${event-context:item=ElapsedTime}" /> <parameter name="@Parameter" layout="${event-context:item=Parameter}" /> </target> </targets> <rules> <!--All logs, including from Microsoft--> <logger name="*" minlevel="Trace" writeTo="allfile" />
<!--Skip Microsoft logs and so log only own logs--> <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" /> <logger name="SqlLogToDatabase" minlevel="Debug" writeTo="database" /> <logger name="*" minlevel="Trace" writeTo="ownFile-web" /> </rules> </nlog>
- Nlog节点如果设置 InternalLogLevel,internalLogFile 可以查看NLog输出日志时的内部信息,并且可以再里面检查配置文件错误等。
- database target内可以指定connectionString,Sql语句,Sql参数等
三、添加NLog到 .Net Core中
四、执行
public virtual void WriteLog() { Logger iLog = LogManager.GetCurrentClassLogger(); if (iLog.IsInfoEnabled) { LogEventInfo ei = new LogEventInfo(NLog.LogLevel.Info, "", ""); ei.Properties["SqlLogId"] = CombUtil.NewComb(); iLog.Info(ei); } }
这样便可以将定义的值添加到数据库中。
五、LayoutRenderer的应用
根据上面的操作并满足不了我当前框架的应用,我所需要的是直接传对象,但是直接iLog.Info(T);并不会获取到值,他会获取到空值。
在这里操作的话就得需要自定义LayoutRenderer。
这个我们可以看出他是一个泛型方法,所以往里面插入对象是可行的。下面我说一下怎么重写LayoutRenderer。直接上代码
Append会返回一个数据给当前调用者。然后我们再修改一下配置文件NLog.config。
并且我们还需要加载此程序集
这样就会将对应的值插入到我们的数据库中了。
- <targets/>定义日志的目标/输出
- type - 目标的类型 - 比如“File”,“Database”,“Mail”。如果你使用了名字空间,这个属性会被命名为 xsi:type.
- <rules /> - 定义日志的路由规则
- <extensions /> - 从*.dll加载NLog扩展
- <include /> - 导入外部配置文件
- <variable /> - 为配置变量赋值