Какой лучший 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 проверяет все блоки по умолчанию.

Другие вопросы по тегам