首页 > 解决方案 > 日期更改为次日时的 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 不存在。

如何避免这个异常?

boost的版本是1.67

谢谢你

标签: c++boostboost-logboost-logging

解决方案


看起来有人在轮换之前已经删除了日志文件。它可能是一个外部进程,或 Boost.Log。

使用 Boost.Log,如果您有多个将日志文件写入同一目录的文件接收器,则可能会发生这种情况,该目录也用作旋转文件的目标目录(即 FileName 参数包括 Target 参数中指定的路径,并且有多个接收器使用该路径)。问题是因为,根据 ScanForFiles=All,库会扫描目标目录中的任何文件,但不会更新用于创建新文件的文件计数器。这意味着如果在您的进程启动时该目录中存在文件“quo.20181027T173106.Sat.00000.log.detail”,那么它将被视为旧文件,即使在启动时您的进程仍会写入新日志到那个文件。然后,当发生文件轮换并超出存储限制时(例如,如果 MinFreeSpace 不满足),该文件可能会被删除。轮换必须发生在另一个仍将文件存储到同一“日志”目录中的接收器上。

要解决此问题,您可以执行以下操作之一:

  • 在您的设置中使用 ScanForFiles=Matching 以便在扫描后更新文件计数器。这将确保新的日志文件具有唯一的名称并且不会被过早删除。
  • 将日志文件写入与目标存储不同的目录。即指定FileName,使其不指向与Target 相同的目录。

此外,您可能希望添加异常处理以避免在出现错误时崩溃(无论出于何种原因,文件系统操作仍可能发生)。有关更多信息,请参见此处此处(另外,请点击这些部分中的链接)。


推荐阅读