我已经使用 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");
}