一学就废 發表於 2025-6-20 16:16:01

.NET4.7使用NLog记录日志到数据库表

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1. 首先安装必要的NuGet包</a></li><li><a href="#_label1">2. 配置NLog.config文件</a></li><li><a href="#_label2">3. 创建数据库表</a></li><li><a href="#_label3">4. 在代码中使用NLog记录登录日志&nbsp;</a></li><li><a href="#_label4">5. 使用示例&nbsp;</a></li></ul></div><p class="maodian"><a name="_label0"></a></p><h2>1. 首先安装必要的NuGet包</h2>
<p>在项目中安装以下NuGet包:</p>
<ul><li>NLog</li><li>NLog.Config (可选,用于自动生成配置文件)</li></ul>
<p>相应的数据库提供程序(如System.Data.SqlClient for SQL Server)</p>
<div class="jb51code"><pre class="brush:asm;">Install-Package NLog
Install-Package NLog.Config
Install-Package System.Data.SqlClient
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>2. 配置NLog.config文件</h2>
<p>在项目中添加或修改NLog.config文件:</p>
<div class="jb51code"><pre class="brush:xml;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;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\nlog-internal.log"&gt;

&lt;extensions&gt;
    &lt;add assembly="NLog" /&gt;
&lt;/extensions&gt;

&lt;targets&gt;
    &lt;!-- 数据库目标 --&gt;
    &lt;target name="database"
            xsi:type="Database"
            connectionString="YourConnectionStringHere"
            commandText="INSERT INTO LoginLogs(ID, LoginName, Message, CreateTime) VALUES(@ID, @LoginName, @Message, @CreateTime)"&gt;
      
      &lt;parameter name="@ID" layout="${guid}" /&gt;
      &lt;parameter name="@LoginName" layout="${event-properties:item=LoginName}" /&gt;
      &lt;parameter name="@Message" layout="${message}" /&gt;
      &lt;parameter name="@CreateTime" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}" /&gt;
    &lt;/target&gt;
&lt;/targets&gt;

&lt;rules&gt;
    &lt;logger name="*" minlevel="Info" writeTo="database" /&gt;
&lt;/rules&gt;
&lt;/nlog&gt;</pre></div>
<p>&nbsp;如果需要使用异步记录日志的话,配置如下:</p>
<div class="jb51code"><pre class="brush:xml;">&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;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\nlog-internal.log"&gt;

&lt;extensions&gt;
    &lt;add assembly="NLog" /&gt;
&lt;/extensions&gt;

&lt;targets async="true"&gt; &lt;!-- 启用全局异步 --&gt;
    &lt;!-- 异步数据库目标 --&gt;
    &lt;target name="asyncDatabase" xsi:type="AsyncWrapper"
            queueLimit="10000"
            overflowAction="Discard"&gt;
      &lt;target xsi:type="Database"
            connectionString="YourConnectionStringHere"
            commandText="INSERT INTO LoginLogs(ID, LoginName, Message, CreateTime) VALUES(@ID, @LoginName, @Message, @CreateTime)"&gt;
      
      &lt;parameter name="@ID" layout="${guid}" /&gt;
      &lt;parameter name="@LoginName" layout="${event-properties:item=LoginName}" /&gt;
      &lt;parameter name="@Message" layout="${message}" /&gt;
      &lt;parameter name="@CreateTime" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}" /&gt;
      &lt;/target&gt;
    &lt;/target&gt;
&lt;/targets&gt;

&lt;rules&gt;
    &lt;logger name="*" minlevel="Info" writeTo="asyncDatabase" /&gt;
&lt;/rules&gt;
&lt;/nlog&gt;</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3. 创建数据库表</h2>
<p>确保你的数据库中有对应的表结构:</p>
<div class="jb51code"><pre class="brush:sql;">CREATE TABLE LoginLogs (
    ID UNIQUEIDENTIFIER PRIMARY KEY,
    LoginName NVARCHAR(100),
    Message NVARCHAR(MAX),
    CreateTime DATETIME
)
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>4. 在代码中使用NLog记录登录日志&nbsp;</h2>
<div class="jb51code"><pre class="brush:csharp;">using NLog;

public class LoginService
{
    private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

    public void LogLoginAttempt(string loginName, string message, bool isSuccess)
    {
      var logEvent = new LogEventInfo
      {
            Level = isSuccess ? LogLevel.Info : LogLevel.Warn,
            Message = message
      };
      
      logEvent.Properties["LoginName"] = loginName;
      
      Logger.Log(logEvent);
    }
}</pre></div>
<p class="maodian"><a name="_label4"></a></p><h2>5. 使用示例&nbsp;</h2>
<div class="jb51code"><pre class="brush:csharp;">var loginService = new LoginService();

// 成功登录
loginService.LogLoginAttempt("john.doe", "User logged in successfully", true);

// 失败登录
loginService.LogLoginAttempt("john.doe", "Invalid password", false);
</pre></div>
頁: [1]
查看完整版本: .NET4.7使用NLog记录日志到数据库表