使用Log4Net记录登录详细信息

时间:2016-03-07 22:05:11

标签: log4net log4net-configuration log4net-appender

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

我想我会通过添加第二个appender而不是滚动我自己的服务来重用Log4Net功能。 这听起来是个好主意还是创建自己的服务来处理这个问题会更好? Log4Net有很多额外的功能可以记录Trace,异常细节等。我建议的用法没什么用记录错误。 与更新实体和保存更改以保存登录详细信息相比,使用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>

1 个答案:

答案 0 :(得分:0)

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

一个简短的堆栈样本(所有在使用中的记录获取上下文):

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