Logging

Logging

Status

Accepted

Stakeholders

@Nikita Puzankov @Egor Ivkov

Outcome

Error rendering macro 'jira' : null

Due date

Aug 7, 2020

Owner

@Nikita Puzankov 

Background

To make logging process consistent across Iroha applications logging process should be introduced and logging format should be defined.

Action items

@Nikita Puzankov write RFC 
DevOps team - review it
@Nikita Puzankov move RFC to ADR

Problem

Unstructured logs are hard to monitor, analyze and process automatically.

  1. Logs should be printed to stdout and stderr.

  2. Log-level (verbosity) should be changeable in runtime, example: system signal (e.g., SIGUSR1, SIGHUP) to reread configs(env variable)  and change the log-level.

Solution

Log macros can log function arguments and result, using https://tools.ietf.org/html/rfc5424 or newer.  Nowadays de facto standard for log is JSON.

LEVEL DATE_TIME function_name[start]: arguments LEVEL DATE_TIME function_name[end]: result

Example:

DEBUG - 2020-08-04 08:09:40:759899847 - request[start]: DEBUG - 2020-08-04 08:09:40:759961514 - self = Client { public_key: PublicKey { digest_function: "ed25519", payload: "[1E, 0, 33, 8A, D, 96, B, B4, 4D, 9E, 7F, 3A, C1, 3C, A, 5D, 89, BF, 31, 8A, F8, 76, E2, FD, 15, 50, EE, 28, C5, EE, 9E, 63]" }, torii_url: "127.0.0.1:45371" },

Decisions

  • Use tracing as a logging facade.

  • Provide a `/configure` endpoint for changing the log-level at run-time. The request should be provided in terms of a JSON file.

  • Each function should be instrumented to provide vital (determined on a case-by-case basis) information.

  • Errors must be either handled, or logged as `warn` or `error` level messages.

  • Use tracing_bunyan_formatter to provide efficient machine readable logging. The destination is set at run-time and log rotation is the administrator's responsibility.

  • Fields and their values should be recorded directly, preferably (unless otherwise specified), using their names in the source code.

  • Logging that is done unconditionally upon entering/exiting a function is given the TRACE level.

  • Logging that is done upon completion of some or part of a function is given a DEBUG level or higher.

Concerns

  • Implementation of loggers could affect performance (tracing is one of the fastest)

  • Log rotation can become an issue.

Assumptions

  • We do not depend on any implementation, only on format

Risks

  • Format will be inefficient for automatic monitoring `[1;8]`

  • Logging will slow down performance `[4;7]`

  • Log messages format will not help in issues discovery `[2;8]`

Additional Information