blob: b8e292b42d6a39f0689e04afdc657d6e3174b4db [file] [log] [blame] [view] [edit]
# Viewing logs
Logs are primarily consumed in either an interactive [online](#online) context
with a live Fuchsia target device or in an [offline](#offline) context with
logs collected from past execution of a device.
All logs have a timestamp attached, which is the time since booting the device
and recording the log message. A reader may receive messages in a different
order than indicated by their timestamps.
There are two buffers, volatile and persistent, that store logs. For more
information about where logs are stored on a device, see
[Storage][logs-storage-concepts].
## Online {#online}
The Logs from Fuchsia can be viewed interactively through `ffx log`.
Note: For more information on using `ffx log`, see [`ffx log`][ffx-log-ref].
```posix-terminal
ffx log
```
To view specifics logs, you can use the options such as `--filter`, `--tag`,
`--moniker`. For example, you can use `--filter` to see all logs tagged with
`network`:
```posix-terminal
ffx log --filter network
```
If you work on things such as bringup or don't have network access to the device,
you can connect to a Fuchsia device through a serial console. In those
cases, you can use [`log_listener`](#log_listener).
### log_listener
Note: For more information on the `log_listener` CLI, see
[`log_listener`][log-listener-ref].
During development, you can use [`ffx log`][ffx-log-ref] to see all logs
including those [forwarded from the klog].
For scenarios when you only have access to the serial console, no network access,
or you are simply working on a `bringup` build, it can be useful to run
[`log_listener`] in the serial console. This command uses the same CLI as
`ffx log`. If you are working with `log_listener`, any example that uses
`ffx log` can be replaced with `log_listener`.
`ffx log` receives logs through the [`fuchsia.diagnostics.ArchiveAccessor`]
protocol.
### Format
Logs are printed in this format:
```none
[seconds since boot][pid][tid][tags] SEVERITY: message
```
The timestamp is relative to the time since boot and it is formatted with
microsecond granularity.
Note: You can use the `--clock` option of [`ffx log`][ffx-log-ref] to change
the timestamp.
If the message `Something happened` is written at `WARN` severity level by
the `my-component` component from process `1902`, thread `1904` and time
`278.14`, the output looks like:
```none
[278.14][1902][1904][my-component] WARN: Something happened
```
The `ffx log` command has several options such as `--show-metadata` and
`--show-full-moniker` to display more metadata about a log. If you have a
Fuchsia device running, you can run `ffx log --help` to see the options for
modifying the output format.
See [`ffx log`][ffx-log-ref] for more information.
### Dynamically setting minimum log severity
By default, components that integrate with [`fuchsia.logger.LogSink`] through
Fuchsia's logging libraries, support the configuration of their minimum log
severity at runtime.
You can do this by passing `--set-severity` to `ffx log`. The `--set-severity`
option accepts a string argument in the format of `<component_query>#<SEVERITY>`,
where `<component_query>` is a string that will fuzzy match a component moniker
or URL and `<severity>` is one of `TRACE`, `DEBUG`,`INFO`,`WARN`,`ERROR`,`FATAL`.
For example, if you run:
```posix-terminal
ffx log --set-severity netstack#DEBUG
```
The `core/network/netstack` component starts emitting `DEBUG` logs and the
`ffx log` output prints a log stream containing `DEBUG` logs for `netstack`.
When the command is stopped (for example through Ctrl-C) the component goes
back to emitting logs with its default minimum severity (typically `INFO`).
This functionality is also supported for tests. For more information, see
[Set the minimum log severity][test-dynamic-severity].
## `fx test` {#fx-test}
Under the hood, `fx test` calls `run-test-suite`, which collects isolated
`stdout`, `stderr`, and `LogSink` connections from test components, printing
the output inline and preventing them showing up in the global log buffers.
For tests that are not yet components no interception of logs is performed.
For more information about hermetic tests, see
[Hermetic integration tests][hermetic-integration-tests].
## Kernel logs
The `klog` or [debuglog] is [printed over the kernel console][kernel-console]
and serial console.
[`netsvc`] forwards the `klog` over UDP, which is the printed output when you run
`fx klog`. If you cannot run `ffx log` or establish an SSH connection to a
Fuchsia device fails, you can run `fx klog` in a background terminal to capture
kernel logs.
Alternatively, you can also use [`dlog`] from a device shell to dump the kernel
debug logs.
### Format
Note: You can also run `ffx log --kernel` to view the kernel logs.
Kernel logs from the serial logs are printed in this format:
```none
[timestamp] pid:tid> message
```
The timestamp is based on the time since the device booted. It is formatted with 5 digits
(leading zeroes) for seconds and three digits for milliseconds (trailing zeroes).
Process and thread KOIDs are written with 5 digits each (leading zeroes).
If the message `Something happened` is written from process `1902`, thread
`1904`, and time `278.14`, the output looks like:
```none
[00278.140] 01902:01904> Something happened
```
You can use the `fx pretty_serial` command to reduce the metadata printed by
klog and color code log lines by severity. With `fx pretty_serial`, some
metadata, such as PID, TID, filenames, is hidden, while other metadata,
such as timestamp and severity, are trimmed down.
Serial output should be piped in from the emulator or from other sources.
For example, to view the pretty output of the kernel logs from an emulator:
```posix-terminal
ffx emu start --console | ffx debug symbolize
```
For example, if the message `Something happened` is printed to klog at
`WARN` severity level by the `my-component` component at time `278.14`, the
pretty output looks like:
```none
[278.14][my-component][W] Something happened
```
For example, if the message `Something happened` is printed to klog with
an unknown severity by an unknown component at time `278.14`, the pretty output
looks like:
```none
[278.14] Something happened
```
## Sending syslog to serial
Some logs from syslog are printed to the serial console. By
default, this includes all the components under the `bootstrap` realm such as:
drivers and `driver_manager`. Additional components may be added through the
[Diagnostics assembly configuration][assembly-diagnostics].
## Offline: CQ/CI/LUCI {#offline}
When running tests, a [Swarming] bot invokes [botanist], which collects
several output streams to be presented in the web UI. In the web UI, The "Swarming
task UI" displays the `stdout` and `stderr` of botanist.
For individual test executables, botanist uses the [testrunner] library and
collects that output separately. You can see this output after a
test fails with a link named `stdio`. Most tests that `testrunner` invokes run
`run-test-suite` through an SSH connection to the target device. This collects
the `stdout`, `stderr`, and logs from the test environment and prints them
inline.
### syslog.txt
The `syslog.txt` file contains the output from Botanist running `ffx log`
on the target device.
### infra_and_test_std_and_klog.txt
The `infra_and_test_std_and_klog.txt` log includes the `stdout` and `stderr` of
the command run by the [Swarming] task.
Normally this includes the following:
* [Botanist]'s log messages.
* Kernel log from [`netsvc`]. This is equivalent to `fx klog`.
* The `stdout`, `stderr`, and test logs of the tests that `testrunner` runs.
This aggregated log is run through the equivalent of `ffx debug symbolize`
before being uploaded and visible in the web UI.
### serial_log.txt
The `serial_log.txt` log includes serial logs from a target device.
### triage_output.txt
The `triage_output.txt` log includes the results of running the [triage tool]
on a snapshot collected from a target device.
### summary.json
The `summary.json` log includes a structured output summary of the test
execution.
### $debug details
The `$debug` details include debug logs emitted during the execution of infra's
recipe steps.
### $execution details
The `$execution` details of a recipe step, including the command run and
details about the execution environment. This log is often helpful for
reproducing the recipe step locally.
[hermetic-integration-tests]: /docs/reference/testing/what-tests-to-write.md#hermetic_integration_tests
[ffx-log-ref]: https://fuchsia.dev/reference/tools/sdk/ffx#ffx_log
[debuglog]: /docs/reference/kernel_objects/debuglog.md
[logs-storage-concepts]: /docs/concepts/components/diagnostics/README.md#log_storage
[`log_listener`]: /src/diagnostics/log_listener/README.md
[kernel-console]: /zircon/kernel/lib/debuglog/debuglog.cc
[`netsvc`]: /src/bringup/bin/netsvc/debuglog.cc
[`dlog`]: /src/bringup/bin/dlog/README.md
[botanist]: /tools/botanist/cmd/main.go
[testrunner]: /tools/testing/testrunner/lib.go
[triage tool]: /docs/development/diagnostics/triage/README.md
[Swarming]: https://chromium.googlesource.com/infra/luci/luci-py/+/HEAD/appengine/swarming/doc/README.md
[log-listener-ref]: /docs/reference/diagnostics/consumers/log_listener.md
[forwarded from the klog]: /docs/development/diagnostics/logs/recording.md#forwarding-klog-to-syslog
[`fuchsia.diagnostics.ArchiveAccessor`]: /reference/fidl/fuchsia.diagnostics#ArchiveAccessor
[assembly-diagnostics]: /reference/assembly/DiagnosticsConfig/index.md
[test-dynamic-severity]: /docs/development/testing/run_fuchsia_tests.md#set_the_minimum_log_severity
[`fuchsia.logger.LogSink`]: /reference/fidl/fuchsia.logger#LogSink