springboot 動(dòng)態(tài)加載sigar

說明

有些系統(tǒng)服務(wù)需要獲取系統(tǒng)的性能參數(shù),比如內(nèi)存谣蠢,CPU,網(wǎng)卡、存儲(chǔ)等信息查近,sigar是一個(gè)不錯(cuò)的選擇眉踱,不過麻煩的是使用該jar文件需要加載庫文件,但是遍查全網(wǎng)嗦嗡,沒有一篇可以動(dòng)態(tài)按照操作系統(tǒng)加載類庫文件的方式勋锤。因此自己實(shí)現(xiàn)了一個(gè):

準(zhǔn)備工作

Sigar.jar下載地址:http://sigar.hyperic.com

備用下載地址:點(diǎn)擊下載

下載 hyperic-sigar-1.6.4.zip 文件,下載地址:
解壓 \hyperic-sigar-1.6.4\sigar-bin\lib 放入 src/main/resources/sigar.so下


image.png

引入maven依賴:

        <dependency>
            <groupId>org.fusesource</groupId>
            <artifactId>sigar</artifactId>
            <version>1.6.4</version>
        </dependency>

采用bean的方式動(dòng)態(tài)加載,適配各種操作系統(tǒng)侥祭。

@Slf4j
@Configuration
public class SigarConfig {

    //靜態(tài)代碼塊
    static {
        try {
            initSigar();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //初始化sigar的配置文件
    public static void initSigar() throws IOException {
        SigarLoader loader = new SigarLoader(Sigar.class);
        String lib = null;

        try {
            lib = loader.getLibraryName();
            log.info("init sigar so文件====================="+lib);
        } catch (ArchNotSupportedException var7) {
            log.error("initSigar() error:{}",var7.getMessage());
        }
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        Resource resource = resourceLoader.getResource("classpath:/sigar.so/" + lib);
        if (resource.exists()) {
            InputStream is = resource.getInputStream();
            File tempDir = new File("/var/log");
            if (!tempDir.exists()){
                tempDir.mkdirs();
            }
            BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(new File(tempDir, lib), false));
            int lentgh = 0;
            while ((lentgh = is.read()) != -1){
                os.write(lentgh);
            }

            is.close();
            os.close();
            System.setProperty("org.hyperic.sigar.path", tempDir.getCanonicalPath());
            // log.info("======================org.hyperic.sigar.path:"+System.getProperty("org.hyperic.sigar.path"));
        }

    }
}

sigar 使用例子

public static void main(String[] args) {
        try {
            log.info("-----------------開始-----------------");
            log.info("-----------------cpu信息-----------------");
            // cpu信息
            cpu();
            log.info("-----------------內(nèi)存信息-----------------");

            // 內(nèi)存信息
            memory();
            log.info("-----------------操作系統(tǒng)信息-----------------");

            // 操作系統(tǒng)信息
            os();
            log.info("-----------------用戶信息-----------------");

            // 用戶信息
            who();
            log.info("-----------------文件系統(tǒng)信息-----------------");

            // 文件系統(tǒng)信息
            file();
            log.info("-----------------網(wǎng)絡(luò)信息-----------------");

            // 網(wǎng)絡(luò)信息
            net();
            log.info("-----------------以太網(wǎng)信息-----------------");
            // 以太網(wǎng)信息
            ethernet();
            log.info("-----------------結(jié)束-----------------");

        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }


private static void memory() throws SigarException {
        Sigar sigar = new Sigar();
        Mem mem = sigar.getMem();
        // 內(nèi)存總量
        log.info("內(nèi)存總量:    " + mem.getTotal() / 1024L + "K av");
        // 當(dāng)前內(nèi)存使用量
        log.info("當(dāng)前內(nèi)存使用量:    " + mem.getUsed() / 1024L + "K used");
        // 當(dāng)前內(nèi)存剩余量
        log.info("當(dāng)前內(nèi)存剩余量:    " + mem.getFree() / 1024L + "K free");
        Swap swap = sigar.getSwap();
        // 交換區(qū)總量
        log.info("交換區(qū)總量:    " + swap.getTotal() / 1024L + "K av");
        // 當(dāng)前交換區(qū)使用量
        log.info("當(dāng)前交換區(qū)使用量:    " + swap.getUsed() / 1024L + "K used");
        // 當(dāng)前交換區(qū)剩余量
        log.info("當(dāng)前交換區(qū)剩余量:    " + swap.getFree() / 1024L + "K free");
    }

    private static void cpu() throws SigarException {
        Sigar sigar = new Sigar();
        CpuInfo infos[] = sigar.getCpuInfoList();
        CpuPerc cpuList[] = null;
        cpuList = sigar.getCpuPercList();
        for (int i = 0; i < infos.length; i++) {// 不管是單塊CPU還是多CPU都適用
            CpuInfo info = infos[i];
            log.info("第" + (i + 1) + "塊CPU信息");
            log.info("CPU的總量MHz:    " + info.getMhz());// CPU的總量MHz
            log.info("CPU生產(chǎn)商:    " + info.getVendor());// 獲得CPU的賣主叁执,如:Intel
            log.info("CPU類別:    " + info.getModel());// 獲得CPU的類別,如:Celeron
            log.info("CPU緩存數(shù)量:    " + info.getCacheSize());// 緩沖存儲(chǔ)器數(shù)量
            printCpuPerc(cpuList[i]);
        }
    }

    private static void printCpuPerc(CpuPerc cpu) {
        log.info("CPU用戶使用率:    " + CpuPerc.format(cpu.getUser()));// 用戶使用率
        log.info("CPU系統(tǒng)使用率:    " + CpuPerc.format(cpu.getSys()));// 系統(tǒng)使用率
        log.info("CPU當(dāng)前等待率:    " + CpuPerc.format(cpu.getWait()));// 當(dāng)前等待率
        log.info("CPU當(dāng)前錯(cuò)誤率:    " + CpuPerc.format(cpu.getNice()));//
        log.info("CPU當(dāng)前空閑率:    " + CpuPerc.format(cpu.getIdle()));// 當(dāng)前空閑率
        log.info("CPU總的使用率:    " + CpuPerc.format(cpu.getCombined()));// 總的使用率
    }

    private static void os() {
        OperatingSystem OS = OperatingSystem.getInstance();
        // 操作系統(tǒng)內(nèi)核類型如: 386矮冬、486谈宛、586等x86
        log.info("操作系統(tǒng):    " + OS.getArch());
        log.info("操作系統(tǒng)CpuEndian():    " + OS.getCpuEndian());//
        log.info("操作系統(tǒng)DataModel():    " + OS.getDataModel());//
        // 系統(tǒng)描述
        log.info("操作系統(tǒng)的描述:    " + OS.getDescription());
        // 操作系統(tǒng)類型
        // log.info("OS.getName(): " + OS.getName());
        // log.info("OS.getPatchLevel(): " + OS.getPatchLevel());//
        // 操作系統(tǒng)的賣主
        log.info("操作系統(tǒng)的賣主:    " + OS.getVendor());
        // 賣主名稱
        log.info("操作系統(tǒng)的賣主名:    " + OS.getVendorCodeName());
        // 操作系統(tǒng)名稱
        log.info("操作系統(tǒng)名稱:    " + OS.getVendorName());
        // 操作系統(tǒng)賣主類型
        log.info("操作系統(tǒng)賣主類型:    " + OS.getVendorVersion());
        // 操作系統(tǒng)的版本號(hào)
        log.info("操作系統(tǒng)的版本號(hào):    " + OS.getVersion());
    }

    private static void who() throws SigarException {
        Sigar sigar = new Sigar();
        Who who[] = sigar.getWhoList();
        if (who != null && who.length > 0) {
            for (int i = 0; i < who.length; i++) {
                // log.info("當(dāng)前系統(tǒng)進(jìn)程表中的用戶名" + String.valueOf(i));
                Who _who = who[i];
                log.info("用戶控制臺(tái):    " + _who.getDevice());
                log.info("用戶host:    " + _who.getHost());
                // log.info("getTime(): " + _who.getTime());
                // 當(dāng)前系統(tǒng)進(jìn)程表中的用戶名
                log.info("當(dāng)前系統(tǒng)進(jìn)程表中的用戶名:    " + _who.getUser());
            }
        }
    }

    private static void file() throws Exception {
        Sigar sigar = new Sigar();
        FileSystem fslist[] = sigar.getFileSystemList();
        for (int i = 0; i < fslist.length; i++) {
            log.info("分區(qū)的盤符名稱" + i);
            FileSystem fs = fslist[i];
            // 分區(qū)的盤符名稱
            log.info("盤符名稱:    " + fs.getDevName());
            // 分區(qū)的盤符名稱
            log.info("盤符路徑:    " + fs.getDirName());
            log.info("盤符標(biāo)志:    " + fs.getFlags());//
            // 文件系統(tǒng)類型,比如 FAT32胎署、NTFS
            log.info("盤符類型:    " + fs.getSysTypeName());
            // 文件系統(tǒng)類型名吆录,比如本地硬盤、光驅(qū)琼牧、網(wǎng)絡(luò)文件系統(tǒng)等
            log.info("盤符類型名:    " + fs.getTypeName());
            // 文件系統(tǒng)類型
            log.info("盤符文件系統(tǒng)類型:    " + fs.getType());
            FileSystemUsage usage = null;
            usage = sigar.getFileSystemUsage(fs.getDirName());
            switch (fs.getType()) {
            case 0: // TYPE_UNKNOWN :未知
                break;
            case 1: // TYPE_NONE
                break;
            case 2: // TYPE_LOCAL_DISK : 本地硬盤
                // 文件系統(tǒng)總大小
                log.info(fs.getDevName() + "總大小:    " + usage.getTotal() + "KB");
                // 文件系統(tǒng)剩余大小
                log.info(fs.getDevName() + "剩余大小:    " + usage.getFree() + "KB");
                // 文件系統(tǒng)可用大小
                log.info(fs.getDevName() + "可用大小:    " + usage.getAvail() + "KB");
                // 文件系統(tǒng)已經(jīng)使用量
                log.info(fs.getDevName() + "已經(jīng)使用量:    " + usage.getUsed() + "KB");
                double usePercent = usage.getUsePercent() * 100D;
                // 文件系統(tǒng)資源的利用率
                log.info(fs.getDevName() + "資源的利用率:    " + usePercent + "%");
                break;
            case 3:// TYPE_NETWORK :網(wǎng)絡(luò)
                break;
            case 4:// TYPE_RAM_DISK :閃存
                break;
            case 5:// TYPE_CDROM :光驅(qū)
                break;
            case 6:// TYPE_SWAP :頁面交換
                break;
            }
            log.info(fs.getDevName() + "讀出:    " + usage.getDiskReads());
            log.info(fs.getDevName() + "寫入:    " + usage.getDiskWrites());
        }
        return;
    }

    private static void net() throws Exception {
        Sigar sigar = new Sigar();
        String ifNames[] = sigar.getNetInterfaceList();
        for (int i = 0; i < ifNames.length; i++) {
            String name = ifNames[i];
            NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name);
            log.info("網(wǎng)絡(luò)設(shè)備名:    " + name);// 網(wǎng)絡(luò)設(shè)備名
            log.info("IP地址:    " + ifconfig.getAddress());// IP地址
            log.info("子網(wǎng)掩碼:    " + ifconfig.getNetmask());// 子網(wǎng)掩碼
            if ((ifconfig.getFlags() & 1L) <= 0L) {
                log.info("!IFF_UP...skipping getNetInterfaceStat");
                continue;
            }
            NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name);
            log.info(name + "接收的總包裹數(shù):" + ifstat.getRxPackets());// 接收的總包裹數(shù)
            log.info(name + "發(fā)送的總包裹數(shù):" + ifstat.getTxPackets());// 發(fā)送的總包裹數(shù)
            log.info(name + "接收到的總字節(jié)數(shù):" + ifstat.getRxBytes());// 接收到的總字節(jié)數(shù)
            log.info(name + "發(fā)送的總字節(jié)數(shù):" + ifstat.getTxBytes());// 發(fā)送的總字節(jié)數(shù)
            log.info(name + "接收到的錯(cuò)誤包數(shù):" + ifstat.getRxErrors());// 接收到的錯(cuò)誤包數(shù)
            log.info(name + "發(fā)送數(shù)據(jù)包時(shí)的錯(cuò)誤數(shù):" + ifstat.getTxErrors());// 發(fā)送數(shù)據(jù)包時(shí)的錯(cuò)誤數(shù)
            log.info(name + "接收時(shí)丟棄的包數(shù):" + ifstat.getRxDropped());// 接收時(shí)丟棄的包數(shù)
            log.info(name + "發(fā)送時(shí)丟棄的包數(shù):" + ifstat.getTxDropped());// 發(fā)送時(shí)丟棄的包數(shù)
        }
    }

    private static void ethernet() throws SigarException {
        Sigar sigar = null;
        sigar = new Sigar();
        String[] ifaces = sigar.getNetInterfaceList();
        for (int i = 0; i < ifaces.length; i++) {
            NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]);
            if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress())
                    || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0
                    || NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())) {
                continue;
            }
            log.info(cfg.getName() + "IP地址:" + cfg.getAddress());// IP地址
            log.info(cfg.getName() + "網(wǎng)關(guān)廣播地址:" + cfg.getBroadcast());// 網(wǎng)關(guān)廣播地址
            log.info(cfg.getName() + "網(wǎng)卡MAC地址:" + cfg.getHwaddr());// 網(wǎng)卡MAC地址
            log.info(cfg.getName() + "子網(wǎng)掩碼:" + cfg.getNetmask());// 子網(wǎng)掩碼
            log.info(cfg.getName() + "網(wǎng)卡描述信息:" + cfg.getDescription());// 網(wǎng)卡描述信息
            log.info(cfg.getName() + "網(wǎng)卡類型" + cfg.getType());//
        }
    }

更多恢筝,請(qǐng)關(guān)注:
springboot 技術(shù)實(shí)踐總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市巨坊,隨后出現(xiàn)的幾起案子撬槽,更是在濱河造成了極大的恐慌,老刑警劉巖趾撵,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侄柔,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)暂题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門移剪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人薪者,你說我怎么就攤上這事纵苛。” “怎么了言津?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵赶站,是天一觀的道長。 經(jīng)常有香客問我纺念,道長贝椿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任陷谱,我火速辦了婚禮烙博,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘烟逊。我一直安慰自己渣窜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布宪躯。 她就那樣靜靜地躺著乔宿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪访雪。 梳的紋絲不亂的頭發(fā)上详瑞,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音臣缀,去河邊找鬼坝橡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛精置,可吹牛的內(nèi)容都是我干的计寇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼脂倦,長吁一口氣:“原來是場噩夢啊……” “哼番宁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赖阻,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤蝶押,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后政供,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體播聪,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年布隔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了离陶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衅檀,死狀恐怖招刨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哀军,我是刑警寧澤沉眶,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站杉适,受9級(jí)特大地震影響谎倔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猿推,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一片习、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹬叭,春花似錦藕咏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坦喘,卻和暖如春盲再,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓣铣。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工洲胖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坯沪。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓绿映,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腐晾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叉弦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容