Asp.Net Core NLog 将日志输出到数据库以及添加LayoutRenderer的支持
在这之前打算用Apache的Log4Net,但是发现其AdoNetAppender方法已经不存在了,无法使用配置文件直接输出到数据库了,因此我便改用了NLog框架。
一、对项目添加NLog
通过Nuget安装NLog NLog.Extensions.Logging、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"
autoReload="true"
internalLogLevel="Trace"
internalLogFile="internal-nlog.txt">
<!-- define various log targets -->
<targets>
<!-- write logs to file -->
<target xsi:type="File" name="allfile" fileName="{longdate}|{logger}|{message} ${exception}"/>
<target xsi:type="File" name="ownFile-web" fileName="{longdate}|{logger}|{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的应用
- <targets/>定义日志的目标/输出
- type - 目标的类型 - 比如“File”,“Database”,“Mail”。如果你使用了名字空间,这个属性会被命名为 xsi:type.
- <rules /> - 定义日志的路由规则
- <extensions /> - 从*.dll加载NLog扩展
- <include /> - 导入外部配置文件
- <variable /> - 为配置变量赋值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构