Virtlab:LoggingDebugging

Z VirtlabWiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
Verze z 19:44, 29. 7. 2007
Gry72 (Diskuse | příspěvky)

← Předchozí porovnání
Verze z 20:01, 29. 7. 2007
Gry72 (Diskuse | příspěvky)

Následující porovnání →
Řádka 6: Řádka 6:
Jednotlivé servery systému budou '''zasílat debug informace na syslog jednotně pomocí k tomu účelu vytvořené univerzální funk'''ce (C), kterou budou formou knihovny '''přilinkovávat''' (PHP bude volat jako externí program nebo bude vytvořen ekvivalent v PHP). Funkce předá zprávu Syslog serveru lokality (démonu Syslog-ng) nebo volitelně do souboru secifikovaného parametrem příkazového řádku. '''Parametry příkazového řádku související s debuggingem budou pro všechny servery sjednoceny''' (přilinkováním k tomu účelu vytvořené parsovací funkce v C). V případě, že budou servery lokality distribuovány na více strojů, bude na každém z nich instalován '''proxy syslog démon''', který bude nastaven tak, aby zprávy pouze přeposílal na hlavní Syslog démon lokality. Jednotlivé servery systému budou '''zasílat debug informace na syslog jednotně pomocí k tomu účelu vytvořené univerzální funk'''ce (C), kterou budou formou knihovny '''přilinkovávat''' (PHP bude volat jako externí program nebo bude vytvořen ekvivalent v PHP). Funkce předá zprávu Syslog serveru lokality (démonu Syslog-ng) nebo volitelně do souboru secifikovaného parametrem příkazového řádku. '''Parametry příkazového řádku související s debuggingem budou pro všechny servery sjednoceny''' (přilinkováním k tomu účelu vytvořené parsovací funkce v C). V případě, že budou servery lokality distribuovány na více strojů, bude na každém z nich instalován '''proxy syslog démon''', který bude nastaven tak, aby zprávy pouze přeposílal na hlavní Syslog démon lokality.
 +
=== Pomocná debug hlášení pro základní ladění (tracing) === === Pomocná debug hlášení pro základní ladění (tracing) ===

Verze z 20:01, 29. 7. 2007

Obsah

Logování a debugging

Pro odladění, sledování provozu a řešení incidentů celého distribuovaného systému virtuální laboratoře je nutný konzistentní systém ukládání informací o běhu na různých úrovních, které bude možné snadno automaticky vyhodnocovat a informovat příslušné správce o kritických nebo nestandardních stavech. Informace o běhu všech komponent (serverů) lokality budou shromažďovány na Syslog serveru dané lokality, kde budou vyhodnocovány vhodnými skripty nebo prostředky syslog démona a podle nastavených pravidel případně přeposílány emailem na správné zodpovědné správce. Logovací soubory syslog serverů všech lokalit budou zpřístupněny správcům všech ostatních lokalit (patrně přes WWW).

Z důvodu snadné implementace návazných rozšiření bude použit Syslog Next Generation (Syslog-ng).

Jednotlivé servery systému budou zasílat debug informace na syslog jednotně pomocí k tomu účelu vytvořené univerzální funkce (C), kterou budou formou knihovny přilinkovávat (PHP bude volat jako externí program nebo bude vytvořen ekvivalent v PHP). Funkce předá zprávu Syslog serveru lokality (démonu Syslog-ng) nebo volitelně do souboru secifikovaného parametrem příkazového řádku. Parametry příkazového řádku související s debuggingem budou pro všechny servery sjednoceny (přilinkováním k tomu účelu vytvořené parsovací funkce v C). V případě, že budou servery lokality distribuovány na více strojů, bude na každém z nich instalován proxy syslog démon, který bude nastaven tak, aby zprávy pouze přeposílal na hlavní Syslog démon lokality.


Pomocná debug hlášení pro základní ladění (tracing)

Do informací zasílaných na Syslog nebudeme míchat debug hlášení pro základní ladění (trasování kódu programu, typicky posílané pomocí printf na stdout během ladění). Aby program neobsahoval množství těchto zapomenutých ladících printf(), zavedeme konvenci, že veškerá takováto hlášení budou vypisovány výhradně funkcí DBGPRINTF. Tu dokážeme snadno ve zdrojových kódech na základě názvu jednak snadno najít a případě odstranit, ale hlavně povolit či zakázat její efekt tím, že ji (pomoci #define ve vl-debug.h) budeme definovat jako funkci printf nebo nullprintf s prázdným tělem podle toho, zda je před připojením souboru vl-debug.h definován symbol DEBUG (při ladění musí být, #define VDEBUG).

Unifikované nastavení chování logování

Úroveň debuggingu všechny serverů (mimo WWW aplikace - tam jak ?) lze určit pomocí jednotného systému parametrů předávaných z příkazové řádky. Parametry jsou koncipovány tak, aby mohly být zpracovány společnou inicializační funkcí přilinkovávanou ke každému serveru a následně odstraněny, aby neposouvaly pořadí a neovlivńovaly počet základních parametrů očekávaných programem. Jména jednotných parametrů nastavujících úroveň debuggingu začínají vždy řetězcem -DBGLOG a mají tvar -DBGLOGxxx, resp. -DBGLOGxxx=hodnota. Na jejich pořadí včetně případném promísení s "normálními" parametry programu nezáleži. Načtení a odstranění debug parametrů se provede pomocí inicializační funkce initLogging(facilityID,*argc,*argv[]) (vl-debug.c), která volá vždy jako první příkaz v main(), tj. ještě před pokusem o parsování parametrů příkazové řádky vlastního programu.


XXX FacilityID se vezme ze souboru vl-debug.h a nastavi se pro cely beh programu, takze se bude pouzivat jako default ve volanich syslog(), kde uz staci uvadet jen prioritu.

Momentálně jsou definovány tyto parametry:

  • -DBGLOG-LEVEL=x
  • -DBGLOG-FILE=x - jméno souboru, kam se má logovat (pokud ne na syslog)


Ošetření neočekávaných chyb

Přiznejme si, že není možné ošetřit úplně všechno. Nicméně bychom měli aspoň vědět o tom, že vyvstal problém tam, kde jsme jej nečekali, Pokud tedy nějaká systémová funkce vrací chybový kód, který nechceme dále rozlišovat, protože jeho vrácení prostě nepředpokládáme, budeme volat před použitím jakéhokoli dalšího systémového volání (aby se nepřepsala hodnota proměnné errno) funkci LOG_UNEXPECTED_SYS_ERROR() (viz vl-debug.c), která zaloguje kód a vysvětlující text chyby spolu se jménem zdrojového kódu a číslem řádku, na kterém je volání LOG_UNEXPECTED_SYS_ERROR() umístěno. Obdobným způsobem ošetřujeme uživatelské funkce, které nenastavují errno, pouze s tím rozdílem, že použijeme funkci LOG_UNEXPECTED_USR_ERROR(errcode), jejímž parametrem je právě neočekávaný chybovž kód uživatelské funkce (tedy typický zápis bude LOG_UNEXPECTED_USR_ERROR(UserFunc(...)); ). Pokud je errcode, resp. předaný parametr 0, obě funkce nedělají nic.


Formát logovacích zpráv

Formát logovacích zpráv je částečně předurčen formátem používaných Syslogem. Timestamp a IP adresu zdroje zprávy dodá syslog, PID dodá funkce syslog().


Úrovně logování

Úrovně logování (priority zpráv) částečně předurčeny formátem používaných Syslogem.

  • LOG_EMERG (system is unusable)
  • LOG_ALERT (action must be taken immediately)
  • LOG_CRIT (critical conditions)
  • LOG_ERR (error conditions) - ignorované chyby neočekávaně vrácené ze systémových volání (neošetřené) - Text zprávy pak obsahuje jméno a řádek zdrojového kódu, kde chyba vznikla, a popisné hlášení chyby generované funkcí perror() na základě globální proměnné errno. Lze použít makro LOG_UNEXPECTED_ERROR; Pozor, nevolat mezitím jiné systémové volání, to by změnilo obsah errno.
  • LOG_WARNING (warning conditions)
  • LOG_NOTICE (normal, but significant, condition)
  • LOG_INFO (informational message)
  • LOG_DEBUG (debug-level message)

Z priorit Syslogu využíváme následující úrovně:


Používané facilities a synonyma použivaná pro jednotlivé facilities jsou v souboru vl-debug.h

  • FAC_WWWAPP (LOG_LOCAL0+1) - webová aplikace řídícího serveru lokality (GUI, mapovací algoritmus)
  • FAC_RSVSRV (LOG_LOCAL0+2) - rezervační server
  • FAC_CONSRV (LOG_LOCAL0+3) - konzolový server
  • FAC_CONFSRV (LOG_LOCAL0+4) - konfigurační server
  • FAC_CONFACT (LOG_LOCAL0+5) - aktivátor konfigurací a konfigurační skripty vč. VLANStore
  • FAC_TUNSRV (LOG_LOCAL0+6) - tunelovací server
  • FAC_ERASESRV (LOG_LOCAL0+7) - mazací server
  • Zbývá 8 dalších hodnot (celkem je 5b pro facility, LOG_LOCAL0 je 16)







Sjednocený formát textů logovaných zpráv

Knihovní funkce pro logování

man logger man 3 syslog: void openlog(const char *ident, int option, int facility); openlog("msg-prepend-string",LOG_NDELAY|LOG_CONS|LOG_PID, int facility (LOG_USER)); void syslog(FACILITY | PRIORITY , const char *format, ...); man 3 setlogmask: int setlogmask(int mask); - bitovým součtem se určí úrovně, které se mají funkcí syslog() skutečně logovat

A  process  has a log priority mask that determines which calls to sys-
      log(3) may be logged. All other calls  will  be  ignored.   Logging  is
      enabled for the priorities that have the corresponding bit set in mask.
      The initial mask is such that logging is enabled for all priorities.



Abychom dosáhli jednotné a pro programátory bezpracné nastavení úrovně logování u každého programu,

U PHP kódu předpokládáme nastavení úrovně debugování ve vhodném .php souboru, který se pomocí include připojuje ke všem .php souborům (soubor s konstantami, soubor s autentizací ?)


Skripty/konfigurace syslog-ng pro přeposílání kritických zpráv administrátorům příslušných lokalit

Konfigurace lokálních proxy syslog-ng pro přeposílání zpráv na hlavní syslog server lokality

Osobní nástroje