# Logging in Go

Go programs on Fuchsia generally use the [syslog package] and its `syslog.Infof()` functions.

See the [language agnostic logging docs](/docs/development/logs/concepts.md) for more information
about recording and viewing logs.

## Requirements

### GN dependencies

The necessary packages can be included with an addition to `deps` in `BUILD.gn`:

```
deps = [
    "//src/lib/component",
    "//src/lib/syslog/go",
]
```

See [Go: Overview][go-dev] for more information about building Go within Fuchsia.

### Sandbox dependency

In order to connect to a diagnostics service, `fuchsia.logger.LogSink` must be in the sandbox
of the connecting component's [`.cmx` file]:

```
{
  "sandbox": {
    "services": [
      "fuchsia.logger.LogSink"
    ]
  }
}
```

The syslog library will fallback to `stderr` if the `LogSink` connection fails.

## Initialization

Initializing without any tags will default to using the process name.

```golang
import (
    "go.fuchsia.dev/fuchsia/src/lib/component"
    syslog "go.fuchsia.dev/fuchsia/src/lib/syslog/go"
)

func main() {
  ctx := component.NewContextFromStartupInfo()
  {
    // Global tags, max 4 tags can be passed. Every log message is tagged with these.
    l, err := syslog.NewLoggerWithDefaults(ctx.Connector(), "my_tag")
    if err != nil {
      panic(err)
    }
    syslog.SetDefaultLogger(l)
  }
}
```

## Recording messages

The log methods have two variants: `Levelf` and `LevelTf` (e.g. `Infof` and `InfoTf`). The variant
of each method with a `T` accepts an additional tag for the message.

```golang
syslog.Infof("my msg: %d", 10);          // maps to INFO

// Allow message specific tagging. This message is going to be tagged with
// this local tag and any global tag passed during initialization.
syslog.InfoTf("tag", "my msg: %d", 10);

syslog.Warnf("my msg: %d", 10);          // maps to WARN
syslog.WarnTf("tag", "my msg: %d", 10);

syslog.Errorf("my msg: %d", 10);         // maps to ERROR
syslog.ErrorTf("tag", "my msg: %d", 10);

syslog.Fatalf("my msg: %d", 10);         // maps to FATAL
syslog.FatalTf("tag", "my msg: %d", 10);
```

## Standard streams

`fmt.Printf()`, `fmt.Sprintf()` etc. go to standard out (`stdout`) and standard error (`stderr`).

See [`stdout` & `stderr`] in the language-agnostic logging docs for details on the routing of stdio
streams in the system.

[syslog package]: /src/lib/syslog/go
[`.cmx` file]: /docs/concepts/components/v1/component_manifests.md
[go-dev]: /docs/development/languages/go/README.md
[`stdout` & `stderr`]: /docs/development/logs/recording.md#stdout-stderr
