Исключение Boostlog, когда дата изменилась на следующий день
Я использую лог буста этим конфигом.
[Sinks.2]
Filter="%Severity% >= 2"
Destination=TextFile
AutoFlush=true
Format="[%TimeStamp%] [%ThreadID%] <%Severity%> %Message%"
Asynchronous=false
Target="logs"
FileName="logs/quo.%Y%m%dT%H%M%S.%a.%5N.log.detail"
RotationTimePoint="00:00:00"
RotationSize=104857600
MinFreeSpace=4294967296
MaxSize=4294967296
ScanForFiles=All
когда дата меняется на следующий день. мой программный сбой по исключению: прекращение вызова после выброса экземпляра
'boost::filesystem::filesystem_error'
what(): boost::filesystem::last_write_time: No such file or directory: "/root/work/hy-trade/bin/debug/logs/quo.20181027T173106.Sat.00000.log.detail"
Я проверяю свое дисковое пространство, нахожу в конфигурации меньше свободного места, чем MinFreeSpace, и файл quo.20181027T173106.Sat.00000.log.detail не существует.
как избежать этого исключения?
версия наддува 1.67
благодарю вас
1 ответ
Похоже, кто-то уже удалил файл журнала, прежде чем он был повернут. Это может быть внешний процесс или Boost.Log.
С Boost.Log это может произойти, если у вас есть несколько приемников файлов, которые записывают файлы журнала в один и тот же каталог, который также используется в качестве целевого каталога для повернутых файлов (т. Е. Параметр FileName включает путь, указанный в параметре Target, и Есть несколько приемников, которые используют этот путь). Проблема заключается в том, что, согласно ScanForFiles=All, библиотека сканирует целевой каталог на наличие файлов, но не обновляет счетчик файлов, который будет использоваться для создания новых файлов. Это означает, что если файл "quo.20181027T173106.Sat.00000.log.detail" присутствовал в этом каталоге при запуске вашего процесса, он будет считаться старым файлом, даже если при запуске ваш процесс будет по-прежнему записывать новые журналы в этот файл. Затем, когда происходит ротация файла и превышаются лимиты хранения (например, если MinFreeSpace не выполняется), этот файл может быть удален. Поворот должен происходить в другом приемнике, который все еще хранит файлы в том же каталоге "logs".
Для решения проблемы вы можете сделать одно из следующих действий:
- Используйте ScanForFiles=Matching в ваших настройках, чтобы счетчик файлов обновлялся после сканирования. Это гарантирует, что новые файлы журналов имеют уникальные имена и не будут удалены преждевременно.
- Записывайте файлы журналов в другой каталог из целевого хранилища. Т.е. укажите FileName, чтобы он не указывал на тот же каталог, что и Target.
Кроме того, вы можете захотеть добавить обработку исключений, чтобы избежать сбоев в случае ошибок (которые могут все же произойти по какой-либо причине в операциях файловой системы). Смотрите здесь и здесь для получения дополнительной информации (также, перейдите по ссылкам в этих разделах).