Monitoring aplikací
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ě:
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.
Základní pravidla logování
- 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
- Logovat na správném levelu - velmi ulehčuje práci s daty
- Logovat do více kategorií/loggerů - podle kontextu/části aplikace
- Psát užitečné zprávy bez zbytečných informací
- 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í