【问题标题】:Why use a Logger instead of cout?为什么使用 Logger 而不是 cout?
【发布时间】:2021-12-04 10:49:07
【问题描述】:

在大多数开源 C++ 代码中,我可以看到使用了像 Google 日志库 glog 这样的记录器。但是有什么好处呢?我能找到的唯一优势:

  1. 日志记录是线程安全的,因此首选用于多线程
  2. 您可以选择严重性级别

所以,如果我不使用多线程并且我不需要严重级别,那么std::cout 可以安全使用还是应该继续使用记录器?为什么?

【问题讨论】:

  • (1) + (2) + (3) 通常可以禁用日志记录 + (4) 您可以将正常输出与日志输出分开。
  • 令人惊奇的是,鉴于 C++ 有三个厨房水槽和一个浴缸,没有一个 std::log iostream 可以通过各种方式进行外部配置。
  • cout 通常用于写入标准输出(虽然可以重定向)。如果这就是您所需要的,那么只需使用它。
  • 顺便说一句,“严重性级别”也可以通过std::cout << DebugInfo{"something Here"};之类的方法来实现

标签: c++ logging


【解决方案1】:

使用记录器通常比直接写入标准输出更通用。记录器通常可以配置为写入标准输出或文件或其他位置。

一般来说,除了玩具程序外,不建议直接使用std::cout。考虑你有一个函数

 void foo() {
      auto x = calculate_some_result();
      std::cout << x;
 }

那么这个函数的用处就很有限了:它只能写到std::cout,不能写到其他任何地方。然而,只要稍作改动,原则上它就可以将结果写入任何地方:

void foo(std::ostream& out) {
      auto x = calculate_some_result();
      out << x;
}

现在同一个函数可以写入文件、标准输出或任何其他ostream。由于此类输出通常在整个应用程序中使用,并且具有应用程序范围的配置是有益的,因此可以使用记录器(通常是全局对象):

 void foo() {
      auto x = calculate_some_result();
      LOGGER << x;
}

【讨论】:

    【解决方案2】:

    记录器为您提供更多控制 - 您可以调整严重性阈值,可以决定日志记录的位置(例如,文件、标准输出、其他地方)等无需重新编译程序

    如果这不是您关心的问题,并且您绝对确定您将始终希望将相同的输出输出到 stdout 并且永远不想调整它(至少在没有重新编译的情况下),请继续前进使用cout

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多