First steps#

To install this library, simply type this command (Windows variant):

$ pip install pyrolog

On linux systems, you must use pip3 instead of. Command:

$ pip3 install pyrolog

Formatters#

Formatters allow us to pretty format our logs. Library has these formatters by default: PlainFormatter - only plain text, ColoredFormatter - colored logs.

Formatters has some options as:

* format string - String responsible for formatting.
* time format string - String responsible for formatting time.
* static variables - Static variables, that can be used by {...} syntax.
* logging context - Current logging context.
* offsets - enable\disable offsets.

About the format strings, by default there has many variants, see :module:`pyrolog.defaults`.

To use handlers, you must firsly create formatter instance!

Handlers#

To create a handler for the stdout (console output) you can use pyrolog.handlers.StdoutHandler.

import pyrolog

# NOTE: Exception is a log level little than info.
#       It recommended to use it for exception logging.
stdout_handler = pyrolog.StdoutHandler(
    log_level='exception',
    formatter=pyrolog.ColoredFormatter(pyrolog.defaults.COLORED_TIMED_MINIMAL_FORMAT_STRING),
)

Note

You can also use pyrolog.utils.LogLevel to set the log_level parameter.

There also have support for file handler. This class named as pyrolog.handlers.FileHandler.

import pyrolog

file_handler = pyrolog.FileHandler(
    'logs/{timestamp}.log', # filename
    timestamp=True, # enables {timestamp} feature
    log_level='debug', # log level
    formatter=pyrolog.PlainFormatter(pyrolog.defaults.TIMED_MINIMAL_FORMAT_STRING),
)

Lets combine them into one code:

import pyrolog

stdout_handler  = pyrolog.StdoutHandler(
    log_level='exception',
    formatter=pyrolog.ColoredFormatter(pyrolog.defaults.COLORED_TIMED_MINIMAL_FORMAT_STRING),
)
file_handler    = pyrolog.FileHandler(
    'logs/{timestamp}.log', # filename
    timestamp=True, # enables {timestamp} feature
    log_level='debug', # log level
    formatter=pyrolog.PlainFormatter(pyrolog.defaults.TIMED_MINIMAL_FORMAT_STRING),
)

Our first handlers are done.

Logger group#

Lets create our first logger group. Group contains all parameters for child loggers. This is useful in case of multiple loggers usage. To create it, you can use pyrolog.loggergroup.Group.

You can create loggers without groups.

Create MyApp group:

import pyrolog

myapp_group = pyrolog.Group('MyApp')

See also

You can see it reference: pyrolog.loggergroup.Group

Lets add our loggers by examples above to this group.

Note

Handlers can be pinned to groups by handlers parameter. This parameter is named and takes Handler | list[Handler] type. Example is bottom.

import pyrolog

# Our first handlers for stdout and file
stdout_handler  = pyrolog.StdoutHandler(
    log_level='exception',
    formatter=pyrolog.ColoredFormatter(pyrolog.defaults.COLORED_TIMED_MINIMAL_FORMAT_STRING),
)
file_handler    = pyrolog.FileHandler(
    'logs/{timestamp}.log', # filename
    timestamp=True, # enables {timestamp} feature
    log_level='debug', # log level
    formatter=pyrolog.PlainFormatter(pyrolog.defaults.TIMED_MINIMAL_FORMAT_STRING),
)

# Our first group by name MyApp
myapp_group = pyrolog.Group('MyApp', handlers=[stdout_handler, file_handler])

Our first group done!

Logging#

Loggers can be created by pyrolog.logger.Logger class. It, how as a logger groups, takes a handlers parameter. But, as I said, if you use logger group, it stores all parameters for child loggers and set it automatically. All that required from Loggers is a group parameter. To get more info see Loggers reference (just click on pyrolog.logger.Logger).

import pyrolog

# Our first handlers for stdout and file
stdout_handler  = pyrolog.StdoutHandler(
    log_level='exception',
    formatter=pyrolog.ColoredFormatter(pyrolog.defaults.COLORED_TIMED_MINIMAL_FORMAT_STRING),
)
file_handler    = pyrolog.FileHandler(
    'logs/{timestamp}.log', # filename
    timestamp=True, # enables {timestamp} feature
    log_level='debug', # log level
    formatter=pyrolog.PlainFormatter(pyrolog.defaults.TIMED_MINIMAL_FORMAT_STRING),
)

# Our first group by name MyApp
myapp_group = pyrolog.Group('MyApp', handlers=[stdout_handler, file_handler])

# Create a Main logger that includes MyApp group
logger = pyrolog.Logger('Main', group=myapp_group)

Our logger is done! Now, we can log messages to it. By default, logger hasn’t debug, exception, info and other methods. It adds via pyrolog.logger.Logger.bind_log_methods(). This methods calls by default, and uses this list of the log levels -> pyrolog.defaults.DEFAULT_LOG_LEVELS :module:`pyrolog.defaults`.

List of all the default log levels:

number1 = 15
logger.debug('Defined number 1: {}', number1)

number2 = 2
logger.debug('Defined number 2: {}', number2)

result = number1 + number2
logger.info('Adding number 1 to number2. Result: {}', result)

Note

To log methods you can pass format variables as long as you need.

You can also use all features of the python string formatting.

Warning

All

import math

logger.info('{:<20}--{:>19}', 'pi is', f'{math.pi:.2f}')

Code above will produce info log with message: pi is  --  3.14.

Log exceptions#

All methods of logging are defines named parameter exception=. It takes any exception and log it after the message.

try:
    printt('Hello, world!')
except Exception as e:
    # You can use any function to log exception. But, recommended to use
    # only exception level for exceptions.

    logger_main.debug('An exception occurred: {}', e, exc=e)
    logger_main.exception('An exception occurred: {}', e, exc=e)
    logger_main.info('An exception occurred: {}', e, exc=e)
    logger_main.warning('An exception occurred: {}', e, exc=e)
    logger_main.error('An exception occurred: {}', e, exc=e)
    logger_main.critical(f'An exception occurred: {e}', exc=e)