---
title: "ClikaRT::logging::Logger"
sidebar_label: "Logger"
description: "A handle to a logging channel. Copyable and cheap (shares the channel)."
---

<!-- Generated by tools/doxygen2mdx from Doxygen XML. Do not edit. -->

<span class="api-kind api-kind--class">class</span>

**Header:** `ClikaRT/logging/logging.h`

[ClikaRT](../../index.md)'s logger: a configurable logging channel that is always present and always able to emit at any level (debug included), separate from whatever logging the host application uses. Verbosity is set at runtime; the default is `Debug` in debug builds and `Info` in release, overridable via the `CLIKA_RT_LOG_VERBOSITY` environment variable (see [`ClikaRT/common/env_vars.h`](../env/index.md#env_vars-h)).

Create your own named channels with `get_logger("my-name")`; the default channel is `logger()` (named "ClikaRT").

## Macros

### \#define CLIKART\_LOG\_FORMAT\_ {#CLIKART_LOG_FORMAT_}

<div class="api-signature">

`#define` **`CLIKART_LOG_FORMAT_(...)`** `::ClikaRT::logging::detail::log_format(__VA_ARGS__)`

</div>

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 186

</div>

### \#define CLIKART\_LOG\_AT {#CLIKART_LOG_AT}

<div class="api-signature">

`#define` **`CLIKART_LOG_AT(level_, method_, ...)`** `do {                                                                      \     const ::ClikaRT::logging::Logger clikart_lg_ = ::ClikaRT::logging::logger();            \     if (clikart_lg_.should_log(level_))                                   \         clikart_lg_.method_(CLIKART_LOG_FORMAT_(__VA_ARGS__));            \ } while (0)`

</div>

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 189

</div>

### \#define CLIKART\_LOG\_TRACE {#CLIKART_LOG_TRACE}

<div class="api-signature">

`#define` **`CLIKART_LOG_TRACE(...)`** `CLIKART_LOG_AT(::ClikaRT::logging::LogLevel::Trace, trace, __VA_ARGS__)`

</div>

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 196

</div>

### \#define CLIKART\_LOG\_DEBUG {#CLIKART_LOG_DEBUG}

<div class="api-signature">

`#define` **`CLIKART_LOG_DEBUG(...)`** `CLIKART_LOG_AT(::ClikaRT::logging::LogLevel::Debug, debug, __VA_ARGS__)`

</div>

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 197

</div>

### \#define CLIKART\_LOG\_INFO {#CLIKART_LOG_INFO}

<div class="api-signature">

`#define` **`CLIKART_LOG_INFO(...)`** `CLIKART_LOG_AT(::ClikaRT::logging::LogLevel::Info,  info,  __VA_ARGS__)`

</div>

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 198

</div>

### \#define CLIKART\_LOG\_WARN {#CLIKART_LOG_WARN}

<div class="api-signature">

`#define` **`CLIKART_LOG_WARN(...)`** `CLIKART_LOG_AT(::ClikaRT::logging::LogLevel::Warn,  warn,  __VA_ARGS__)`

</div>

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 199

</div>

### \#define CLIKART\_LOG\_ERROR {#CLIKART_LOG_ERROR}

<div class="api-signature">

`#define` **`CLIKART_LOG_ERROR(...)`** `CLIKART_LOG_AT(::ClikaRT::logging::LogLevel::Error, error, __VA_ARGS__)`

</div>

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 200

</div>

A handle to a logging channel. Copyable and cheap (shares the channel). All methods take an already-formatted message; use the `CLIKART_LOG_*` macros (or `std::format`) to build it; [`should_log`](./Logger.md#should_log) lets a caller skip formatting work when the level is disabled.

## Member functions

### log() {#log}

<div class="api-signature">

`void` **`log`**([`LogLevel`](./index.md#LogLevel) `level`, `std::string_view` `message`) `const`

</div>

Emit `message` at [`level`](./Logger.md#level) (dropped below the channel threshold).

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 63

</div>

### trace() {#trace}

<div class="api-signature">

`void` **`trace`**(`std::string_view` `message`) `const`

</div>

Emit at Trace.

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 65

</div>

### debug() {#debug}

<div class="api-signature">

`void` **`debug`**(`std::string_view` `message`) `const`

</div>

Emit at Debug.

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 67

</div>

### info() {#info}

<div class="api-signature">

`void` **`info`**(`std::string_view` `message`) `const`

</div>

Emit at Info.

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 69

</div>

### warn() {#warn}

<div class="api-signature">

`void` **`warn`**(`std::string_view` `message`) `const`

</div>

Emit at Warn.

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 71

</div>

### error() {#error}

<div class="api-signature">

`void` **`error`**(`std::string_view` `message`) `const`

</div>

Emit at [Error](../Error.md).

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 73

</div>

### set\_level() {#set_level}

<div class="api-signature">

`void` **`set_level`**([`LogLevel`](./index.md#LogLevel) `level`) `const`

</div>

Set / read this channel's minimum level at runtime.

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 76

</div>

### level() {#level}

<div class="api-signature">

[`LogLevel`](./index.md#LogLevel) **`level`**() `const`

</div>

the current threshold

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 77

</div>

### should\_log() {#should_log}

<div class="api-signature">

`bool` **`should_log`**([`LogLevel`](./index.md#LogLevel) `level`) `const`

</div>

True if a message at [`level`](./Logger.md#level) would be emitted (cheap pre-check).

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 79

</div>

### name() {#name}

<div class="api-signature">

`std::string` **`name`**() `const`

</div>

this channel's name

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 81

</div>

### add\_file\_handler() {#add_file_handler}

<div class="api-signature">

`void` **`add_file_handler`**(`std::string_view` `path`) `const`

</div>

Also write this channel's records to `path` (appended to existing handlers).

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 87

</div>

### add\_callback\_handler() {#add_callback_handler}

<div class="api-signature">

`void` **`add_callback_handler`**(`std::function<void(`[`LogLevel`](./index.md#LogLevel)`, std::string_view)>` `callback`) `const`

</div>

Also deliver each formatted record to `callback(level, line)` (the line has no trailing newline). The callback must be cheap and must not log back to this channel. A throw from it is contained in your own runtime and swallowed; the sink fires under the sink lock, from whichever thread logged, and must never unwind into the library.

<div class="api-declared">

Declared in `ClikaRT/logging/logging.h`, line 94

</div>
