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í.
30.7.2010 at 21:40
Ako riesite licenciu kniznice, kedze je GPL? Je mozne ju nasadit v komercnom projekte?
1.8.2010 at 12:15
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.