2017-06-21 36 views
5

Uygulamanın WPF'den başlatıldığı, 2 arka plan iş parçacığı bir web soket sunucusu ve bir Web API sunucusu başlatan bir Çok İş parçacıklı ortamım var.LogithNet'i çok iş parçacıklı ortamlarda kullanma

Tüm olayları tek bir günlük dosyasına kaydetmek istiyorum. Log4Net kullanıyorum (ilk kez).

3 örnek Logger yaratıyorum ve dosya ekleyicisinin yalnızca tek bir dosyaya yazması gerektiğini anlayacağım.

Kodu:

Kaydedici Sınıfı:

public class Logger :ILogger 
{ 
    private static ILog log = null; 
    static Logger() 
    { 
     log = LogManager.GetLogger(typeof(Logger)); 
     GlobalContext.Properties["host"] = Environment.MachineName; 
    } 
    public Logger(Type logClass) 
    { 
     log = LogManager.GetLogger(logClass); 
    } 

    #region ILogger Members 
    public void LogException(Exception exception) 
    { 
     if (log.IsErrorEnabled) 
      log.Error(string.Format(CultureInfo.InvariantCulture, "{0}", exception.Message), exception); 
    } 
    public void LogError(string message) 
    { 
     if (log.IsErrorEnabled) 
      log.Error(string.Format(CultureInfo.InvariantCulture, "{0}", message)); 
    } 
    public void LogWarningMessage(string message) 
    { 
     if (log.IsWarnEnabled) 
      log.Warn(string.Format(CultureInfo.InvariantCulture, "{0}", message)); 
    } 
    public void LogInfoMessage(string message) 
    { 
     if (log.IsInfoEnabled) 
      log.Info(string.Format(CultureInfo.InvariantCulture, "{0}", message)); 
    } 
    #endregion 
} 

Giriş Yapılandırma: Ben gibi 3 farklı projelerde Kaydedici 3 örneğini, oluşturma

<log4net debug="true"> 
    <appender name="RollingLogFileAppender" 
       type="log4net.Appender.RollingFileAppender"> 
    <file value="/pathToLogFile" /> 
    <staticLogFileName value="false"/> 
    <appendToFile value="true" /> 
    <rollingStyle value="Date" /> 
    <datePattern value=" yyyy-MM-dd&quot;.txt&quot;"/> 
    <layout type="log4net.Layout.PatternLayout"> 
     <!--<param name="ConversionPattern" 
       value="%d [%t] %-5p %c %m%n" />--> 
     <conversionPattern 
     value="%date [%thread] %-5level %logger ==> %message%newline"/> 
    </layout> 
    </appender> 

    <root> 
    <level value="INFO" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
    <appender-ref ref="AdoNetAppender" /> 
    </root> 
</log4net> 

:

static ILogger logger = new Logger(typeof(MainWindow)); 
static ILogger logger = new Logger(typeof(DefaultApiController)); 
static ILogger logger = new Logger(typeof(WebSocket)); 

Ancak, Günlük dosyası yalnızca WebSocket günlüğüne sahiptir. Anlayışımda bir boşluk var mı? Nerede yanlış gidiyorum?

Temel olarak, 3 iş parçacığı çalışıyor, bu yüzden kesinlikle aynı Logger nesnesinde birinden diğerine geçemiyorum.

+1

Sargılayıcı neden? Log4net'te zaten var olan işlevselliği (günlük seviyesine göre filtreleme) çoğaltır gibi görünüyor - bunu yapmak için log4net'in konfigürasyonunu bile kullanıyorsunuz. – Adrian

cevap

7

Asıl sorun, statik bir kayıt cihazı kullandığınız, ancak bu statik değişkeni örneğinizin yapıcısına 3 farklı kez atamaya çalıştığınızdır, sonuncusu her zaman kazanacaktır. Projelerin sayısı önemli değil, tüm projeler aynı çalışan yürütülebilirde barındırılıyorsa, her zaman yalnızca Logger::log'un ( çoklu uygulama etki alanı oluşturmamanız varsayılarak ) 1 örneği olacaktır.

public class Logger :ILogger { private static ILog log = null; static Logger() { log = LogManager.GetLogger(typeof(Logger)); GlobalContext.Properties["host"] = Environment.MachineName; } public Logger(Type logClass) { log = LogManager.GetLogger(logClass); } 

Sana bu şekilde kurmaya çalışıyor neden emin değilim dedi ki

public class Logger :ILogger 
{ 
    private ILog log = null; 
    public Logger(Type logClass) 
    { 
     log = LogManager.GetLogger(logClass); 
    } 

olmalı. İhtiyacı olan herhangi bir sınıfta statik bir kayıt cihazı tedarik etmek çok daha kolaydır. Örnek:

public class SomeInterestingType { 
    private static readonly ILog Logger = LogManager.GetLogger(typeof(SomeInterestingType)); 

    public void DoSomething() { 
    Logger.Info("Busy doing something"); 
    } 
} 

Ve sonra bu deseni tekrarlayın.