我有一个包含多个Web服务的Web应用程序。此Web应用程序具有业务和持久性层。是否可以为每个Web服务使用单独的日志appender(日志文件)?
这也适用于网页。基本上我想根据类或层/名称空间分离我的日志,但是从入口点开始,可以是Web服务或网页。
答案 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”属性。