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í.
Ako riesite licenciu kniznice, kedze je GPL? Je mozne ju nasadit v komercnom projekte?
Na adresu licence GPL toho bylo už napsáno opravdu hodně, takže bych zde nerad rozpoutával nějakou velkou diskuzi. V aplikacích, které využívají knihovnu se proto řídíme následujícím pravidlem : http://www.gnu.org/licenses/gpl-faq.html#GPLCommercially
EDIT : Od verze 1.6.4 je SIGAR pod licencí Apache 2.0, takže s GPL již nadále nejsou problémy.