Какой лучший tracelistener файла журнала ролловера для.NET
Я ищу хороший TraceListener для.Net, который поддерживает пролистывание файла журнала на основе ограничений размера.
Ограничения
- Использует.Net встроенную трассировку логов
- Независимый класс или двоичный файл, который не является частью какой-то гигантской библиотеки
- Позволяет пролистывать файл журнала в зависимости от размера
8 ответов
Вы можете использовать Microsoft.VisualBasic.Logging.FileLogTraceListener, который встроен в.NET Framework. Не позволяйте VisualBasic в пространстве имен пугать вас, вам просто нужно сослаться на сборку microsoft.visualbasic.dll, и она должна нормально работать с C#.
Я держу этот фрагмент конфигурации под рукой всякий раз, когда мне нужно выполнить трассировку сети. Мне не нужно, чтобы проект создавался с явной ссылкой на VB DLL, поскольку это происходит путем добавления ссылки в App.config во время выполнения.
<system.diagnostics>
<sources>
<source name="System.Net">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.Http">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.Sockets">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
</sources>
<switches>
<add name="System.Net" value="Verbose"/>
<add name="System.Net.Http" value="Verbose"/>
<add name="System.Net.Sockets" value="Verbose"/>
</switches>
<sharedListeners>
<add name="System.Net"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
traceOutputOptions="DateTime,ProcessId,ThreadId"
customLocation="c:\temp"
location="Custom"
logFileCreationSchedule="Daily"
baseFileName="NetworkTrace"/>
</sharedListeners>
<trace autoflush="true"/>
</system.diagnostics>
И добавить ссылку во время выполнения
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.VisualBasic" culture="neutral" publicKeyToken="b03f5f7f11d50a3a"/>
<codeBase version="10.0.0.0" href="file://C:/Program Files (x86)/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.5/Microsoft.VisualBasic.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Я большой поклонник log4net ( http://logging.apache.org/log4net/index.html), он очень прост в настройке и поддерживает практически любой тип журнала, который вы хотите, но также может иметь свои собственные.
Он также может выполнять различные действия в зависимости от уровня журнала. Мы записываем все сообщения в текстовый файл и Error -> Fatal отправлять электронные письма
FileLogTraceListener является распространенным предложением, но он выбрасывает события или выбрасывает исключение, когда файл превышает заданный максимальный размер.
Мы создали класс, который расширяет его и переопределяет методы Write/WriteLine.
Есть try/catch (InvalidOperationException)
и если это произойдет, мы называем base.Close
и переименовать файл (FullLogFileName
) следующим образом (нам нужно base.Close
или же мы получим ошибку 'file in use'):
В цикле мы добавляем число в конец и видим, существует ли этот файл; если нет, используйте File.Move(FullLogFileName, newFileWithNumber)
иначе мы будем увеличивать число до тех пор, пока не найдем имя файла, которое работает. Есть также блокировка, чтобы гарантировать, что данный экземпляр является потокобезопасным.
Я использую NLog, и я очень доволен. Исходный код хорошо написан, его легко расширять и модифицировать. Документация хороша и очень проста в настройке.
Некоторые ссылки:
Я использовал как Log4Net, так и Nlog. Я предпочитаю NLog, но на самом деле, когда они настроены, вы все равно забываете, что они есть (пока что-то не сломается, тогда вы будете рады, что оно есть!). там должно быть много документации по обоим в сети
Как указано в одном из комментариев:
Класс FileLogTraceListener
Пишет в подвижный текстовый файл.
замечания
Новый файл используется при достижении maxFileSize, а также ежедневно или еженедельно, как указано в logFileCreationSchedule.
Каждый файл имеет имя в формате "\(-)(-). Log", с локальной датой, включенной для ежедневной и еженедельной ротации, и порядковым номером, добавляемым, если файл уже существует.
Я была такая же проблема. Безопасная среда, открытый исходный код запрещен. Болезненно. Вот что у нас сработало.
Производный от TextWriterTraceListener, который добавляет элементы для максимального размера журнала, максимального количества сохраняемых роликов и использует FileStream с параметром Share и Access, установленным на ReadWrite и установленным OpenOrCreate. Он также должен создать и удерживать мьютекс с именем, основанным на имени файла.
Переопределите метод TraceEvent, дождитесь мьютекса, найдите завершение потока, вызовите Write, проверьте размер и при необходимости сверните. Отпустите мьютекс.
Для прокрутки поверните предыдущие ролики с помощью перемещения и удаления файла, скопируйте текущий файл в имя ролика первого уровня, вызовите SetLength(0) в потоке. Все делается в рамках захвата мьютекса, но, надеюсь, не часто. Это будет работать во всех процессах и позволит избежать этого дрянного {GUID}mylog.log.
Рассмотрим блок приложения журналирования корпоративной библиотеки
Обязательно устанавливайте только блок Logging, так как установщик EntLib проверяет все блоки по умолчанию.