---
title: "Getting started"
author: "NEST CoreDev Team"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Getting started}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

## Introduction
The `teal.logger` package utilizes the `logger` framework to record events within a package. `logger` is an R package that supports logging namespaces, hierarchical logging, various log destinations, vectorization, and more. For further details about `logger`, you can refer to:

* [GitHub](https://github.com/daroczig/logger)
* [CRAN](https://CRAN.R-project.org/package=logger)

## Default Logging Setup of `teal.logger`
`teal.logger` employs the `register_logger()` function to create a new logger in a user-defined namespace. `teal.logger` comes with a predefined pair of layout and logging level. Other packages in the `teal` framework utilize `teal.logger` to log crucial events, such as setting up `teal` data, alterations in the filter panel, records of merging data slices inside modules, and so on.

Defaults of `teal.logger`:

* Logging level: `logger.INFO`
* Logging layout: `[{level}] {format(time, \"%Y-%m-%d %H:%M:%OS4\")} pid:{pid} token:[{token}] {ans} {msg}`
* Logs emitted to `stdout`

For a more comprehensive understanding of various logging levels and layout interpretation, you can explore the [`logger` documentation](https://daroczig.github.io/logger/articles/customize_logger.html).

## Customizing the Log Level

While utilizing `register_logger()`, the default logging level for the new logger is `logger::INFO`. You can modify this behavior in four distinct ways:

1. Using the `logger` interface.
```r
library(teal.logger)
register_logger("my_namespace")
logger::log_threshold(logger::TRACE, namespace = "my_namespace")
```
Customizing `teal`'s logging level:
```r
library(teal.logger)
logger::log_threshold(logger::TRACE, namespace = "teal")
```

2. Utilizing the function argument of `register_logger()`.
```r
library(teal.logger)
register_logger("my_namespace", level = logger::TRACE)
```
Customizing `teal`'s logging level:
```r
library(teal.logger)
register_logger(namespace = "teal", level = logger::TRACE)
```

3. Setting an environment variable.
```r
library(teal.logger)
Sys.setenv(TEAL.LOG_LEVEL = "TRACE")
register_logger("my_namespace")
```
Customizing `teal`'s logging level:
```r
Sys.setenv(TEAL.LOG_LEVEL = "TRACE")
library(teal.logger)
```

4. Setting an `option`.
```r
library(teal.logger)
options(teal.log_level = logger::TRACE)
register_logger("my_namespace")
```
Customizing `teal`'s logging level:
```r
options(teal.log_level = logger::TRACE)
library(teal.logger)
```

Do keep in mind that packages in the `teal` framework register their loggers upon library loading. Therefore, if you intend to alter the default logging level via an option or a system environment variable, ensure you modify the variable before loading the library.

Example below:
```r
# library(teal)
# Sys.setenv(TEAL.LOG_LEVEL = "TRACE") # won't change the default
```
```r
# Sys.setenv(TEAL.LOG_LEVEL = "TRACE")
# library(teal)
# will change the default because teal is attached after changing the variable
```

Alternatively, you can change the options after loading a package and then call `register_logger()` with the appropriate namespace name to change the default of a single package. E.g. this will change the defaults of
`teal.logger`. Replace `teal.logger` with the name of the package you want to change.
```r
library(teal.logger)
Sys.setenv(TEAL.LOG_LEVEL = "TRACE")
register_logger('teal.logger')
```

For a more comprehensive understanding, consult the [`logger` documentation](https://daroczig.github.io/logger/articles/customize_logger.html) and the documentation for `register_logger()`.

## Customizing the Log Layout
When using `register_logger()`, the default log layout for the new logger is `[{level}] {format(time, \"%Y-%m-%d %H:%M:%OS4\")} pid:{pid} token:[{token}] {ans} {msg}`.You can modify this behavior in four distinct ways:

1. Using the `logger` interface.
```r
library(teal.logger)
register_logger("my_namespace")
logger::log_layout("{level} {msg}", namespace = "my_namespace")
```
Customizing `teal`'s logging layout:
```r
library(teal.logger)
logger::log_layout("{level} {msg}", namespace = "teal")
```

2. Utilizing the function argument of `register_logger()`.
```r
library(teal.logger)
register_logger("my_namespace", layout = "{level} {msg}")
```
Customizing `teal`'s logging layout:
```r
library(teal.logger)
register_logger(namespace = "teal", layout = "{level} {msg}")
```

3. Setting an environment variable.
```r
library(teal.logger)
Sys.setenv(TEAL.LOG_LAYOUT = "{level} {msg}")
register_logger("my_namespace")
```
Customizing `teal`'s logging layout:
```r
Sys.setenv(TEAL.LOG_LAYOUT = "{level} {msg}")
library(teal.logger)
```

4. Setting an `option`.
```r
library(teal.logger)
options(teal.log_layout = "{level} {msg}")
register_logger("my_namespace")
```
Customizing `teal`'s logging layout:
```r
options(teal.log_layout = "{level} {msg}")
library(teal.logger)
```

Like changing the log level, remember that `teal` registers its logger during library loading. Thus, if you aim to modify the default logging layout via an option or a system environment variable, ensure you adjust the variable prior to loading the library.

Example below:
```r
library(teal.logger)
Sys.setenv(TEAL.LOG_LAYOUT = "{level} {msg}") # won't change the default
```
```r
Sys.setenv(TEAL.LOG_LAYOUT = "{level} {msg}")
library(teal.logger)
# will change the default because teal is attached after changing the variable
```

Alternatively, you can change the options after loading a package and then call `register_logger()` with the appropriate namespace name to change the default of a single package. E.g. this will change the defaults of `teal.logger`. Replace `teal.logger` with the name of the package you want to change.
```r
library(teal.logger)
Sys.setenv(TEAL.LOG_LAYOUT = "{level} {msg}")
register_logger('teal.logger')
```

For additional insights, consult the [`logger` documentation](https://daroczig.github.io/logger/articles/customize_logger.html) and the documentation for `register_logger()`.

## Customizing the Log Destination
By default, `teal.logger` sends logs to `stdout`. If you wish to alter this behavior, you need to employ [`logger`'s API](https://daroczig.github.io/logger/articles/customize_logger.html#delivering-log-records-to-their-destination-1).

For instance, to redirect `teal`'s logs to `stderr` using `logger`'s API:
```r
library(teal.logger)
logger::log_appender(logger::appender_stderr, namespace = "teal")
```

## Logging in Other `teal.X` Packages
Additional `teal.X` packages, such as `teal.data`, employ `register_logger()` to enroll loggers in their namespace. Each package establishes a logger in the namespace equivalent to the package name, e.g., `teal.data` creates a logger in the `teal.data` namespace. A package initializes its logger during package loading and utilizes default logging settings, subject to modifications explained in the preceding sections.

## Example of Usage
Below is a minimal working example that demonstrates logging using `teal`'s logging setup. The default `TEAL.LOG.LEVEL` is `"INFO"`, implying that logs with a level above `level = 400` won't appear in `stdout`.
```r
library(teal.logger)
register_logger(namespace = "my_module")

logger::log_error("This is an ERROR level log from my module", namespace = "my_module") # 200
logger::log_warn("This is a WARN level log from my module", namespace = "my_module") # 300
logger::log_success("This is a SUCCESS level log from my module", namespace = "my_module") # 350
logger::log_info("This is an INFO level log from my module", namespace = "my_module") # 400
logger::log_info("This is a DEBUG level log from my module", namespace = "my_module") # 500
logger::log_trace("This is a TRACE level log from my module", namespace = "my_module") # 600
```