Как программно заставить log4net освободить файл журнала, чтобы к нему можно было получить доступ? - PullRequest
1 голос
/ 22 мая 2019

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

До сих пор я следил за результатами по этому вопросу: Как остановить log4net от регистрации и выпустить последний файл об установке порога appender на «Off», но я продолжаю получать исключение из-за DLL не выпускает файл журнала. Я могу проверить в отладчике, что appender действительно находится в состоянии «Выкл.», Но проводник процесса подтверждает, что мой exe-файл все еще удерживает блокировку файла.

Вот метод, который я получил из связанного вопроса:

 private static void SetThreshold(string appenderName, log4net.Core.Level threshold)
        {
            foreach (log4net.Appender.AppenderSkeleton appender in log4net.LogManager.GetRepository().GetAppenders())
            {
                if (appender.Name == appenderName)
                {
                    appender.Threshold = threshold;
                    break;
                }
            }
        }

Любые идеи, как форсировать выпуск этого журнала, были бы очень полезны. Спасибо

Ответы [ 3 ]

1 голос
/ 22 мая 2019

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

 var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            var lines = new List<string>();
            using (var sr = new StreamReader(fs))
            {
                while(!sr.EndOfStream)
                {
                    lines.Add(sr.ReadLine());
                }
            }

Я могу взять этот список и записать во временный файл и использовать его для отправки нашего вложения, и мне не нужно беспокоиться об изменении log4net и угрозе любых зависимостей других сборок, нацеленных на ту же библиотеку DLL log4net.

Спасибо двум людям, которые поделились своими мыслями!

0 голосов
/ 22 мая 2019

При использовании FileAppender или RollingFileAppender можно настроить файл журнала LockingModel.Использование соответствующего LockingModel должно разрешить необходимую привилегию доступа к файлу.
Из документации log4net (https://logging.apache.org/log4net/release/sdk/index.html)

) Существуют три встроенные модели блокировки:

  • FileAppender.ExclusiveLock
  • FileAppender.MinimalLock
  • FileAppender.InterProcessLock

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

Модель блокировки по умолчанию - FileAppender.ExclusiveLock.

Ниже приведен пример конфигурации от https://logging.apache.org/log4net/release/config-examples.html

<appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="${TMP}\log-file.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>

Редактировать: LockingModel предоставляет метод ReleaseLock, который заставит файл быть освобожденным процессом. Чтобы продолжить регистрацию, вы должны затем вызвать AcquireLock.

0 голосов
/ 22 мая 2019

Журнал открыт для записи, поэтому единственный способ снять блокировку - остановить приложение. У вас есть варианты: 1) использовать параметр MaximumFileSize, чтобы разбить файл журнала на куски, чтобы не был доступен только самый последний журнал; 2) регистрировать сообщения в базе данных (log4net предоставляет такой интерфейс, см. https://www.c -sharpcorner.com / article / configure-log4net-with-database-tutorial-for-beginners / ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...