Net 项目你通过NLog+ELK 实现分布式日志,以及数据库存储。
首先准备
1.部署好ELK分布式日志系统(不会部署ELK看(278条消息) Linux系统ELK分布式日志docker-compose部署_不喜欢写代码的程序员的博客-优快云博客)。
2.Net 项目 并且安装Nuget包 NLog.Web.AspNetCore
然后开始起飞:
第二部:配置NLog的配置文件
<?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="Error"
internalLogFile="log/internalLog.txt"
>
<!-- enable asp.net core layout renderers -->
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<!-- the targets to write to -->
<targets>
<!-- sql日志target -->
<!--<target xsi:type="File" name="SqlLog" fileName="${currentdir}/log/sql/${shortdate}.log"
layout="${longdate} ${logger} ${uppercase:${level}}
${newline}${message} ${exception:format=tostring}${newline}" />-->
<!-- Tcp日志target -->
<target xsi:type="Network"
name="ownLog-tcp"
keepConnection="false"
address ="tcp://IP:4560/"
layout="${longdate} LogShareService API | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}"
/>
<target name="database" xsi:type="Database" dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data" >
<!-- connectionString="server=10.220.130.146;User Id=root;password=sa12345;Database=eProcurementDB" -->
<connectionString>${var:connectionString}</connectionString>
<commandText>
insert into `tbl_base_Loginfo` (`ErrorID`, `Application`, `Host`, `Type`, `Source`,`StatusCode`, `Message`, `User`, `TimeUtc`, `AllXml`, `Data`, `CreateDate`)
values
(UUID()
,@application
,@host
,@type
,@source
,@statuscode
,@message
,@user
,@timeUtc
,@allXml
,@data
,@createDate);
</commandText>
<parameter name="@application" layout="LogShareService Api" />
<parameter name="@host" layout="${machinename}" />
<parameter name="@type" layout="${level}" />
<parameter name="@source" layout="${logger}" />
<parameter name="@statuscode" layout="" />
<parameter name="@message" layout="${message}" />
<parameter name="@user" layout="${machinename}" />
<parameter name="@timeUtc" layout="${date}" />
<parameter name="@allXml" layout="${exception:StackTrace}" />
<parameter name="@data" layout="${exception:tostring}" />
<parameter name="@createDate" layout="${longdate}" />
</target>
</targets>
<!-- rules to map from logger name to target -->
<rules>
<!--<logger name="Microsoft.EntityFrameworkCore.Database.*"
writeTo="SqlLog" />-->
<!-- <logger name="*" minlevel="Error" writeTo="ErrorInfo" />-->
<!--测试只控制器中的日志记录到elk中,仅警告级别以上的日志会被写入 -->
<!--<logger name="Microsoft.*" minlevel="Trace" final="true" />-->
<!--<logger name="*" minlevel="Info" writeTo="ownLog-tcp" />
<logger name="*" minlevel="Error" writeTo="ownLog-tcp" />-->
<logger name="*" minlevel="Error" writeTo="database" />
</rules>
</nlog>
第三步:在Program 中进行NLog信息的配对 (我这里是.net6)
第四步:写一个错误方法 启动项目 执行查看结果
结果:
数据库已经存储到日志信息
ELK: