我正在从Enterprise Library迁移,它的Write()api允许我们指定类别,严重性,标题和优先级等内容。
对于这个具体的例子,我想在数据库字段中记录用户提供的类别值。例如考虑一个在线购物车,我想放置[相机],[笔记本电脑],[路由器],[帐户],[订单],[运输]等类别。
我知道log4net有一个属性字段,我们在配置中已经这样做以映射到数据库:
<parameter>
<parameterName value="@MachineName" />
<dbType value="String" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{log4net:HostName}" />
</layout>
</parameter>
我希望我的Api看起来像这样:
public class LogService
{
public LogService()
{
_log = LogManager.GetLogger(this.GetType());
}
public void WriteDebug(string message, string category)
{
_log.Debug(message);
}
}
我可以这样做,它会安全吗?还是有另一种方式?
public void WriteDebug(string message, string category) { ThreadContext.Properties["Category"] = category _log.Debug(message); ThreadContext.Properties["Category"] = ""; }
我们的应用程序代码库中确实有很多异步代码......所以我担心这根本不是线程安全的。
答案 0 :(得分:1)
log4net.ThreadContext 对于多线程操作是安全的,并提供要存储的特定于线程的信息的位置。您还可以在PatternLayout中指定线程ID /名称以获得更好的洞察力。在同一布局中提供所有需要的属性,就像您指定的主机名一样。 如果要使用AdoNetAppender登录数据库。