Syslog

本文介绍如何使用 syslogger API。

组件清单依赖项

通过在组件清单中包含以下内容,确保组件具有所需的日志功能:

  • {.cmx}

    1. {
    2. "include": [
    3. "sdk/lib/diagnostics/syslog/client.shard.cmx"
    4. ],
    5. ...
    6. }
  • {.cml}

    1. {
    2. include: [
    3. "sdk/lib/diagnostics/syslog/client.shard.cmx"
    4. ],
    5. ...
    6. }

注意:以上内容仅适用于树内开发。在fxbug.dev/64207处对此进行了跟踪。树外的开发人员应该复制下面显示的代码片段。

  • {.cmx}

    1. {
    2. "sandbox": {
    3. "services": [
    4. "fuchsia.logger.LogSink"
    5. ]
    6. },
    7. ...
    8. }
  • {.cml}

    1. {
    2. use: [
    3. { protocol: "fuchsia.logger.LogSink" },
    4. ],
    5. }

默认配置

首次使用 API 时会延迟实例化全局 logger(更具体地说,是首次调用 fx_log_get_logger 时)。全局 logger 的默认配置为:

  • 使用进程名称作为标签
  • 将日志写入 fuchsia.logger.LogSink
  • FX_LOG_INFO 最低日志级别

在 C 中

BUILD.gn 依赖项

  1. //zircon/public/lib/syslog

日志消息

  1. FX_LOGF(INFO, "tag", "my msg: %d", 10);
  2. FX_LOG(INFO, "tag", "my msg");
  3. FX_LOGF(INFO, NULL, "my msg: %d", 10);

使用非默认配置

  1. #include <lib/syslog/global.h>
  2. int main(int argc, char** argv) {
  3. fx_logger_config_t config = {.min_severity = FX_LOG_INFO,
  4. .console_fd = -1,
  5. .log_service_channel = ZX_HANDLE_INVALID,
  6. .tags = (const char * []) {"gtag", "gtag2"},
  7. .num_tags = 2};
  8. fx_log_reconfigure(&config);
  9. }

参考

C API

在 C++ 中

BUILD.gn 依赖项

  1. //sdk/lib/syslog/cpp
  2. //sdk/lib/syslog/cpp:backend_legacy

日志消息

  1. FX_LOGS(INFO) << "my message";
  2. FX_LOGST(INFO, "tag") << "my message";

设置标签

默认情况下,进程名称用作标签,但是可以通过调用 syslog::SetTags 进行更改。

  1. #include <lib/syslog/cpp/log_settings.h>
  2. int main(int argc, char** argv) {
  3. syslog::SetTags({"tag1", "tag2"});
  4. }

设置日志设置

  1. #include "<lib/syslog/cpp/log_settings.h>
  2. int main(int argc, char** argv) {
  3. syslog::LogSettings settings = {.min_log_level = syslog::LOG_ERROR};
  4. syslog::SetLogSettings(settings, {"tag1", "tag2"});
  5. }

从命令行设置日志设置

  1. #include "src/lib/fxl/command_line.h"
  2. #include "src/lib/fxl/log_settings_command_line.h"
  3. int main(int argc, char** argv) {
  4. auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
  5. fxl::SetLogSettingsFromCommandLine(command_line, {"my_program"});
  6. }

从命令行初始化 syslog 的 GTest main

使用 syslog 的默认配置不需要初始化。如果您希望测试套件根据命令行参数(例如 —verbose)更改配置,请使用:

  1. //src/lib/fxl/test:gtest_main

参考

C++ API
命令行初始化 API