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)