• 4. ledna 2023

Jak monitorovat aplikaci (logování)

Základem vývoje zdravé aplikace je správné nastavení monitoringu. Alfa a omega tohoto procesu je pro nás logování.

Jedna z vestavěných knihoven Pythonu (logging) má za úkol zprostředkovat jednoduché zaznamenávání těchto zpráv (logů), které později můžeme použít jako zdroj dat při analýze aplikace.

import logging

logger = logging.getLogger(__name__)

def drink_coffee(user, coffee_count):
    logger.debug(f'User {user.id} just drank another cup of coffee')
    return coffee_count + 1

Elementární příklad logování vypadá takto. Pomocí kódu můžeme tímto způsobem zaznamenat zprávy o procesu a aktuálním stavu během aktivního užívání aplikace.

Proč vlastně logovat?

  • správně napsaný log umožňuje snadné dohledání chyby a procesů, které k ní vedly
  • dává nám možnost sestavit analýzu užívání aplikace a různých jejích částí

Hlavní části logovacího procesu

  • logger - odhaluje rozhraní, které můžeme poté využít v kódu
  • formatter - určuje formát zprávy a potřebné parametry pro zaznamenání zprávy
  • handler - "posílá" zprávy (logy) do správné destinace - ukládá je do souboru, posílá je do conzole apod.
  • filter - umožňuje větší kontrolu nad výběrem zaznamenaných zpráv, které chceme zobrazit

Každá část je v procesu zaznamenávání a analýzy logů důležitá a je žádoucí se naučit za co jaká část zodpovídá.

Hierarchie loggerů

Loggery v python knihovně "logging" jsou uspořádané do hierarchie podle jména použitého při jejich tvorbě.

import logging
console_output = logging.StreamHandler()
root_logger = logging.getLogger()
# root_logger.addHandler(console_output)
# root_logger.setLevel(logging.DEBUG)
# příklad přidávání handleru na logger (zachycování zpráv loggeru)

x_logger = logging.getLogger('x')

x_y_logger = logging.getLogger('x.y')
x_z_logger = logging.getLogger('x.z')

root_logger.info('zpráva 1')
x_logger.info('zpráva 2')
x_y_logger.info('zpráva 3')
x_z_logger.info('zpráva 4')

Hierarchie loggerů z této ukázky vypadá následovně:

logger_hierarchy

Pokud budeme zachytávat zprávy z root loggeru, dostaneme ve výstupu:

zpráva 1

zpráva 2

zpráva 3

zpráva 4

Výstup z loggeru X bude ale jenom:

zpráva 2

zpráva 3

zpráva 4

Logger X je v hierarchii pod hlavním(root) loggerem a proto nezachytává to, co je zasíláno přímo na hlavní logger.

Z loggeru Y zachytíme jenom zprávu 3 a z loggeru Z zprávu 4, protože jsou na stejné úrovni a mají stejného "rodiče".

Úrovně vážnosti záznamů

Každá zpráva v logu může mít různé úrovně "vážnosti", což nám umožňuje filtrovat záznamy podle toho, co je zrovna potřeba.

Úrovní máme pět (někdy se počítá šest):

  • DEBUG (+ TRACE)
  • INFO
  • WARNING
  • ERROR
  • FATAL

Každá úroveň má svůj smysl a je na developerovi, aby správně určil vážnost záznamu.

logging_state_flowchart

Základní pravidla logování

  1. Vždy používat logovací knihovnu daného jazyka - (pro nás python - logging lib, js - dev console, node.js - Winston), nikdy si nepsát vlastní knihovnu
  2. Logovat na správném levelu - velmi ulehčuje práci s daty
  3. Logovat do více kategorií/loggerů - podle kontextu/části aplikace
  4. Psát užitečné zprávy bez zbytečných informací
  5. Používat angličtinu - zamezuje problémům s encodingem souborů (standardní EN je ASCII only) a problémům s jazykovou bariérou

Proč je logování důležité?

Uchovávat záznamy o chodu aplikace může být výhodné kvůli mnoha věcem, mezi ty hlavní patří:

  • kontrola pohybu dat na aplikaci - někdy je vyžadována zákony daného státu / EU
  • diagnostika výkonu aplikace
  • statistika využívání různých částí

Zajímá Vás víc?

Neváhejte nás kontaktovat.