Tento článek navazuje na sérii článků o méně známých, avšak zajímavých nástrojích a technologiích. Dnes se zaměříme na knihovnu SIGAR (Hyperic’s System Information Gatherer), která nám umožňuje získávat zajímavé informace ze systému nehledě na to, na kterém systému naše aplikace pracuje. O této knihovně již byla na našem blogu řeč – nyní se podíváme na její další využití.

Letmé zopakování

Jak již bylo řečeno, SIGAR je určeno k získávání systémových informaci z operačního systému. Toto API podporuje většinu operačních systémů (Linux, FreeBSD, Windows, Solaris, AIX, HP-UX and Mac OSX) a umožňuje získávat informace o paměti, CPU, souborovém systému, procesech atd. (viz předchozí článek na našem blogu). Každý operační systém podporuje určitý typ informací, takže přeci jenom jsou zde menší problémy s přenosem mezi platformami.

Hlavní součásti tohoto API jsou samozřejmě binární knihovny (psané v C, či Perlu) a liší se opět na základě cílového systému (*.so, *.dll). Ke své aplikaci musíte tedy mimo samotného JAR souboru API přibalit i tyto nativní knihovny.

Knihovnu SIGAR si můžete stáhnout zdarma z této stránky pod licencí GPL.

Čtení logů z Windows

V aplikaci pro jednoho z našich klientů jsme potřebovali pravidelně číst a zpracovávat logy, které Windows zaznamenává a které jsou dostupné v Ovládacích panelech jako Systémové logy. Jednotlivé logy mohou být rozděleny do skupin a knihovna SIGAR je dokáže poměrně snadno a efektivně číst.

Jelikož jeden příklad vydá za tisíc slov, předvedu následující příklad, který ukazuje čtení aplikačního windows logu:


EventLog windowsLog = new EventLog();
windowsLog.open("Application");
windowsLog.waitForChange(5000);

int currentPosition = windowsLog.getNewestRecord();
for (int i = 1; i < = currentPosition; i++) {
  try {
    EventLogRecord record = windowsLog.read(i);
    logger.info(record.get));
    logger.info(record.getComputerName());
    logger.info(record.getEventId());
    logger.info(record.getEventType());
    logger.info(record.getEventTypeString());
    logger.info(record.getLogName());
    logger.info(record.getMessage());
    logger.info(record.getRecordNumber());
    logger.info(record.getSource());
    logger.info(record.getTimeGenerated());
    logger.info(record.getTimeWritten());
    logger.info(record.getUser());
  } catch (Win32Exception e) {
    logger.error("Windows event log record reading problem" + i);
  }
}

Ukázka je pouze ilustrační – samotné čtení lze udělat lépe (knihovna SIGAR má možnosti použití listeneru pro zpracování logů). Co ale ukazuje zcela jasně je jednoduchost, s jakou lze logy číst a také počet informací, které lze zjistit. Jedinou zajímavostí je pak tedy metoda waitForChange, která nám umožňuje nastavit dobu, po kterou toto vlákno bude čekat na změny v logu windows. Toto je užitečné pokud potřebujete číst malé sekvence logů – zadáte malý čas a budete číst pouze po malých přírůstcích.

Jako perličku na závěr jsem si nechal tip pro správné zobrazení eventId. Knihovna SIGAR vám bude vracet nesmyslně velké číslo, které nebude korespondovat s číslem v prohlížeči systémových logů přímo ve Windows. Jak tedy původní číslo dostat? Velice jednoduše, stačí použít následující kód:


Integer eventId = (int) (record.getEventId() & 0xFFFF);

A pokud byste měli problémy s umístěním DLL knihovny ve vašem projektu můžete nastavit cestu, kde ji bude Java hledat. K tomu slouží jednoduchá proměnná, kterou nastavíte během spouštění vaší aplikace:


-Djava.library.path=./lib

Závěrem dodám, že knihovnu SIGAR s uspokojením používáme na projektech našich klientů a jsme s ní velmi spokojeni, takže ji určitě doporučujeme – pohodlí s jakým umožňuje přístup k systémových informacím vám jiný nástroj v Javě jen tak nenabídne. Podělte se s námi v diskuzi o vaše zkušenosti s touto knihovnou a poskytněte případně další tipy pro její použití.