2010-02-14 2 views
4

Я использую TextWriterTraceListener для вывода информации о трассировке в файл журнала. К сожалению, он блокирует файл журнала, и я не могу открыть его извне во время работы приложения. Любой способ сделать это возможным?Неблокирующий TextWriterTraceListener?

+0

NLog использует оптимистическую стратегию блокировки файлов по умолчанию во всех своих файловых добавочных файлах (это имя для TraceListener, которое оно унаследовало от log4net, и ранее от log4j). Можно было собрать этот код из NLog или log4net. – yzorg

ответ

4

Это зависит от того, какой конструктор вы использовали. Конструктор TextWriterTraceListener (String) создает StreamWriter, который открывает файл с помощью FileShare.Read. Это позволяет любому процессу читать файл.

Обычная проблема заключается в попытке открыть файл с неправильным параметром FileShare в другом процессе. Вы должны указать FileShare.ReadWrite. Слушатель трассировки уже получил доступ на запись к файлу, вы не можете это отрицать.

+0

Dotpeek может ошибаться, но его EnsureWriter делает это: 'this.writer = (TextWriter) новый StreamWriter (путь, true, encodingWithFallback, 4096);' (например, блокировка файла) –

2

Независимо от того, можете ли вы контролировать файл извне или нет при использовании TextWriterTraceListener, зависит от того, какое программное обеспечение вы используете для его мониторинга. Обычно я использую BareTail, у которого нет проблем с заблокированным файлом.

+0

блокнот ++ работает тоже. – BaBu

0

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