c++ - 日期更改为次日时的 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
谢谢你
解决方案
看起来有人在轮换之前已经删除了日志文件。它可能是一个外部进程,或 Boost.Log。
使用 Boost.Log,如果您有多个将日志文件写入同一目录的文件接收器,则可能会发生这种情况,该目录也用作旋转文件的目标目录(即 FileName 参数包括 Target 参数中指定的路径,并且有多个接收器使用该路径)。问题是因为,根据 ScanForFiles=All,库会扫描目标目录中的任何文件,但不会更新用于创建新文件的文件计数器。这意味着如果在您的进程启动时该目录中存在文件“quo.20181027T173106.Sat.00000.log.detail”,那么它将被视为旧文件,即使在启动时您的进程仍会写入新日志到那个文件。然后,当发生文件轮换并超出存储限制时(例如,如果 MinFreeSpace 不满足),该文件可能会被删除。轮换必须发生在另一个仍将文件存储到同一“日志”目录中的接收器上。
要解决此问题,您可以执行以下操作之一:
- 在您的设置中使用 ScanForFiles=Matching 以便在扫描后更新文件计数器。这将确保新的日志文件具有唯一的名称并且不会被过早删除。
- 将日志文件写入与目标存储不同的目录。即指定FileName,使其不指向与Target 相同的目录。
此外,您可能希望添加异常处理以避免在出现错误时崩溃(无论出于何种原因,文件系统操作仍可能发生)。有关更多信息,请参见此处和此处(另外,请点击这些部分中的链接)。
推荐阅读
- google-cloud-platform - 从 GCP 向 Segment.io 发送 HTTP POST 请求
- mongodb - MongoDB $文本搜索未返回预期结果
- php - 在 Prestashop 1.7 的后台显示自定义挂钩
- flutter - 在 Flutter 中使用“bottomNavigationBar”后,“body”部分不可见
- python - 如何在 python 中用 2019-12-17T23:42:20Z 这种格式减去两个日期
- java - 来自嵌套 POJO 的比较器
- asp.net-core-webapi - request.IsPasswordGrantType() 在 ASP.NET Core 3.1 的 openiddict 中总是失败
- c# - 接受通过 ajax 在 Post 请求中发送的 Web API (C#) 中的 ArrayBuffer(不使用表单)
- html - 我可以使用 amp-state 设置简单的键值对吗?
- vue.js - 从组件发出侦听器后更改道具中使用的外部变量的值会禁用 Vue.js 中的 v-model 侦听器效果