Я использую log4net для входа прогресса моего веб-приложения, с помощью Log4PostSharp для AOP-injectify все методы. Это имеет желаемый эффект входа (почти) всего и прекрасно.
У меня теперь есть требование для входа ПРОСТО методов Page_Load в файл / консоль. Я могу, очевидно, зажать в тиски log4postsharp класс, чтобы сделать это, но затем я потерял бы все другие вход.
Я смотрел на, просачивается log4net, начиная с фильтра StringMatch, но который только смотрит на сообщение, зарегистрированное, и я после имени метода. Это поместило меня на PropertyFilter, но все еще без радости. Мой log4net.config отрывок таким образом:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<filter type="log4net.Filter.PropertyFilter">
<key value="LocationInfo.MethodName"/>
<stringToMatch value="Page_Load"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<file value="d:\\xxxx\\yyyyy\\zzzzLog"/>
Как Вы видите, я пытаюсь ввести в MethodName регистрирующегося события через LocationInfo, но я все еще регистрировал все.Править: Как упомянуто в комментариях, я теперь включал DenyAllFilter, который я добавил после прочитайте руководство ;-)
Кто-либо может помочь?
Спасибо,
Mike K.
Насколько я могу судить, log4net не знает свойства LocationInfo.MethodName . Я не использую Log4PostSharp, поэтому я не могу точно сказать, создаст ли Log4PostSharp это свойство.
Я бы написал свой собственный фильтр, подобный этому, для фильтрации по именам методов (часть регулярного выражения опущена):
public class MethodNameFilter : StringMatchFilter
{
override public FilterDecision Decide(LoggingEvent loggingEvent)
{
if (loggingEvent == null)
{
throw new ArgumentNullException("loggingEvent");
}
var locationInfo = loggingEvent.LocationInformation;
// Check if we have been setup to filter
if (locationInfo == null || (m_stringToMatch == null && m_regexToMatch == null))
{
// We cannot filter so allow the filter chain
// to continue processing
return FilterDecision.Neutral;
}
if (m_stringToMatch != null)
{
// Check substring match
if (locationInfo.MethodName.IndexOf(m_stringToMatch) == -1)
{
// No match, continue processing
return FilterDecision.Neutral;
}
// we've got a match
if (m_acceptOnMatch)
{
return FilterDecision.Accept;
}
return FilterDecision.Deny;
}
return FilterDecision.Neutral;
}
}
Примечание. Доступ к LocationInfo является дорогостоящим и может заметно повлиять на производительность. Вы можете подумать об изменении Log4PostSharp, чтобы извлечь имя метода во время плетения и сохранить его в каком-либо свойстве. В этом случае вы можете использовать фильтр свойств по своему усмотрению, и это никак не повлияет на производительность. Не уверен, что это действительно работает, но я ожидал, что это возможно.
Конфигурация будет выглядеть примерно так:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<filter type="YourNameSpace.MethodNameFilter">
<stringToMatch value="Page_Load"/>
</filter>
<filter type="log4net.Filter.DenyAllFilter" />
<file value="d:\\xxxx\\yyyyy\\zzzzLog"/>