Rust 日志

在 Fuchsia 系统中的 Rust 程序一般使用 log crate 和 它的 info!/warn!/error! 宏。fuchsia_syslog crate 被用来做初始化。

查看 语言无关日志文档 获取更多关于记录和查看日志的信息。

要求

GN 依赖

必须的 crate 可以在 BUILD.gn 中通过添加两个添加项到 deps 而包含进来:

  1. deps = [
  2. "//src/lib/syslog/rust:syslog", # 用于初始化
  3. "//third_party/rust_crates:log", # 用于记录消息
  4. ]

查看 Rust: 概述 获取更多关于在 Fuchsia 上构建 Rust 的信息。

组件清单依赖 {#menifest}

把下边的内容包容到你的组件清单中来确保你的组件拥有要求的能力以打开日志:

  • {.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.cml"
    4. ],
    5. ...
    6. }

注意:上边的配置只可用于 Fuchsia 树中的开发。关于这个问题可以在 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. }

    如果 LogSink 连接失败,系统日志库会回退至 stderr

初始化

Rust 的 log crate 在可以发送消息之前必须连接到 Fuchsia 后端。库初始化失败会导致消息丢失。

基本配置

在你的组件的 main.rs 中:

  1. use fuchsia_syslog as syslog;
  2. fn main() {
  3. // 使用进程名来配置一个单一标签
  4. syslog::init().unwrap();
  5. }

标签

默认的,所有的日志消息使用进程名来做为标签。标签可以在程序的更多分类日志消息里使用,它们也可以被全局重载。

  1. use fuchsia_syslog as syslog;
  2. fn main() {
  3. // 为标签重载进程名的使用
  4. syslog::init_with_tags(&["my_tags"]).unwrap();
  5. // 仅为这个消息使用额外的标签
  6. syslog::fx_log_info!(tag: "init", "an update on program initialization");
  7. }

配置日志等级

系统日志 crate 等级始于 INFO ,但是可以重载。

  1. use fuchsia_syslog as syslog;
  2. fn main() {
  3. syslog::init().unwrap();
  4. // 替换日志等级为 WARN
  5. syslog::set_severity(syslog::levels::WARN);
  6. }

记录消息

大多数日志使用的 log crate 的宏:

  1. trace!("something happened: {}", 5); // 映射到 TRACE
  2. debug!("something happened: {}", 4); // 映射到 DEBUG
  3. info!("something happened: {}", 3); // 映射到 INFO
  4. warn!("something happened: {}", 2); // 映射到 WARN
  5. error!("something happened: {}", 1); // 映射到 ERROR

fuchsia_syslog crate 也提供了类似 fx_log_info! 的宏,允许手动指定消息的标签。

标准流

println!, eprintln! 等,会去到标准输出 (stdout) 和标准错误 (stderr)。 在语言无关日志文档中查看 stdout & stderr 的细节,可以看到标准输入输出流在系统中的路由。