# Syslog

This document explains how to get started with syslogger APIs.

## Component manifest

The fuchsia.logger.LogSink capability must be exposed to the component that uses
the syslog API.

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

## Default configuration

The global logger is lazily instantiated on the first use of the API (more
specifically, on the first call to `fx_log_get_logger`). The default
configuration for the global logger is:

- Use process name as the tag
- Write logs to `fuchsia.logger.LogSink`
- Min log level of `FX_LOG_INFO`

## In C

### BUILD.gn dependency

```gn
//zircon/public/lib/syslog
```

### Log messages

```C
FX_LOGF(INFO, "tag", "my msg: %d", 10);
FX_LOG(INFO, "tag", "my msg");
FX_LOGF(INFO, NULL, "my msg: %d", 10);
```

### Using non-default configuration

```C
#include <lib/syslog/global.h>

int main(int argc, char** argv) {
    fx_logger_config_t config = {.min_severity = FX_LOG_INFO,
                                 .console_fd = -1,
                                 .log_service_channel = ZX_HANDLE_INVALID,
                                 .tags = (const char * []) {"gtag", "gtag2"},
                                 .num_tags = 2};
    fx_log_reconfigure(&config);
}
```

### Reference

[C APIs](/zircon/system/ulib/syslog/include/lib/syslog/global.h)

## In C++

### BUILD.gn dependency

```gn
//sdk/lib/syslog/cpp
//sdk/lib/syslog/cpp:backend_legacy
```

### Log messages

```C++
FX_LOGS(INFO) << "my message";
FX_LOGST(INFO, "tag") << "my message";
```

### Set tags

By default, the process name is used as the tag, but this can be changed by
calling `syslog::SetTags`.

```C++
#include <lib/syslog/cpp/log_settings.h>

int main(int argc, char** argv) {
     syslog::SetTags({"tag1", "tag2"});
}
```

### Set settings

```C++
#include "<lib/syslog/cpp/log_settings.h>

int main(int argc, char** argv) {
     syslog::LogSettings settings = {.min_log_level = syslog::LOG_ERROR};
     syslog::SetLogSettings(settings, {"tag1", "tag2"});
}
```

### Set settings from command line

```C++
#include "src/lib/fxl/command_line.h"
#include "src/lib/fxl/log_settings_command_line.h"

int main(int argc, char** argv) {
    auto command_line = fxl::CommandLineFromArgcArgv(argc, argv);
    fxl::SetLogSettingsFromCommandLine(command_line, {"my_program"});
}
```

### GTest main with syslog initialized from command line

No initialization is required for using the default configuration of
syslog. If you would like your test suite to change the configuration
based on command line arguments (e.g. --verbose), use:

```gn
//src/lib/fxl/test:gtest_main
```

### Reference

[C++ APIs](/sdk/lib/syslog/cpp/macros.h)
<br/>
[Command line initialization API](/src/lib/fxl/log_settings_command_line.h)
