Я использую TextWriterTraceListener
для вывода информации о трассировке в файл журнала. К сожалению, он блокирует файл журнала, и я не могу открыть его извне во время работы приложения. Любой способ сделать это возможным?Неблокирующий TextWriterTraceListener?
ответ
Это зависит от того, какой конструктор вы использовали. Конструктор TextWriterTraceListener (String) создает StreamWriter, который открывает файл с помощью FileShare.Read. Это позволяет любому процессу читать файл.
Обычная проблема заключается в попытке открыть файл с неправильным параметром FileShare в другом процессе. Вы должны указать FileShare.ReadWrite. Слушатель трассировки уже получил доступ на запись к файлу, вы не можете это отрицать.
Dotpeek может ошибаться, но его EnsureWriter делает это: 'this.writer = (TextWriter) новый StreamWriter (путь, true, encodingWithFallback, 4096);' (например, блокировка файла) –
Независимо от того, можете ли вы контролировать файл извне или нет при использовании TextWriterTraceListener
, зависит от того, какое программное обеспечение вы используете для его мониторинга. Обычно я использую BareTail, у которого нет проблем с заблокированным файлом.
блокнот ++ работает тоже. – BaBu
Я на самом деле написал один совсем недавно. К сожалению, я не могу поделиться исходным кодом, но могу сказать, что существует менее 500 строк кода. Ключ открывает файл правильно, позволяя читать доступ, как вы отметили. Другая вещь, которую я сделал, - это буферизация записей и только запись их после того, как я получил определенное количество байтов. Я также написал асинхронно, поэтому он не блокировал приложение.
NLog использует оптимистическую стратегию блокировки файлов по умолчанию во всех своих файловых добавочных файлах (это имя для TraceListener, которое оно унаследовало от log4net, и ранее от log4j). Можно было собрать этот код из NLog или log4net. – yzorg