2013-06-13 4 views
0

У меня есть конфигурационный файл следующим образом:Log4net динамический отдельный журнал не работает?

<configuration> 
<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />   
</configSections> 
<appSettings> 
    <add key="log4net.Config" value="log4net.config"/> 
</appSettings> 
<log4net> 
    <appender name="appenderA" type="log4net.Appender.RollingFileAppender"> 
     <file type="log4net.Util.PatternString" value="logs\\%property{LogName}" /> 
     <param name="AppendToFile" value="true" /> 
     <param name="RollingStyle" value="Composite" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
     <maxSizeRollBackups value="3" /> 
     <maximumFileSize value="5KB" />  
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%d [%t] %-5p %c [%logger] = %m%n" /> 
     </layout> 
    </appender> 
    <logger name="ConsoleApplication1.testCls"> 
     <level value="INFO" />   
    </logger> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="appenderA" /> 
    </root> 
</log4net> 
</configuration> 

Тогда у меня есть функция будет возвращать log4net.ILog

Public Function func(cls As Object) As log4net.ILog 
    Dim clsName As String = cls.ToString() 
    Dim rollAppen As New RollingFileAppender() 

    log4net.ThreadContext.Properties("LogName") = clsName.ToLower() & ".log" 
    log4net.Config.XmlConfigurator.Configure(New System.IO.FileInfo("Log4Net.config")) 
    Dim logg As ILog = LogManager.GetLogger(clsName) 
    Dim l As log4net.Repository.Hierarchy.Logger = DirectCast(logg.Logger, log4net.Repository.Hierarchy.Logger) 
    If l.Level Is Nothing Then 
     l.Level = l.Hierarchy.LevelMap("INFO") 
    End If 
    Return logg 
End Function 

Теперь я проверить функцию Func

Dim tCls As testCls = New testCls() 
    Dim cls As LogTest2 = New LogTest2() 
    Dim l4n As log4net.ILog 
    Dim l4n2 As log4net.ILog 

    l4n = cls.func(tCls.GetType().ToString()) 
    l4n2 = cls.func(cls.GetType().ToString()) 

    l4n.Debug("... Here is a debug log -2.") 
    l4n.Info("... and an Info log.") 
    l4n.Warn("... and a warning 1.") 
    l4n.Debug("... Here is a debug log -1.") 
    l4n.Warn("... and a warning 2.") 
    l4n.Warn("... and a warning 3.") 
    l4n2.Warn("l4n2 cls and a warning -1.") 
    l4n.Warn("... and a warning 4.") 
    l4n.Warn("... and a warning 5.") 
    Console.Write(" ... ... ... ") 
    l4n.Warn("... and a warning 6.") 
    l4n.Debug("... Here is a debug log 1.") 
    l4n.Warn("... and a warning 7.") 
    l4n2.Debug("l4n2 cls Here is a debug log.") 
    l4n2.Info("l4n2 cls and an Info log.") 
    l4n.Fatal("... and a fatal aaa.") 
    l4n2.Fatal("l4n2 and a fatal .") 
    l4n.Debug("... Here is a debug log 2.") 
    l4n.Warn("... and a warning 8.") 
    l4n.Error("... and an error.") 
    l4n.Debug("... Here is a debug log 3.") 
    l4n.Fatal("... and a fatal bbb.") 
    l4n.Debug("... Here is a debug log 4.") 
    l4n2.Debug("l4n2 cls Here is a debug log.") 
    l4n2.Info("l4n2 cls and an Info log.") 
    l4n2.Warn("l4n2 cls and a warning.") 
    l4n2.Error("l4n2 cls and an error.") 
    l4n2.Fatal("l4n2 cls and a fatal .") 

Существует 2 файла журнала с именем co nsoleapplication1.testcls.log и consoleapplication1.logtest2.log сгенерировано. Но ....

это только consoleapplication1.logtest2.log есть журнал содержание и все содержимое журнала сохранить в consoleapplication1.logtest2.log. Другой журнал consoleapplication1.testcls.log сгенерирован, но не содержит содержимого.

consoleapplication1.testcls.log 
====no content==== 

consoleapplication1.logtest2.log 
2013-06-13 11:00:33,390 [11724] INFO = ... and an Info log. 
2013-06-13 11:00:36,408 [11724] WARN = ... and a warning 1. 
2013-06-13 11:00:36,411 [11724] WARN = ... and a warning 2. 
2013-06-13 11:00:36,413 [11724] WARN = ... and a warning 3. 
2013-06-13 11:00:36,414 [11724] WARN = l4n2 cls and a warning -1. 
2013-06-13 11:00:36,416 [11724] WARN = ... and a warning 4. 
2013-06-13 11:00:36,418 [11724] WARN = ... and a warning 5. 
2013-06-13 11:00:39,421 [11724] WARN = ... and a warning 6. 
2013-06-13 11:00:39,424 [11724] WARN = ... and a warning 7. 
2013-06-13 11:00:39,426 [11724] INFO = l4n2 cls and an Info log. 
2013-06-13 11:00:39,429 [11724] FATAL = ... and a fatal aaa. 
2013-06-13 11:00:39,431 [11724] FATAL = l4n2 and a fatal . 
2013-06-13 11:00:39,433 [11724] WARN = ... and a warning 8. 
2013-06-13 11:00:39,435 [11724] ERROR = ... and an error. 
2013-06-13 11:00:39,437 [11724] FATAL = ... and a fatal bbb. 
2013-06-13 11:00:39,439 [11724] INFO = l4n2 cls and an Info log. 
2013-06-13 11:00:39,441 [11724] WARN = l4n2 cls and a warning. 
2013-06-13 11:00:39,443 [11724] ERROR = l4n2 cls and an error. 
2013-06-13 11:00:39,444 [11724] FATAL = l4n2 cls and a fatal . 

Знаете ли вы, что не в порядке с моим кодом? Я боролся с этим уже два дня.

ответ

0

Приложение, настроенное в вашем файле конфигурации, является единственным экземпляром RollingLogFileAppender - у вас есть только два объекта, указывающих на него. Поэтому вы переписываете настройки для l4n, когда вы вызываете func(), чтобы установить l4n2. Чтобы доказать эту теорию, вы должны иметь возможность переключать линии:

l4n = cls.func(tCls.GetType().ToString()) 
l4n2 = cls.func(cls.GetType().ToString()) 

в

l4n2 = cls.func(cls.GetType().ToString()) 
l4n = cls.func(tCls.GetType().ToString()) 

и все из вашего выхода журнала должен идти в consoleapplication1.testcls.log, а не consoleapplication1.logtest2 .log где весь ваш выход в настоящее время идет.

Исправление состоит в том, чтобы либо программно сгенерировать новый log4net-приложение для каждого класса (как и в ответе this question), либо просто поместить два экземпляра RollingLogFileAppender в ваш файл конфигурации: по одному для каждого класса, для которого вы хотите зарегистрироваться ,

+0

Благодарим вас за быстрый ответ. После того, как я использую ваш подход **, программно сгенерируйте новый log4net appender **. содержимое журнала генерируется в соответствующем файле журнала успешно. Но когда я пытаюсь изменить файл конфигурации (уровень регистратора) во время запуска программы, содержимое журнала не может быть сохранено после изменения. –