每个Web服务/页面使用单独的log4net

时间:2008-12-11 23:55:55

标签: logging log4net

我有一个包含多个Web服务的Web应用程序。此Web应用程序具有业务和持久性层。是否可以为每个Web服务使用单独的日志appender(日志文件)?

这也适用于网页。基本上我想根据类或层/名称空间分离我的日志,但是从入口点开始,可以是Web服务或网页。

4 个答案:

答案 0 :(得分:1)

您可以定义要在每个Web服务中获取的记录器:

namespace log4net
{
    public class LogManager
    {
        public static ILog GetLogger(string name);
        public static ILog GetLogger(Type type);
    }
}

然后在您的应用中,您可以适当地调用每个记录器:

public class MyApp 
{
    // Define a static logger variable so that it references the
    // Logger instance named "MyApp".
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));

static void Main(string[] args) 
{
    // Set up a simple configuration that logs on the console.
    BasicConfigurator.Configure();

    log.Info("Entering application.");
    Bar bar = new Bar();
    bar.DoIt();
    log.Info("Exiting application.");
}
}

确保将typeof更改为正确的网络服务。

来源和更多信息here

答案 1 :(得分:1)

我建议在每个页面中使用Nested Diagnostic Contexts(NDCs),然后根据NDC过滤日志输出。

NDC信息将包含在从当前线程上下文记录的事件中,其中包括页面代码,服务代码,存储库代码等。

使用filtering on the NDC content,您可以将日志输出与各种服务分开。

答案 2 :(得分:0)

Gortok, 这是我们处理日志的典型方式。但是我的意思是不同的,我认为我的问题不够明确。

这是一个假设的例子:我们有一个Web应用程序,它有一些Admin页面和一些Customer页面,我们希望为每组页面提供两个不同的admin.log和customer.log文件。这两组页面都使用业务层(包括CustomerService,OrderService等)和存储库层CustomerRepository,OrderRepository等。应用程序中的所有图层和类都在两组页面中使用,但我们希望将日志分开。这使得在管理页面中发生异常时更容易,并且您会查看与跟踪问题相关的日志。您提到的解决方案的典型方法是解决这种情况,因为当您使用 typeof(MyApp)(MyApp是类或命名空间的名称)时,不会指示要使用的appender根据用户发起请求的页面。

处理这种情况的一种方法可能是在应用程序中使用域值对象,并在用户在UI级别启动请求时将其值设置为适当的记录器,并在定义时使用该值作为构造函数参数每个班级的记录器。但我想知道在log4net中是否有更好的方法来处理这种我不知道的方法。

我的问题现在更清楚了吗?

答案 3 :(得分:0)

我可以使用PropertyFilter来做到这一点。我在配置文件中定义了以下appender:

<appender name="UiFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="Log1.log" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="5MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
  <filter type="log4net.Filter.PropertyFilter">
    <Key value="channel"/>
    <StringToMatch value="ui" />
    <AcceptOnMatch value="true" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>
<appender name="WsFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="Log1.log" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="5MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
  </layout>
  <filter type="log4net.Filter.PropertyFilter">
    <Key value="channel"/>
    <StringToMatch value="ws" />
    <AcceptOnMatch value="true" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
</appender>

上述appender的重要部分是标签。当用户使用UI时,我将“channel”属性设置为“ui”,如下面的代码:

log4net.GlobalContext.Properties["channel"] = "ui";

当用户使用Web服务时,我使用以下代码:

log4net.GlobalContext.Properties["channel"] = "ws";

我需要在启动请求时在最高级别设置“channel”属性。