Как мне обрезать файл журнала с помощью vb.net? - PullRequest
2 голосов
/ 29 октября 2010

Я пишу простое приложение на vb.net и мне нужно вывести некоторую информацию в файл журнала для диагностических целей.

Чтобы убедиться, что файл журнала не становится слишком большим, янужно обрезать его до определенного количества строк (скажем, 5000).По соображениям производительности обрезка не должна выполняться каждый раз, когда записывается запись в журнал, и не критично, что обрезка происходит (например, в случае преждевременного сбоя приложения).

Однако я не совсемуверен, что лучший способ обрезать его.Загрузка всего журнала в память, а затем перезапись только последних 5000 строк будет работать, но я уверен, что есть более чистый и лучший способ сделать это.

Может кто-нибудь предложить более эффективныйметод?Я довольно новичок на vb.net, поэтому примеры кода были бы очень полезны.

Ответы [ 4 ]

4 голосов
/ 29 октября 2010

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

Просто переименуйте текущий файл журнала с xyzzy.log на xxyyz-YYYYMMDDHHMMSS.log, затем запустите новую копию xyzzy.log.

Это также дает вам достойный компромисс между ведением полного аудита журналов и сохранением дискового пространства. Вы можете настроить процедуры для удаления файлов журнала старше 30 дней, или сохранить совокупный размер ниже некоторого порогового значения, или даже перенести старые журналы в область вторичного хранения.

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

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


A очень простое решение, которое я использовал в прошлом (по общему признанию с Linux), состоит в том, чтобы вообще не беспокоиться о переименовании. Просто запустите файл журнала, используя текущую дату, и запомните , какой была дата. Каждый раз, когда вы вызываете функцию журнала после этого, проверяйте, не изменилась ли дата, и, если это так, откройте новый файл журнала для последующей регистрации. Это дает вам один файл журнала в день без особых усилий со стороны программы.

Тогда у меня были только сценарии, использующие find -mtime для удаления тех, кто старше определенного возраста.

0 голосов
/ 19 августа 2016

Мертвая ветка, я знаю ... но не было никаких ответов, которые на самом деле ответили на вопрос, только предложения о том, почему они этого не сделают. Я понимаю, что в некоторых случаях было бы полезно сохранить последние, однако, много строк в журнале. 5000 может быть немного больше, но кто я такой, чтобы судить. Итак, вот мой дубль и что я использую.

dim LogPath as string = "YourLogPath"    
Dim lineCount = File.ReadAllLines(LogPath).Length

        If lineCount > 60 Then ' because I want my log to be 60 lines long
            Dim delLineCount As Integer = lineCount - 60
            Dim lines As List(Of String) = New List(Of String)(File.ReadAllLines(LogPath))
            lines.RemoveRange(0, delLineCount)
            File.WriteAllLines(LogPath, lines.ToArray())
        End If

Я делаю это при закрытии, чтобы обрезать его после завершения всех операций, а размер моего файла журнала составляет 60 строк:)

0 голосов
/ 29 октября 2010

Одним из подходов является использование решения с открытым исходным кодом для этого. Log4Net - это то, что многие из моих коллег использовали снова и снова. Он обладает функциональностью, чтобы справиться с тем, о чем вы говорите. Вы добавляете ссылку, добавляете файл конфигурации, чтобы установить параметры ведения журнала (сколько хранить и т. Д.), И вызываете библиотеку для входа.

http://logging.apache.org/log4net/

0 голосов
/ 29 октября 2010

Вам следует попробовать использовать стороннюю библиотеку, большая часть которой должна включать в себя такие функции - например, log4net , NLog , Библиотека предприятия .

Большинство из них просты в использовании, в зависимости от того, сколько журналирования вы делаете, возможно, будет быстрее использовать один из них, чем писать такие функции самостоятельно, он будет надежным и хорошо протестирован, и предоставит другие полезные функции тоже.

EDIT

Мой основной опыт связан с Enterprise Library, с которой я всегда использовал технику, которую @paxdiablo описывает в своем ответе, начиная новый файл журнала каждые x дней / недель / Кб / и т. Д. Я не уверен в том, что нужно урезать один файл до определенного размера, но я думаю, что это возможно с этими библиотеками.

...