log4net将自定义数据映射到数据库中的字段

时间:2014-10-10 20:46:48

标签: c# database log4net categories

我正在从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"] = "";
}

我们的应用程序代码库中确实有很多异步代码......所以我担心这根本不是线程安全的。

1 个答案:

答案 0 :(得分:1)

log4net.ThreadContext 对于多线程操作是安全的,并提供要存储的特定于线程的信息的位置。您还可以在PatternLayout中指定线程ID /名称以获得更好的洞察力。在同一布局中提供所有需要的属性,就像您指定的主机名一样。 如果要使用AdoNetAppender登录数据库。