SIGAR API – získání systémových informací

Datum: 30.07.2010 | Kategorie: Java / J2EE | Autor: Radek Teichmann | 2 komentářů »
Štítek:

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í.

  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • MySpace
  • PDF
  • RSS
  • Twitter

Komentáře

  1. Jméno: Tibor | Datum: 30.7.2010 v 21:40

    Ako riesite licenciu kniznice, kedze je GPL? Je mozne ju nasadit v komercnom projekte?

    • Jméno: Radek Teichmann | Datum: 1.8.2010 v 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.