在log4net中使用过滤器分隔日志仅适用于一个值

时间:2013-11-18 14:18:04

标签: asp.net-mvc log4net

我在Windows Server 2008 R2和Window Server 2012上使用log4net获得了一个ASP.NET MVC应用程序。该应用程序安装为具有公共代码库的两个独立实例,即log4net配置文件在两者中都是相同的文件夹但我想根据被调用网站的主机名将日志记录分成两个不同的文件。

我尝试使用属性过滤器设置两个不同的appender来过滤掉我设置的值,如下所示:

    log4net.GlobalContext.Properties["site"] = HttpContext.Current.Request.Url.Host;

我的log4net配置文件中每个appender的过滤器如下所示:

    <filter type="log4net.Filter.PropertyFilter">
      <key value="site" />
      <StringToMatch value="hostnameA" />
    </filter>
    <filter type="log4net.Filter.DenyAllFilter" />

这两个网站只共享公共代码,但具有单独的安装文件夹和单独的应用程序池。仍然只有网站首先启动一个工作记录器,第二个根本不记录。如果我是IISRESET,然后首先启动网站B和网站A秒,那么网站B(第一个)工作但不是网站A.

我已经尝试过GlobalContext,ThreadContext和LogicalThreadContext,它们都具有相同的结果。我试过log4net 1.12.11和1.12.12。

任何提示?

纳斯

1 个答案:

答案 0 :(得分:0)

因为你有两个appender登录到同一个文件,一个应用程序将获取两个写入锁定,另一个应用程序将失败。

我的解决方案是将%processid添加到日志文件名中。这样,每个进程在给定时间始终拥有自己的文件 - 没有冲突。试试这样:

<file type="log4net.Util.PatternString" value="log-file-[%processid].txt" />

请参阅http://logging.apache.org/log4net/release/sdk/log4net.Util.PatternString.html