Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 每个Web服务/页面使用单独的log4net_Logging_Log4net - Fatal编程技术网

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

Logging 每个Web服务/页面使用单独的log4net,logging,log4net,Logging,Log4net,我有一个具有多个web服务的web应用程序。此web应用程序具有业务层和持久层。是否可以为每个web服务使用单独的日志追加器(日志文件) 这也适用于网页。基本上,我不想基于类或层/名称空间,而是从入口点(可以是web服务或web页面)分离日志。您可以定义在每个web服务中获取哪个日志: namespace log4net { public class LogManager { public static ILog GetLogger(string name);

我有一个具有多个web服务的web应用程序。此web应用程序具有业务层和持久层。是否可以为每个web服务使用单独的日志追加器(日志文件)


这也适用于网页。基本上,我不想基于类或层/名称空间,而是从入口点(可以是web服务或web页面)分离日志。

您可以定义在每个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.");
}
}
确保将的
类型更改为正确的Web服务

来源和更多信息

Gortok, 这是我们处理日志的典型方式。然而,我的意思不同,我想我的问题不够清楚

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

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

我的问题现在清楚了吗?

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

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


使用可以将日志输出与各种服务分开。

我可以使用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>
当用户使用web服务时,我使用以下代码:

log4net.GlobalContext.Properties["channel"] = "ui";
log4net.GlobalContext.Properties["channel"] = "ws";
当启动请求时,我需要在最高级别的条目上设置“channel”属性