2014-02-03 2 views
0

Я хотел бы иметь конкретное приложение для одного определенного класса домена. Когда другие классы записывают что-то, он не должен регистрироваться с этим конкретным приложением.Определенный класс log4net должен использовать appender

Например, журналы из следующего класса должны использовать «OperationalLogFile». И все остальное не должно использовать этот appender.

public class OperationalLogFileAppender 
{ 
    private readonly ILog _log = LogManager.GetLogger("OperationalLogFile"); 

    public void AppendServiceStartup() 
    { 
    var text = ..; 
    _log.Info(text); 
    } 
} 

Мой log4net конфигурационный раздел выглядит так

log4net> 
    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="OtherAppender" /> 
    <appender-ref ref="OperationalLogFile" /> 
    </root> 

    <appender name="OperationalLogFile" type="log4net.Appender.RollingFileAppender"> 
    <file value="OperationalLogFileName" /> 
    <appendToFile value="true"/> 
    <countDirection value="-1"/> 
    <rollingStyle value="Date" /> 
    <datePattern value="ddMMyyyy'.log'" /> 
    <maxSizeRollBackups value="0" /> 
    <maximumFileSize value="10000KB" /> 
    <staticLogFileName value="false" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%message" /> 
    </layout> 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
     <loggerToMatch value="MyNameSpace.OperationalLogFileAppender" /> 
    </filter> 
    </appender> 

    <logger name="MyNameSpace.OperationalLogFileAppender"> 
    <level value="INFO"/> 
    <appender-ref ref="OperationalLogFile"/> 
    </logger> 

Но corrently все я войти мое приложение показывает вверх в operationalog файле, но я хотел бы, что только вещи, что Журналы OperationalLogFileAppender должны отображаться в файле рабочего журнала.

ответ

3

Вы можете создать несколько appenders и украсить их с Log4Net Filters включить конкретный регистратор или лесорубов вы хотите.

Определенный фильтр, который вы хотите, это LoggerMatchFilter —, вы указываете строку, которая должна быть сопоставлена ​​с именем регистратора через string.StartsWith(). Соответствующие регистраторы (журналы) включены или исключены как источник данных для приложения. Вот почему log4net рекомендуется именование для лесорубов, чтобы иметь каждый класс экземпляр его собственный регистратор instancej, имя его с полным именем типа класса (Type.FullName):

class Widget 
{ 
    static ILogger log = LogManager.GetLogger(typeof(Widget)) ; 
    . . . 
} 

Это создает регистратор, имя которого полное имя класса. Обратите внимание, что регистратор не должен быть статическим свойством: регистратор может создаваться динамически вместо статически: только один экземпляр регистратора с заданным именем создается.

Понятие о том, что приложение в целом может регистрировать только событие высокого уровня. Если есть проблема, в то время как приложение запущено, вы можете настроить конфигурацию log4net для набора на нижнем уровне регистрации до уровня класса.

Подробнее о конфигурации log4net в http://logging.apache.org/log4net/release/manual/configuration.html

Вот небольшой учебник по фильтрам: http://www.beefycode.com/post/log4net-tutorial-pt-7-filters.aspx

1

Вы можете сделать это за счет использования пользовательского уровня

private static readonly log4net.Core.Level _customLevel=new 
log4net.Core.Level(50000,"Custom"); 

public void Init() 
{ 
    log4net.Util.LogLog.InternalDebugging=true; 
    log4net.LogManager.GetRepository().LevelMap.Add(_customLevel); 
} 

public void WriteToLog(string message) 
{ 
    log.Logger.log(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType,_customLevel,message,null); 
} 
Смежные вопросы