2013-07-10 3 views
9

Это очень распространенный вопрос, но я не смог получить ответ на работу. Вот мой файл конфигурации:log4net: Как установить имя файла журнала динамически?

<?xml version="1.0" encoding="utf-8"?> 
<log4net> 
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
    <file value="CraneUserInterface.log" /> 
    <appendToFile value="true" /> 
    <maxSizeRollBackups value="90" /> 
    <rollingStyle value="Size" /> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date - %message%newline" /> 
    </layout> 
    </appender> 

    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

Но мне нужно определить фактическое имя файла журнала во время выполнения. Я нашел хороший пример here, но когда я пытаюсь выполнить цикл, возвращенный вызовом GetIterators(), я обнаружил, что эта коллекция пуста.

Мне нужно изменить имя «CraneUserInterface.log» на «CraneUserInterface_1.log», или 2 или 3, в зависимости от того, что программа читает во время выполнения. Как я могу это сделать?

Вот мой первый проход при использовании кода, представленный в этом примере:

static bool ChangeLogFileName(string AppenderName, string NewFilename) 
{   
    // log4net.Repository.ILoggerRepository RootRep; 
    // RootRep = log4net.LogManager.GetRepository(); 
    log4net.Repository.ILoggerRepository RootRep = m_logger.Logger.Repository; 
    foreach (log4net.Appender.IAppender iApp in RootRep.GetAppenders()) 
    { 
    string appenderName = iApp.Name; 
    if (iApp.Name.CompareTo(AppenderName) == 0 
     && iApp is log4net.Appender.FileAppender) 
    { 
     log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp; 
     fApp.File = NewFilename; 
     fApp.ActivateOptions(); 
     return true; // Appender found and name changed to NewFilename 
    } 
} 
return false; // appender not found 
} 

Большое спасибо!

+0

Несмотря на чтение в два раза, я понятия не имею, почему вы хотели бы сделать это. –

+1

Это предназначено для использования в ноутбуке, который будет находиться в кабине крана на заводе для отжига. Завод имеет 3 крана. Поскольку я не нахожусь на заводе и не буду в ближайшем будущем, у меня есть симулятор, который претендует на то, чтобы быть всеми тремя кранами. Одновременно будет запущено 3 экземпляра этой программы. Мне нужно отслеживать события для каждого из 3-х кранов отдельно, и я, вероятно, должен избегать любых случаев, когда два экземпляра этой программы записываются в один и тот же файл журнала одновременно. –

+0

Я думаю, что мой инстинкт кишки был прав. Вы пытаетесь решить неправильную проблему. –

ответ

4

Вы можете использовать эту функцию: в этой функции сначала получите местоположение файла, которое вы установили в webconfig, и после этого вы можете добавить любой путь, который вы хотите! как дата! наш клиент ! или .....

WebConfig:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\\t4\\"/> 
    <appendToFile value="true"/> 
    <rollingStyle value="Composite"/> 
    <datePattern value="_yyyy-MM-dd.lo'g'"/> 
    <maxSizeRollBackups value="10"/> 
    <maximumFileSize value="1MB"/> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/> 
    </layout> 
</appender> 

Функция:

public static void ChangeFileLocation(string _CustomerName,string _Project) 
{ 
    XmlConfigurator.Configure(); 
    log4net.Repository.Hierarchy.Hierarchy h =(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository(); 

    foreach (IAppender a in h.Root.Appenders) 
    { 
     if (a is FileAppender) 
     { 
      FileAppender fa = (FileAppender)a; 
      string sNowDate= DateTime.Now.ToLongDateString(); 
      // Programmatically set this to the desired location here 
      string FileLocationinWebConfig = fa.File; 
      string logFileLocation = FileLocationinWebConfig + _Project + "\\" + _CustomerName + "\\" + sNowDate + ".log"; 

      fa.File = logFileLocation; 
      fa.ActivateOptions(); 
      break; 
     } 
    } 
} 

и результат: C: \ t4 \ TestProject \ customer1 \ субботу, 31 августа, 2013.log

+0

, пожалуйста, не отправляйте точный ответ на несколько вопросов - они либо не подходят, либо вопрос является дубликатом и должны быть помечены как таковые – kleopatra

7

Как использовать свойство «%» для определения динамического «тега» для имени файла (во время выполнения)?

<file type="log4net.Util.PatternString" value="~/App_Data/%property{LogName}" /> 

Разъяснения здесь: Best way to dynamically set an appender file path

Смежные вопросы