使用 Log4Net 记录登录详细信息



我已经使用 Log4Net 将调试和错误数据记录到我的 Web API v2 应用程序中的文件中。我还想将用户的名称和他们登录的 IP 地址记录到数据库表 (SQL Server) 中。

我想我会通过添加第二个追加器而不是滚动我自己的服务来重用 Log4Net 功能。这听起来是个好主意,还是最好创建自己的服务来处理这个问题?Log4Net有很多额外的功能来记录跟踪,异常详细信息等。我建议的用法与日志记录错误无关。与更新实体并保存更改以保存登录详细信息相比,使用 Log4Net 是否有任何性能优势?

如果是,我该如何获取登录用户的用户名并将其传递给Log4Net?我会创建一个消息参数并传递用户名,就像我在下面所做的那样吗?猜猜我对如何将特定数据传递到 Log4Net 感到困惑。

<appender
  name="AdoNetAppender"
  type="log4net.Appender.AdoNetAppender">
  <threshold>INFO</threshold>
  <bufferSize
    value="50" />
  <connectionType
    value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionString
    value="data source=DBServerName;initial catalog=MyDatabaseName;integrated security=true; />
  <commandText
    value="INSERT INTO Logs ([Date],[UserName],[HostName]) VALUES (@log_date, @username, @hostname)" />
  <parameter>
    <parameterName value="@log_date" />
    <dbType value="DateTime" />
    <layout type="log4net.Layout.RawTimeStampLayout" />
  </parameter>
  <parameter>
    <parameterName value="@hostname" />
    <dbType value="String" />
    <size value="255" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%property{log4net:HostName}" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@username" />
    <dbType value="String" />
    <size value="-1" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%message" />
    </layout>
  </parameter>
</appender>

log4net 中一个很好的概念是堆栈(曾经是嵌套诊断上下文 (NDC))。您可以做的是在堆栈上推送某些内容,当您在该堆栈上下文中记录消息时,将堆栈的内容与消息一起打印。在您的情况下,用户名,IP地址等。您可以做的是在 webapi 中创建一个属性,该属性将调用的元值推送到堆栈。现在,当您在方法处理中记录消息时,可以将信息添加到日志消息中。

堆栈的简短示例(使用获取上下文中的所有日志记录):

using(log4net.ThreadContext.Stacks["NDC"].Push("context ip etc"))
{
    log.Info("Message");
}

相关内容

最新更新