Измените имя файла журнала несколько раз во время выполнения

Можно ли изменить имя файла журнала для файлового приложения во время работы приложения? Это будет происходить несколько раз в день.

Попробую пояснить подробнее: мое приложение записывает прошивку на устройство. Все устройства, с которыми пользователь уже работал, находятся в сетке. Пользователь может запустить новый мастер записи или возобновить или перезапустить действие на уже запущенном устройстве. Я бы хотел вести журнал всех шагов, выполняемых пользователем для определенного устройства.

Например: когда пользователь работает на устройстве AB0124, я хочу записать в файл журнала под названием AB0124.log. Когда он закончит работу на этом устройстве и начнет работу на устройстве XY5618, я хочу записать эти действия в XY5618.log.

Я читал, что можно использовать свойство контекста (здесь и здесь и многие другие posts), но вы должны установить свойство перед созданием регистратора. Итак, вместо того, чтобы создавать регистратор в классе, я создаю его в своем методе после установки свойства. Но пока ничего не логируется.

Когда я устанавливаю имя файла, жестко закодированное в конфигурации, оно работает. Я что-то здесь упускаю?

Log4Net.config:

<appender name="StepsLogAppender" type="log4net.Appender.FileAppender">
  <filter  type="log4net.Filter.LevelMatchFilter">
    <levelToMatch value="INFO"/>
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />
  <file type="log4net.Util.PatternString" value="%property{LogPathModifier}" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date{dd/MM/yyyy  -  HH:mm:ss} - %message%newline" />
  </layout>
</appender>

<root>
  <level value="ALL" />
  <appender-ref ref="StepsLogAppender" />
</root>

C #:

public void WriteStepInfo(string device, int step)
{
    log4net.ThreadContext.Properties["LogPathModifier"] = string.Format("D:\\StepsDevice_{0}.txt", device);
    var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    log.Info(string.Format("Device {0} - step {1}.", device, step));
}

И в AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]

person Koen    schedule 17.06.2013    source источник


Ответы (2)


Ответ Питера направил меня в правильном направлении, но в итоге я сделал это в коде, вместо того, чтобы редактировать и сохранять конфигурационный файл.

public void WriteStepInfo(string device, int step)
{
    var h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
    foreach (IAppender a in h.Root.Appenders)
    {
        if (a.Name == "StepsLogAppender")
        {
            FileAppender fa = (FileAppender)a;
            var logFileLocation = string.Format(".\\Logs\\Device_{0}.log", device);

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

    Log.Info(string.Format("Device {0} - step {1}. Different file for each device", device, step));
}
person Koen    schedule 19.06.2013
comment
Спасибо за пример. Именно то, что мне нужно! - person AngieM; 10.08.2016
comment
Я пробовал ваш способ, но вместо переименования файла log4net создает новый с новым именем. Я пробовал использовать RollingFileAppender: stackoverflow.com/questions/49345372/, но, похоже, это тоже не работает. Вы этого ждали или нет? - person Ricardo; 18.03.2018
comment
Мне действительно нужно было каждый раз создавать новый файл. Log4Net не может переименовать существующий файл. Это то, что вы должны сделать сами (или с помощью кода). - person Koen; 18.03.2018

Вы можете открыть файл log4net.config из своего приложения и изменить имя. Затем сохраните файл (log4net.config), и файл журнала будет изменен.

person Peter    schedule 17.06.2013