我已经使用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>
答案 0 :(得分:0)
log4net中的一个很好的概念是stacks(曾经是嵌套诊断上下文(NDC))。您可以做的是在堆栈上推送一些内容,当您在该堆栈上下文中记录消息时,使用该消息打印堆栈的内容。在您的情况下,用户名,IP地址等。您可以做的是在webapi中创建一个属性,将调用的元值推送到堆栈。现在,在处理方法时记录消息时,可以将信息添加到日志消息中。
一个简短的堆栈样本(所有在使用中的记录获取上下文):
using(log4net.ThreadContext.Stacks["NDC"].Push("context ip etc"))
{
log.Info("Message");
}