【问题标题】:Boost log autoflush does not work for filesBoost log autoflush 不适用于文件
【发布时间】:2017-03-22 10:08:11
【问题描述】:

我正在使用 boost 1.63 进行日志记录,并使用以下代码行来使用 Boost 配置文件进行日志记录:

Logger::initFromConfig(logConfigName);

我决定这样做是因为我希望它是可配置的,这样我就可以免于理解 Boost 日志设置 API。配置文件内容为:

[Core]
DisableLogging="false"

[Sinks.SYSLF]
Destination="TextFile"
Asynchronous="true"
AutoFlush="true"
Format="[%TimeStamp(format=\"%Y-%m-%d %H:%M:%S.%f\")%][%Severity%] %Message%"
Target="logs"
FileName="dsmip_%N.log"
RotationTimePoint="00:00:00"
ScanForFiles="Matching"
MaxSize="10000000"
Filter="%Severity% >= info"

[Sinks.Console]
Destination="Console"
AutoFlush="true"
Format="[%TimeStamp(format=\"%Y-%m-%d %H:%M:%S.%f\")%][%Severity%] %Message%"
Filter="%Severity% >= debug"

我的问题是自动刷新不适用于文件。在标准输出上,我会立即收到每个事件,但是当我退出应用程序时,文件会先写入。这对于日志记录来说是相当尴尬的......

一开始我用的是1.58,情况也是一样。我做错了什么?

提前谢谢你。 最好的问候:Balazs Bamer

【问题讨论】:

  • 由于您没有显示任何代码,因此很难提出任何建议。 Boost.Log 确实支持测试文件接收器的AutoFlush 参数,据我所知,它设置正确。我的一个想法是您的应用程序快速退出,并且由于接收器是异步的(由于Asynchronous 设置为true),专用处理记录线程无法在进程退出之前处理日志记录,此时排队的记录被冲洗。如果您确实希望尽快将记录保存在文件中,则应避免使用异步日志记录。
  • 你说得对,我忘了提到我用于日志初始化的小class。我从中使用的只是从配置文件初始化日志。但是,我的程序已经运行了几个小时,并且有足够的时间记录所有内容。我通过捕获 SIGTERM 和 SIGINT 来解决退出问题,并且在关机期间,甚至最后一个事件也会被记录下来。我也尝试将 RotationInterval 设置为 1 分钟。这样我即使在运行时也能获得完整的日志文件。将其设置为 1 小时将是一种易于管理的解决方法,尽管没有真正的解决方案。

标签: c++ logging boost


【解决方案1】:

Google 是我的朋友,我找到了解决方案 here。 Boost 实际上是这样操作的,它在应用程序目录中创建日志文件,并且仅在关闭时(日志轮换或程序存在)将其复制到目的地。因此,为了让所有日志文件出现在特定目录中,必须在文件名模式中包含目录名称以及在目标中。

[Sinks.SYSLF]
...
Target="logs"
FileName="logs/dsmip_%N.log"

最好的问候:巴拉兹

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多