Исключение 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.

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

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