Class Logger

Summary

The Logger class implements the logger functionality.

Description

The logger is constructed on top of a console object, where the messages are logged.

Use log.always() instead of the console.log(), since it accounts for different contexts, created for example when using REPL.

There is no critical level, corresponding to errors that prevent the program to run, since these are actually related to bugs; use assert() instead.

The messages may include formatting directives, with additional arguments, as defined by the Node.js console (not really necessary with ES6).

All output functions accept an optional string message and possibly some arguments, as processed by the standard Node.js util.format(msg, ...args) function.

If the logging code is more complex than a single line, for example if it needs a long loop, it is recommended to explicitly check the log level and, if not high enough, skip the code entirely.

Example

  if (log.isVerbose) {
for (const [folderName, folder] of Object.entries(folders)) {
log.trace(`'${folderName}' ${folder.toolchainOptions}`)
}
}

There are cases when the logger must be created very early in the life cycle of an application, even before it is practically possible to determine the log level.

For these cases, if the logger is created without a log level, it is set to a preliminary state, and all log lines are stored in an internal buffer, until the log level is set, when the buffer is walked and the lines are processed.

Hierarchy

  • Logger

Constructors

Accessors - Log Level Checks

Accessors - Log Level Management

Accessors - Other

Methods - Other

Methods - Output

Properties

Constructors

  • Summary

    Create a Logger instance.

    Description

    The typical use case is to create a logger with a given log level, usually info.

    Example

    const log = new Logger({
    level: 'info'
    })

    By default, the system console is used.

    The complete use case is to create the logger instance with both a console and a level. This might be particularly useful in tests, where a mock console can be used to capture log messages.

    Example

    const log = new Logger({
    console: mockConsole,
    level: 'info'
    })

    If present, the console must be an object derived from the node Console, possibly with some methods overridden.

    The level property is optional since it can be set later. Without it, the constructor will create the logger in a preliminary state, and all log lines will be stored in an internal buffer until the log level is set.

    Example

    const log = new Logger()
    

    Parameters

    • params: {
          level?: LogLevel;
          console?: Console;
      } = {}

      The generic object used to pass parameters to the constructor.

      • Optional level?: LogLevel

        Summary

        Log level.

        Description

        The name of the log level; if not passed, the logger is created in a preliminary state, and all log lines will be stored in an internal buffer, until the log level is set.

      • Optional console?: Console

        Summary

        Underlying console.

        Description

        The console object used to log the message; by default, the JavaScript standard console object is used.

    Returns Logger

Accessors - Log Level Checks

  • get isSilent(): boolean
  • Summary

    Accessor to check the log level.

    Returns

    True if the log level is silent or higher.

    Remarks

    • changed to an accessor in v3.0.0.

    Returns boolean

  • get isError(): boolean
  • Summary

    Accessor to check the log level.

    Returns

    True if the log level is error or higher.

    Remarks

    • changed to an accessor in v3.0.0.

    Returns boolean

  • get isWarn(): boolean
  • Summary

    Accessor to check the log level.

    Returns

    True if the log level is warn or higher.

    Remarks

    • changed to an accessor in v3.0.0.

    Returns boolean

  • get isInfo(): boolean
  • Summary

    Accessor to check the log level.

    Returns

    True if the log level is info or higher.

    Remarks

    • changed to an accessor in v3.0.0.

    Returns boolean

  • get isVerbose(): boolean
  • Summary

    Accessor to check the log level.

    Returns

    True if the log level is verbose or higher.

    Remarks

    • changed to an accessor in v3.0.0.

    Returns boolean

  • get isDebug(): boolean
  • Summary

    Accessor to check the log level.

    Returns

    True if the log level is debug or higher.

    Remarks

    • changed to an accessor in v3.0.0.

    Returns boolean

  • get isTrace(): boolean
  • Summary

    Accessor to check the log level.

    Returns

    True if the log level is trace or higher.

    Remarks

    • changed to an accessor in v3.0.0.

    Returns boolean

  • get isAll(): boolean
  • Summary

    Accessor to check the log level.

    Returns

    True if the log level is all.

    Remarks

    • changed to an accessor in v3.0.0.

    Returns boolean

Accessors - Log Level Management

  • get hasLevel(): boolean
  • Summary

    Accessor to check if the log level was initialised.

    Returns

    True if the level was set.

    Description

    If the logger was created without an explicit log level, the logger is in a preliminary state and all log lines will be stored in an internal buffer until the log level is set.

    Example

    if (!log.hasLevel) {
    log.level = defaultLevel
    }

    Remarks

    • changed to an accessor in v5.0.0
    • added as a method in v2.1.0

    Returns boolean

  • get level(): undefined | LogLevel
  • Summary

    Accessor to get the log level.

    Returns

    The log level name.

    Description

    Get the current log level, as a string.

    Example

    console.log(log.level)
    

    Returns undefined | LogLevel

  • set level(level): void
  • Summary

    Accessor to set the log level.

    Description

    Set the log level. If this is the first time when the log level is set, flush the internal buffer.

    Example

    log.level = 'info'
    

    If the log level is not one of the known strings, an assert will fire.

    Parameters

    • level: undefined | LogLevel

      The new log level.

    Returns void

Accessors - Other

  • get console(): Console
  • Summary

    Accessor to get the underlying console object.

    Returns

    The console object used by the logger.

    Description

    Direct access to the console object is useful in tests, when the console is a mock object, which allows to check the logged messages.

    Returns Console

Methods - Other

  • Summary

    Check if the log level is set to a given level name.

    Returns

    True if the current log level is equal to the given level or higher.

    Description

    This is a more generic version of the accessors (like isDebug, etc), to be used when the log level is not know at compile time.

    It can also be used to ensure that the log level is not decreased, for example:

    Example

    if (!log.islevel(newLevel)) {
    log.level = newLevel
    }

    Remarks

    • added in v6.0.0

    Parameters

    • level: LogLevel

      The name of the log level.

    Returns boolean

  • Summary

    The internal log writer.

    Description

    If the log level was defined, call the function, otherwise store the log line details in the array buffer, for later processing, when the log level is defined.

    Parameters

    • numericLevel: number

      The log numeric level.

    • loggerFunction: LoggerFunction

      The function to be used to write the message.

    • message: undefined | string

      The log message.

    Returns void

Methods - Output

  • Summary

    Log a message.

    Description

    Log the message always, regardless of the log level, (even 'silent', when no other messages are logged).

    The message is passed via console.log().

    Example

    log.always(version)
    

    Parameters

    • message: any = ''

      Message to log, as accepted by util.format().

    • Rest ...args: any[]

      Optional variable arguments.

    Returns void

  • Summary

    Log an error message.

    Description

    Log a message if the log level is error or higher.

    The message is prefixed with error: and passed via console.error().

    Example

    log.error('Not good...')
    

    There is a special case when the input is an Error object. It is expanded, including a full stack trace, and passed via console.error().

    Example

    try {
    // ...
    } catch (err) {
    log.error(err)
    }

    Parameters

    • message: any = ''

      Message to log, as accepted by util.format().

    • Rest ...args: any[]

      Optional variable arguments.

    Returns void

  • Summary

    Log an error message.

    Description

    Log a message if the log level is error or higher.

    It differs from error() by not prefixing the string with error: and using console.log() instead of console.error().

    Example

    log.output('Not good either...')
    

    Example

    try {
    // ...
    } catch (err) {
    // Do not show the stack trace.
    log.output(err)
    }

    Parameters

    • message: any = ''

      Message to log, as accepted by util.format().

    • Rest ...args: any[]

      Optional variable arguments.

    Returns void

  • Summary

    Log a warning message.

    Description

    Log a message if the log level is warn or higher.

    The message is prefixed with warning: and passed via console.error().

    Example

    log.info(title)
    

    Parameters

    • message: any = ''

      Message to log, as accepted by util.format().

    • Rest ...args: any[]

      Optional variable arguments.

    Returns void

  • Summary

    Log an informative message.

    Description

    Log a message if the log level is info or higher.

    The message is passed via console.log().

    Example

    log.info(title)
    

    Parameters

    • message: any = ''

      Message to log, as accepted by util.format().

    • Rest ...args: any[]

      Optional variable arguments.

    Returns void

  • Summary

    Log a verbose message.

    Description

    Log a message if the log level is verbose or higher.

    The message is passed via console.log().

    Example

    log.verbose('Configurations:')
    

    Parameters

    • message: any = ''

      Message to log, as accepted by util.format().

    • Rest ...args: any[]

      Optional variable arguments.

    Returns void

  • Summary

    Log a debug message.

    Description

    Log a message if the log level is 'debug' or higher.

    The message is prefixed with debug: and passed via console.log().

    Example

    log.debug(`spawn: ${cmd}`)
    

    Parameters

    • message: any = ''

      Message to log, as accepted by util.format().

    • Rest ...args: any[]

      Optional variable arguments.

    Returns void

  • Summary

    Log a trace message.

    Description

    Log a message if the log level is trace or higher.

    The message is prefixed with trace: and passed via console.log().

    Example

    log.trace(`${this.constructor.name}.doRun()`)
    

    Parameters

    • message: any = ''

      Message to log, as accepted by util.format().

    • Rest ...args: any[]

      Optional variable arguments.

    Returns void

Properties

_console: Console = console

The console object used to output the log messages.

levelNumericValue: number = Logger.numericLevelUndefined

The numerical value of the log level.

levelName: undefined | LogLevel = undefined

The name of the log level.

buffer: LoggerBufferRecord[] = []

Empty buffer where preliminary log lines are stored until the log level is set.

defaultLevel: LogLevel = 'info'

The recommended default level.

numericLevels: {
    silent: number;
    error: number;
    warn: number;
    info: number;
    verbose: number;
    debug: number;
    trace: number;
    all: number;
} = ...

Internal numerical values for the log level.

Type declaration

  • silent: number
  • error: number
  • warn: number
  • info: number
  • verbose: number
  • debug: number
  • trace: number
  • all: number
numericLevelUndefined: number = Infinity

The value used for the undefined log level (maximum value).

numericLevelAlways: number = -1

The value used for the always case (minimum value).

Generated using TypeDoc