一、背景

最近,小哈主要在负责日志中台的开发工作, 等等,啥是日志中台?

俺只知道中台概念,这段时间的确很火,但是日志中台又是用来干啥的?

这里小哈尽量地通俗的说下日志中台的职责,再说日志中台之前,我们先扯点别的?

相信大家对集中式日志平台 ELK 都知道一些,生产环境中, 稍复杂的架构,服务一般都是集群部署,这样,日志就会分散在每台服务器上,一旦发生问题,想要查看日志就会非常繁琐,你需要登录每台服务器找日志,因为你不确定请求被打到哪个节点上。另外,任由开发人员登录服务器查看日志本身就存在安全隐患,不小心执行了 rm -rf * 咋办?

通过 ELK , 我们可以方便的将日志收集到一处(Elasticsearch 集群)来进行多维度的分析。

但是部署高性能、高可用的 ELK 是有门槛的,业务组想要快速的拥有集中式日志分析的能力,往往需要经过前期的技术调研,测试,踩坑,才能将这个平台搭建起来。

日志中台的使命就是让业务线能够快速拥有这种能力,只需傻瓜式的在日志平台完成接入操作即可。

臭嗨!说了这么多,跟你这篇文章的主题有啥关系?

额,小哈这就进入主题。

既然想统一管理日志,总得将这些分散的日志采集起来吧,那么,就需要一个日志采集器,Logstash 和 Filebeat 都有采集日志的能力,但是 Filebeat 相较于 Logstash 的笨重, 它更轻量级,几乎零占用服务器系统资源,这里我们选型 Filebeat。

业务组在日志平台完成相关接入流程后,平台会提供一个采集器包。接入方需要做的就是,下载这个采集器包并扔到指定服务器上,解压运行,即可开始采集日志,然后,就可以在日志平台的管控页面分析&搜索这些被收集的日志了。

这个 Filebeat 采集器包里面,包含了采集日志文件路径,输出到 Kafka 集群,以及一些个性化的采集规则等等。

怎么样?是不是感觉很棒呢?

二、如何通过 Java 打包文件?

2.1 添加 Maven 依赖

org.apache.commons

commons-compress

1.12

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

欢迎关注微信公众号: 小哈学Java

更多干货文章,请关注笔者公众号:小哈学Java (ID: xiaoha_java), 专注于分享Java领域干货文章, 不限于 BAT 面试题,算法,数据库,Spring Boot, Spring Cloud & SOA, 高并发,JVM 调优, 数据库,Docker 容器, ELK, DevOps 等相关知识,另外,关注回复「资源」,即可获取全文最热的 Java 面试&架构学习资源哟~

java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...相关推荐

  1. Linux 打包压缩-文件打包-打包工具【tar】命令使用简介

    tar 将许多文件一起保存至一个单独的磁带或磁盘归档,并能从归档中单独还原所需文件. 补充说明 tar命令 可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也 ...

  2. centos 把文件打包为tar.gz命令

    centos 把文件打包为tar.gz命令: tar -zcvf 文件名.tar.gz 要压缩的文件/文件夹 例如,把webfile目录(包括里面的文件)压缩为webfile.tar.gz,命令:ta ...

  3. python压缩文件tar_python 实现tar文件压缩解压的实例详解

    python 实现tar文件压缩解压的实例详解 python 实现tar文件压缩解压的实例详解 压缩文件: import tarfile import os def tar(fname): t = t ...

  4. linux安装bz2压缩文件,Linux下*.tar.gz/.tar.bz2 文件解压缩安装命令

    Linux tar 命令 在Linux平台,tar是主要的打包工具.tar命令通常用来把文件和目录压缩为一个文件( tarball 或 tar, gzip 和 bzip). Tar选项: c – 创建 ...

  5. Linux 文件打包(tar命令——怎么使打包后的文件夹里只有想要的文件而不是有多一个原目录)

    正常打包情况下,打包后的目录下还有个原目录,如下:   怎么去掉这个多余的文件夹呢?如下tar -cvf config.tar -C config/ .   打包包含隐藏目录的文件夹:tar -cvf ...

  6. 压缩文件报错 tar: Exiting with failure status due to previous errors

    目录 解决方式: 1. 因为 对某些文件没有 读权限,需要sudo 权限 ,执行语句前 加 sudo 2. 文件名有问题,不存在某个需要压缩的文件 压缩文件时,提示 tar: Exiting with ...

  7. python压缩文件操作_Python tar、zip压缩文件操作方法

    python语言源码练习,tar.zip压缩文件操作方法参考示例. import os import threading, zipfile import tarfile class AsyncZip( ...

  8. windows 10 上传文件夹到 Linux服务器 压缩文件夹 到tar.gz格式

    有时候需要把win10上的一个文件夹传到Linux服务器上 简洁的做法是先压缩成 tar.gz 再用xftp上传 其中win端的压缩软件一般无法直接压缩成tar.gz格式 可用在cmd中 用命令压缩: ...

  9. Java生成两个圆判断是否重叠,用java随机画出两个圆,判断它们是不是相交

    用java随机画出两个圆,判断它们是否相交 import java.awt.*; import java.util.Random; import javax.swing.*; import javax ...

最新文章

  1. LeetCode简单题之二叉树的层平均值
  2. Caused by: java.lang.IllegalStateException: View ' '
  3. 六面!终斩腾讯NLP暑期实习offer
  4. 以cisco 3550为例介绍IOS的恢复方法:
  5. 无空头链表详解(增删改查)
  6. 八皇后非递归算法c语言,要求;编写实现八皇后问题的递归解法或非递归解法,对于任意给定的一? 爱问知识人...
  7. 毕业准备:外企面试--基本涵盖了所有问题【附带有答案版本】
  8. linux cp后文件变大,使用 rsync 复制大文件的一些误解 | Linux 中国
  9. new Class{}形式
  10. wechat server的配置
  11. python opencv 直方图均衡化_Python opencv—直方图/直方图均衡化/直方图比较,pythonopencv...
  12. 利用UDP端口转发绕过校园网认证
  13. 我的HTC G16 CHACHA A810e版手机如何解锁和一键root的
  14. 通俗理解动态库与静态库区别
  15. devc++工程提示“源文件未编译”的可能问题
  16. 学计算机专业独立显卡有必要吗,独立显卡驱动有什么用(显卡驱动有必要安装吗)...
  17. vim 编辑器常用操作
  18. Mysql 问题------解决1251 client does not support ...问题
  19. A* 流程+代码详细注释
  20. java中pom文件详解

热门文章

  1. 为什么要在定义抽象类时使用abstract关键字
  2. javaScript第六天(2)
  3. 多线程——实现Runnable接口实现一个多线程
  4. 100. Same Tree
  5. 找到你的位置(JS在页面中的位置)最常用的方式是在页面中head部分放置script元素,浏览器解析head部分就会执行这个代码,然后才解析页面的其余部分...
  6. python函数参数
  7. JavaScript indexOf() 方法 和 lastIndexOf() 方法
  8. arm's multiply(arm的乘)之三
  9. OpenLayers3关于Map Export的Canvas跨域
  10. python --- 使用conda配置pytorch