NLog - разрешить другим процессам читать файл журнала - PullRequest
0 голосов
/ 04 июля 2019

Начало использования NLog.Основной процесс (служба Windows) записывает в файл журнала каждые несколько секунд.Мне нужно разрешить другому процессу (настольному приложению) читать этот файл в произвольное время (настольное приложение не требует доступа для записи).

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

Как настроить NLog, чтобы другие процессы имели доступ только для чтения к содержимому файла журнала, даже если его имеет основной процессоткрыт для записи?Процесс рабочего стола вызовет File.ReadAllText(), который, я надеюсь, безопасен для одновременных операций.

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

1 Ответ

0 голосов
/ 05 июля 2019

Проблема, однако, в том, что NLog, вероятно, создает монопольную блокировку, когда открывает файл для записи

Нет, по умолчанию он не блокируется.Существует два важных параметра:

ConcurrentWrites, этот параметр по умолчанию true:

concurrentWrites - включает поддержку оптимизированных одновременных записей в один и тот же файл журнала из нескольких процессов на одном компьютере.-host, при использовании keepFileOpen = true.Используя специальную технику, которая позволяет держать файлы открытыми для нескольких процессов.Если ведение журнала ведется только одним приложением (и одним доменом приложений), то для него более вероятно установить значение concurrentWrites = False.Логическое значение по умолчанию: True.Примечание: в UWP этот параметр должен быть ложным

Также есть параметр keepFileOpen со значением по умолчанию false

keepFileOpen - указывает, сохранять ли файл журнала открытымвместо того, чтобы открывать и закрывать его при каждом событии регистрации.Изменение этого свойства на true значительно улучшит производительность, но также сохранит дескриптор файла заблокированным.Рассмотрите возможность установки openFileCacheTimeout = 30 при включении этого, поскольку это позволит выполнять операции архивирования и реагировать на удаление файла журнала.Логическое значение по умолчанию: False

См. документы , также есть другие параметры, такие как concurrentWriteAttemptDelay, concurrentWriteAttempts и т. Д.

Последнее, но не менее важное, если вы блокируете файлслишком долго, может быть, сначала скопировать, а затем прочитать это приложение?

...