# Logging strategy

This document describes the overall logging strategy of NBC.
This is a suggested guideline, rare events can have a higher logging level
than suggested in the guideline for example at beacon node start or stop.

The main objectives are:
- INFO log level or higher should be suitable for long-term use, i.e. running for months or weeks. Logs are the users' main interface their beacon node and validators. In particular it should not be a denial-of-service vector, either by leading to high CPU usage of the console or filling disk space at an unsustainable rate.
- INFO logs or higher should be target at users, logs only relevant to devs should be relegated to DEBUG or TRACE or commented out.
- DEBUG log level should still be readable by visual inspection during a slot time (6 seconds).

Here is the suggestion of content per log level

- Fatal: Node will crash
- Error: Bugs or critical unexpected behaviors
  - node cannot proceed with task
  - node consistency is compromised
- Warning: Errors that can be expected or handled
  - networking issue,
  - node cannot proceed with task but can recover or work in degraded mode (invalid bootstrap address, out of Infura requests)
- Notice: Important user and validator info and one-time events
  - node start/quit,
  - log about validator funds,
  - own PoS attestations,
  - own PoS blocks,
  - chain reached finality,
  - validators have been slashed (i.e. might indicate malicious activity or network/chain split)
- Info: standard user target
  - Networking or consensus information
- Debug: dev and debugging users
  - Common networking activity (new peers, kick peers, timeouts),
  - consensus/proof-of-stake various processing,
- Trace: dev only
  - Keep-alive,
  - routine tasks schedules
  - "spammy" tasks that clutter debugging (attestations received, status/control messages)

Logs done at high frequency should be summarized even at trace level to avoid drowning other subsystems.
For example they can use an uint8 counter with
```
proc myHighFreqProc() =
  var counter {.threadvar.}: uint8
  if counter == 255:
    trace "Total of 255 myHighFreqProc call"
  counter += 1
```