1. 程式人生 > >一文教您如何通過 Java 壓縮檔案,打包一個 tar.gz Filebeat 採集器包

一文教您如何通過 Java 壓縮檔案,打包一個 tar.gz Filebeat 採集器包

歡迎關注筆者的公眾號: 小哈學Java, 專注於推送 Java 領域優質乾貨文章!!

個人網站: https://www.exception.site/essay/create-tar-gz-by-java

一、背景

最近,小哈主要在負責日誌中臺的開發工作, 等等,啥是日誌中臺?

俺只知道中臺概念,這段時間的確很火,但是日誌中臺又是用來幹啥的?

這裡小哈儘量地通俗的說下日誌中臺的職責,再說日誌中臺之前,我們先扯點別的?

相信大家對集中式日誌平臺 ELK 都知道一些,生產環境中, 稍複雜的架構,服務一般都是叢集部署,這樣,日誌就會分散在每臺伺服器上,一旦發生問題,想要檢視日誌就會非常繁瑣,你需要登入每臺伺服器找日誌,因為你不確定請求被打到哪個節點上。另外,任由開發人員登入伺服器檢視日誌本身就存在安全隱患,不小心執行了 rm -rf *

咋辦?

通過 ELK , 我們可以方便的將日誌收集到一處(Elasticsearch 叢集)來進行多維度的分析。

但是部署高效能、高可用的 ELK 是有門檻的,業務組想要快速的擁有集中式日誌分析的能力,往往需要經過前期的技術調研,測試,踩坑,才能將這個平臺搭建起來。

日誌中臺的使命就是讓業務線能夠快速擁有這種能力,只需傻瓜式的在日誌平臺完成接入操作即可。

臭嗨!說了這麼多,跟你這篇文章的主題有啥關係?

額,小哈這就進入主題。

既然想統一管理日誌,總得將這些分散的日誌採集起來吧,那麼,就需要一個日誌採集器,LogstashFilebeat 都有采集日誌的能力,但是 Filebeat 相較於 Logstash

的笨重, 它更輕量級,幾乎零佔用伺服器系統資源,這裡我們選型 Filebeat

業務組在日誌平臺完成相關接入流程後,平臺會提供一個採集器包。接入方需要做的就是,下載這個採集器包並扔到指定伺服器上,解壓執行,即可開始採集日誌,然後,就可以在日誌平臺的管控頁面分析&搜尋這些被收集的日誌了。

這個 Filebeat 採集器包裡面,包含了採集日誌檔案路徑,輸出到 Kafka 叢集,以及一些個性化的採集規則等等。

怎麼樣?是不是感覺很棒呢?

二、如何通過 Java 打包檔案?

2.1 新增 Maven 依賴

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-compress</artifactId>
  <version>1.12</version>
</dependency>

2.2 打包核心程式碼

通過 Apache compress 工具打包思路大致如下:

  • ①:建立一個 FileOutputStream 到輸出檔案(.tar.gz)檔案。

  • ②:建立一個GZIPOutputStream,用來包裝FileOutputStream物件。

  • ③:建立一個TarArchiveOutputStream,用來包裝GZIPOutputStream物件。

  • ④:接著,讀取資料夾中的所有檔案。

  • ⑤:如果是目錄,則將其新增到 TarArchiveEntry

  • ⑥:如果是檔案,依然將其新增到 TarArchiveEntry 中,然後還需將檔案內容寫入 TarArchiveOutputStream 中。

接下來,直接上程式碼:

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.zip.GZIPOutputStream;

/**
 * @author 犬小哈 (公眾號: 小哈學Java)
 * @date 2019-07-15
 * @time 16:15
 * @discription
 **/
public class TarUtils {

    /**
     * 壓縮
     * @param sourceFolder 指定打包的源目錄
     * @param tarGzPath 指定目標 tar 包的位置
     * @return
     * @throws IOException
     */
    public static void compress(String sourceFolder, String tarGzPath) throws IOException {
        createTarFile(sourceFolder, tarGzPath);
    }

    private static void createTarFile(String sourceFolder, String tarGzPath) {
        TarArchiveOutputStream tarOs = null;
        try {
            // 建立一個 FileOutputStream 到輸出檔案(.tar.gz)
            FileOutputStream fos = new FileOutputStream(tarGzPath);
            // 建立一個 GZIPOutputStream,用來包裝 FileOutputStream 物件
            GZIPOutputStream gos = new GZIPOutputStream(new BufferedOutputStream(fos));
            // 建立一個 TarArchiveOutputStream,用來包裝 GZIPOutputStream 物件
            tarOs = new TarArchiveOutputStream(gos);
            // 若不設定此模式,當檔名超過 100 個位元組時會丟擲異常,異常大致如下:
            // is too long ( > 100 bytes)
            // 具體可參考官方文件: http://commons.apache.org/proper/commons-compress/tar.html#Long_File_Names
            tarOs.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX);
            addFilesToTarGZ(sourceFolder, "", tarOs);
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                tarOs.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void addFilesToTarGZ(String filePath, String parent, TarArchiveOutputStream tarArchive) throws IOException {
        File file = new File(filePath);
        // Create entry name relative to parent file path
        String entryName = parent + file.getName();
        // 新增 tar ArchiveEntry
        tarArchive.putArchiveEntry(new TarArchiveEntry(file, entryName));
        if (file.isFile()) {
            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            // 寫入檔案
            IOUtils.copy(bis, tarArchive);
            tarArchive.closeArchiveEntry();
            bis.close();
        } else if (file.isDirectory()) {
            // 因為是個資料夾,無需寫入內容,關閉即可
            tarArchive.closeArchiveEntry();
            // 讀取資料夾下所有檔案
            for (File f : file.listFiles()) {
                // 遞迴
                addFilesToTarGZ(f.getAbsolutePath(), entryName + File.separator, tarArchive);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        // 測試一波,將 filebeat-7.1.0-linux-x86_64 打包成名為 filebeat-7.1.0-linux-x86_64.tar.gz 的 tar 包
        compress("/Users/a123123/Work/filebeat-7.1.0-linux-x86_64", "/Users/a123123/Work/tmp_files/filebeat-7.1.0-linux-x86_64.tar.gz");
    }

}

至於,程式碼每行的作用,小夥伴們可以看程式碼註釋,說的已經比較清楚了。

接下來,執行 main 方法,測試一下效果,看看打包是否成功:

生成採集器 tar.gz 包成功後,業務組只需將 tar.gz 下載下來,並扔到指定伺服器,解壓執行即可完成採集任務啦~

三、結語

本文主要還是介紹如何通過 Java 來完成打包功能,關於 ELK 相關的知識,小哈會在後續的文章中分享給大家,本文只是提及一下,歡迎小夥伴們持續關注喲,下期見~

四、Ref

  • https://netjs.blogspot.com/2017/05/creating-tar-file-and-gzipping-multiple-files-java.html

歡迎關注微信公眾號: 小哈學Java

更多幹貨文章,請關注筆者公眾號: 小哈學Java (ID: xiaoha_java), 專注於分享Java領域乾貨文章, 不限於 BAT 面試題分享,Spring Boot, Spring Cloud, 高併發,JVM, 資料庫,Docker 容器, ELK 等相關知識,另外,關注回覆「資源」,即可獲取全文最熱的 Java 面試&架構學習資源喲~

相關推薦

文教如何通過 Java 壓縮檔案打包一個 tar.gz Filebeat 採集

歡迎關注筆者的公眾號: 小哈學Java, 專注於推送 Java 領域優質乾貨文章!! 個人網站: https://www.exception.site/essay/create-tar-gz-by-java 一、背景 最近,小哈主要在負責日誌中臺的開發工作, 等等,啥是日誌中臺? 俺只知道中臺概念

java壓縮檔案解決中文亂碼問題!

package TestZIP; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.tools.zip.ZipEnt

文教如何通過 Docker 搭建反向代理 Ngnix並配置 Https SSL 證書

歡迎關注個人微信公眾號: 小哈學Java, 每日推送 Java 領域乾貨文章,關注附送 100G 海量學習資源喲!! 個人網站: https://www.exception.site/docker/how-to-config-ssl-with-docker-nginx 一、背景 小哈最近收到阿里雲簡訊,提

基礎 | 36個經典面試題來測Java基礎

到此為止,「Java基礎」系列的面試點已更新完畢,但關於Java NIO和Java8新特性之Lambda表示式部分的內容還停留在概述階段,不夠系統和深入,後續有機會再深入學習和更新。 在此,主要將Java基礎系列以面試題的形式進行彙總,用做面試前的準備與自測提綱。 公眾號後

給定Java原始碼檔案統計其註釋行數空行行數數程式碼行數及總行數

規定:一行上既有程式碼又有註釋算程式碼行數(例如:int  a = 1; //註釋); Java原始碼檔案(要統計的原始碼檔案) package cn.edu.ccit.fwh; public

Java學習之使用net.lingala.zip4j.core.ZipFile解壓縮檔案帶解壓縮排度

import java.io.File; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.progress.ProgressMoni

文教如何通過 Docker 快速搭建各種測試環境(Mysql, Redis, Elasticsearch, MongoDB) | 建議收藏

歡迎關注個人微信公眾號: 小哈學Java, 文末分享阿里 P8 高階架構師吐血總結的 《Java 核心知識整理&面試.pdf》資源連結!! 個人網站: https://www.exception.site 小哈今天給大家分享的主題是,如何通過 Docker 快速搭建各種測試環境,本文列舉的,也

通過java反射機制Method獲取出來的引數名為

記錄2018年我遇見的一個大坑!!!!! 前言 具體介紹 出現問題 解決 前言 最近我一直在嘗試手寫一個簡單的框架,其中,在補全mvc框架的時候,遇到了Method方法關於版本以及一些奇奇怪怪的坑。 具體介紹

通過Java實現HMAC將字串雜湊成為全部由字母組成的密文串

以下Java程式碼可以將任何字串通過HMAC雜湊,並輸出成由大寫的A到P組成的密文字串。 public class HMAC { private final static String KEY_MAC = "HMACMD5"; /** * 全域性陣列 *

java壓縮檔案

pom依賴 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId>

學習筆記:從0開始學習大資料-30. solr通過java匯入docpdf文件建立全文檢索

1. eclipse 新建maven專案solr,pom.xml 加入依賴 2 在專案下新建類updoctest package com.linbin.solr; import java.io.File; import java.io.IOException; import org.

Shell指令碼通過Java class檔案啟停Java程式

通過Shell指令碼啟動和停止Java程式(文章末尾附指令碼和程式原始碼地址) 步驟: 1,通過shell啟動指令碼啟動mainclass(非java -jar的方式) 2,記錄程序id 3,通過shell停止指令碼殺掉程序 示例專案結構和主類程式碼: 將工程編譯成

通過java反射機制獲取物件的屬性和值(包括所有繼承的父類)

      java的反射機制提供了兩種方法:    getDeclaredFields() :該方法能獲取到本類的所有屬性,包括private,protected和public,但不能獲取到繼承的父類的屬性。    getFields():既能獲取本類的屬性也能得到父類的

python處理gz壓縮檔案解壓並轉化為json

import requests import gzip import json # gz檔案地址 url='https://shilupan-basic-user-pro.oss-cn-shangha

[譯] 文教你什麼是漸進增強為什麼它很重要?

原文地址:What is Progressive Enhancement, and why it matters 原文作者:Praveen Dubey 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/gold-m… 譯者:RicardoCao-Bik

通過解析xml檔案讓類的方法執行

import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import org.dom4j.Document; import org.dom4j.DocumentExceptio

虛擬機器通過ssh共享檔案vmware通過ssh和宿主機共享檔案

vmware連線ssh,虛擬機器nat模式連線外網 vmware虛擬機器連線ssh,vmware虛擬機器連線網 外網連線虛擬機器設定外網,虛擬機器外網ping不通, 虛擬機器nat設定外網,虛擬機器外網ssh登入,主機ssh登入虛擬機器

java 壓縮檔案zip

1.引言 中介紹過對字串的壓縮和解壓,這個解壓和解決用在系統之間大資料傳輸的時候還是可以大大的減少網路流量的。本節主要本別介紹對單個檔案、多個檔案的壓縮。解壓這裡就不講了,解壓的話沒什麼實際意義,因為檔案壓縮後為zip格式的檔案,現在windows系統解壓這

java壓縮檔案

  昨天接收同事寫的壓縮生成的資料檔案功能,發現檔名儲存成.rar ,再用java的gzip壓縮,用rar解壓的時候報不能建立對應的資料夾異常。之前以為是gzip用的有問題,後來改用zip,可還是報同一異常,最後發現時儲存的rar檔名有問題,如果檔名儲存成.txt.rar/.

java建立檔案並向檔案中寫入字串讀取字串到螢幕

public class FileTest01 { public static void writeFileString() { File file = new File("E:\\zkn")