blob: 28e9739f28c454998581700ba21bbf8c243a2ccd [file] [log] [blame] [view]
# Logging in Rust
This document explains how to get started with logging in Rust programs on
Fuchsia. For general information about recording and viewing logs, see the
[language-agnostic logging documentation][doc-logging].
## Required capabilities {#capabilities}
Ensure that your component requests the appropriate logging capabilities by
including the following in your component manifest:
```json5
{
include: [
"syslog/client.shard.cml"
],
...
}
```
## Initialization {#initialization}
You must initialize logging before you can [record logs](#record) from Rust code.
Initialization is handled by the [`fuchsia`][ref-fuchsia] crate setup macros.
### GN dependencies
Add the following `deps` to your `BUILD.gn` file:
```gn
deps = [
"//src/lib/fuchsia",
]
```
### Setup
In your Rust source files, logging is enabled by default for any function
initialized using the `fuchsia::main` or `fuchsia::test` macros:
```rust
#[fuchsia::main]
fn main() {
// ...
}
#[fuchsia::test]
fn example_test() {
// ...
}
```
You can also pass the `logging` flag to make this explicit:
```rust
#[fuchsia::main(logging = true)]
fn main() {
// ...
}
#[fuchsia::test(logging = true)]
fn example_test() {
// ...
}
```
## Add tags
Log messages can include one or more tags to provide additional context.
To enable log tags for a given scope, pass the `logging_tags` parameter during
[initialization](#initialization):
```rust
#[fuchsia::main(logging_tags = ["foo", "bar"])]
fn main() {
// ...
}
#[fuchsia::test(logging_tags = ["foo", "bar"])]
fn example_test_with_tags() {
// ...
}
```
## Record logs {#record}
Rust programs on Fuchsia generally use the `tracing` crate macros to record
logs.
### GN dependencies
Add the `tracing` crate to the `deps` entry of your `BUILD.gn` file:
```gn
deps = [
"//third_party/rust_crates:tracing",
]
```
### Log events
Call the macros provided by the [`tracing`][trc] crate to record logs at the declared
severity level:
```rust
use tracing;
fn main() {
tracing::trace!("something happened: {}", 5); // maps to TRACE
tracing::debug!("something happened: {}", 4); // maps to DEBUG
tracing::info!("something happened: {}", 3); // maps to INFO
tracing::warn!("something happened: {}", 2); // maps to WARN
tracing::error!("something happened: {}", 1); // maps to ERROR
}
```
Note: While we provide our own `FX_` prefixed logging macros in
C++, we have aligned on the [`tracing`][trc] crate as the logging
interface for Rust. See their [documentation][trc] for guidance on
how to format your logs.
## Standard streams
Rust macros such as `println!`, `eprintln!` etc. map to standard out (`stdout`)
and standard error (`stderr`). Using these streams may require additional setup
work for your program.
For more details, see the [standard streams][std-streams] section in the
language-agnostic logging documentation.
[doc-logging]: /docs/concepts/components/diagnostics/logs/README.md
[ref-fuchsia]: https://fuchsia-docs.firebaseapp.com/rust/fuchsia/
[rust-dev]: /docs/development/languages/rust/README.md
[std-streams]: /docs/development/diagnostics/logs/recording.md#stdout-stderr
[trc]: https://fuchsia-docs.firebaseapp.com/rust/tracing/index.html