Skip to content

Description

from shouterlog import Shouter
# optional
import logging

1. Initialize Shouter Class

shouter = Shouter(
    # optional/ required
    supported_classes = (),
    # optionally 
    ## Formatting settings
    dotline_length = 50,
    auto_output_type_selection = True,
    show_function = True,
    show_traceback = False,
    # For saving records
    tears_persist_path = 'log_records.json',
    datetime_format = "%Y-%m-%d %H:%M:%S",
    # For saving env
    persist_env = False,
    env_persist_path = 'environment.dill',
    ## Logger settings
    logger = None,
    logger_name = 'Shouter',
    loggerLvl = logging.DEBUG,
    logger_format = '(%(asctime)s) : %(name)s : [%(levelname)s] : %(message)s'
)

2. Basic usage like logging

shouter.debug(
    # optional
    dotline_length=30)
shouter.debug("This is a debug message!")
shouter.info("This is an info message!")
shouter.warning("This is a warning message!")
shouter.error("This is an error message!")
shouter.fatal("This is a fatal message!")
shouter.critical("This is a critical message!")
(2026-01-05 23:34:12,197) : Shouter : [DEBUG] : _format_mess:==============================
(2026-01-05 23:34:12,199) : Shouter : [DEBUG] : _format_mess:This is a debug message!
(2026-01-05 23:34:12,201) : Shouter : [INFO] : _format_mess:This is an info message!
(2026-01-05 23:34:12,203) : Shouter : [WARNING] : _format_mess:This is a warning message!
(2026-01-05 23:34:12,204) : Shouter : [ERROR] : _format_mess:This is an error message!
(2026-01-05 23:34:12,206) : Shouter : [CRITICAL] : _format_mess:This is a fatal message!
(2026-01-05 23:34:12,208) : Shouter : [CRITICAL] : _format_mess:This is a critical message!

3. Using different output types

# Different types of outputs
shouter.info(output_type="dline")
shouter.info(output_type="HEAD1", mess="Header Message")
(2026-01-05 23:34:12,214) : Shouter : [INFO] : _format_mess:==================================================
(2026-01-05 23:34:12,216) : Shouter : [INFO] : _format_mess:
==================================================
-----------------Header Message----------------- 
==================================================

4. Custom logger configuration

import logging

# Custom logger
custom_logger = logging.getLogger("CustomLogger")
custom_logger.setLevel(logging.INFO)

# Shouter with custom logger
shouter_with_custom_logger = Shouter(supported_classes=(), logger=custom_logger)
shouter_with_custom_logger.info(mess="Message with custom logger")

5. Backwards compatibility with existing loggers

import logging
import attrsx

@attrsx.define
class ExampleClass:


    def print_debug(self):

        a = 0

        self.logger.debug("This is a debug message!", save_vars = ["a"])

    def print_info(self):

        self.logger.info("This is a info message!")

    def print_warning(self):

        self.logger.warning("This is a warning message!")

    def print_error(self):

        self.logger.error("This is a error message!", label = "TEST")

    def print_critical(self):

        self.logger.critical("This is a critical message!")

    def perform_action_chain_1(self):

        self.logger.debug("Action 1")
        self.print_debug()

        self.logger.debug("Action 2")
        self.print_error()

    def perform_action_chain_2(self):

        a = 1
        b = 'b'
        c = ['list']
        d = {'key' : 'value'}
        e = Shouter()

        self.logger.info("Logging vars", save_vars = ["a","b","e"])
        self.logger.error("Saving env", label = "TEST")
ec = ExampleClass()

ec.print_debug()
ec.print_info()
ec.print_warning()
ec.print_error()
ec.print_critical()
INFO:ExampleClass:This is a info message!
WARNING:ExampleClass:This is a warning message!
ERROR:ExampleClass:This is a error message!
CRITICAL:ExampleClass:This is a critical message!
shouter_for_example_class = Shouter(
    supported_classes = (ExampleClass,),
    tears_persist_path = 'log_records.json'
)

ec = ExampleClass(logger=shouter_for_example_class)

ec.print_debug()
ec.print_info()
ec.print_warning()
ec.print_error()
ec.print_critical()
ec.perform_action_chain_1()
INFO:Shouter:ExampleClass.print_info:This is a info message!
WARNING:Shouter:ExampleClass.print_warning:This is a warning message!
ERROR:Shouter:ExampleClass.print_error:This is a error message!
CRITICAL:Shouter:ExampleClass.print_critical:This is a critical message!
ERROR:Shouter:ExampleClass.print_error:+ This is a error message!

6. Built-in records from Shouter usage

shouter_for_example_class = Shouter(
    supported_classes = (ExampleClass,),
    tears_persist_path = 'log_records.json'
)

ec = ExampleClass(logger=shouter_for_example_class)

ec.print_debug()
ec.perform_action_chain_1()
ERROR:Shouter:ExampleClass.print_error:+ This is a error message!
import pandas as pd

pd.DataFrame(ec.logger.return_logged_tears())
idx call_id datetime level function mess line lines is_proc proc_name traceback label env
0 1 124165912314352 2026-01-05 23:34:12 debug ExampleClass.print_debug This is a debug message! 12 [12] False Task-2 [ExampleClass.print_debug] None {'a': 0}
1 2 124165917350880 2026-01-05 23:34:12 debug ExampleClass.perform_action_chain_1 Action 1 32 [32] False Task-2 [ExampleClass.perform_action_chain_1] None {}
2 3 109462141702832 2026-01-05 23:34:12 debug ExampleClass.print_debug This is a debug message! 12 [12, 33] False Task-2 [ExampleClass.print_debug, ExampleClass.perfor... None {'a': 0}
3 4 124165917350880 2026-01-05 23:34:12 debug ExampleClass.perform_action_chain_1 Action 2 35 [35] False Task-2 [ExampleClass.perform_action_chain_1] None {}
4 5 109462142051424 2026-01-05 23:34:12 error ExampleClass.print_error This is a error message! 24 [24, 36] False Task-2 [ExampleClass.print_error, ExampleClass.perfor... TEST {}

7. Debugging errors with Shouter

shouter_for_example_class = Shouter(
    supported_classes = (ExampleClass,),
    tears_persist_path = 'log_records.json',
    persist_env = True,
    env_persist_path = 'environment.dill'
)

ec = ExampleClass(logger=shouter_for_example_class)

ec.print_debug()
ec.perform_action_chain_2()
INFO:Shouter:ExampleClass.perform_action_chain_2:Logging vars
ERROR:Shouter:ExampleClass.perform_action_chain_2:Saving env
ec.logger.return_last_words(
    # optional
    env_persist_path = 'environment.dill'
)
{'a': 1,
 'b': 'b',
 'c': ['list'],
 'd': {'key': 'value'},
 'e': Shouter(supported_classes=(), dotline_length=50, auto_output_type_selection=True, show_function=True, show_traceback=False, show_idx=False, tears_persist_path='log_records.json', env_persist_path='environment.dill', datetime_format='%Y-%m-%d %H:%M:%S', log_records=[], persist_env=False, lock=<unlocked _thread.lock object at 0x70ed6cd6f940>, last_traceback=[], log_plotter_h=None, log_plotter_class=<class 'shouterlog.shouterlog.LogPlotter'>, log_plotter_params={}, loggerLvl=20, logger_name=None, logger_format='%(levelname)s:%(name)s:%(message)s')}

8. Plotting execution flow and reviewing steps

import attrsx

@attrsx.define(handler_specs={
    "example1" : ExampleClass
},
    logger_chaining={
    'logger' : True
})
class MainExampleClass:

    def __attrs_post_init__(self):

        self._initialize_example1_h()

    def print_example_print(self):

        self.logger.debug("Printing from example!", label = "START")

        for i in range(5):

            self.example1_h.print_debug()

        self.logger.debug("Printing from example!", label = "END")

shouter_for_main_example_class = Shouter(
    supported_classes = (MainExampleClass, ExampleClass,),
    tears_persist_path = 'log_records2.json',
    loggerLvl=logging.DEBUG
)

mec = MainExampleClass(logger=shouter_for_main_example_class)

mec.print_example_print()
DEBUG:Shouter:MainExampleClass.print_example_print:Printing from example!
DEBUG:Shouter:ExampleClass.print_debug:+ This is a debug message!
DEBUG:Shouter:ExampleClass.print_debug:+ This is a debug message!
DEBUG:Shouter:ExampleClass.print_debug:+ This is a debug message!
DEBUG:Shouter:ExampleClass.print_debug:+ This is a debug message!
DEBUG:Shouter:ExampleClass.print_debug:+ This is a debug message!
DEBUG:Shouter:MainExampleClass.print_example_print:Printing from example!
mec.logger.show_sequence_diagram()

png

mec.logger.show_logs_by_id(ids = [1,2])
[{'idx': 1,
  'call_id': 124165157051456,
  'datetime': '2026-01-05 23:34:12',
  'level': 'debug',
  'function': 'MainExampleClass.print_example_print',
  'mess': 'Printing from example!',
  'line': 17,
  'lines': [17],
  'is_proc': False,
  'proc_name': 'Task-2',
  'traceback': ['MainExampleClass.print_example_print'],
  'label': 'START',
  'env': {}},
 {'idx': 2,
  'call_id': 109462141702832,
  'datetime': '2026-01-05 23:34:12',
  'level': 'debug',
  'function': 'ExampleClass.print_debug',
  'mess': 'This is a debug message!',
  'line': 12,
  'lines': [12, 21],
  'is_proc': False,
  'proc_name': 'Task-2',
  'traceback': ['ExampleClass.print_debug',
   'MainExampleClass.print_example_print'],
  'label': None,
  'env': {'a': 0}}]