在tar gzipped文件中逐行解析gzip压缩日志文件

时间:2013-06-05 10:21:33

标签: python logfile-analysis

我对日志文件有以下结构:

/var/log/2013-12-24.tar.gz

此文件包含:

2013-12-24/{00,01,02...23}.log.gz 

文件

我需要使用Python解析这些文件,

不提取磁盘或内存上的任何文件

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

.tar.gz无法做到这一点,这就是原因。

要创建.tar.gz文件,您必须首先tar创建单个.tar文件,然后gzip结果。

.tar文件可以在不阅读整个内容的情况下进行扫描,但只有tar存档的成员相对较大时才能正常工作。这是因为tar没有任何标题,列出了一个紧凑位置的所有成员。每个归档成员都有512字节的描述符,而不是显示下一个归档的位置。使用大型存档成员,您可以相对快速地在磁盘上找到任意成员内容,但您必须多次lseek()

但是,一旦您在gzip之上应用.tar,它基本上无法快速获取存档的所有成员列表,更不用说实际获取其内容未压缩的列表了。您被迫解压缩整个存档甚至只是获取其所有成员的列表。

请注意,流行的.tar.bz2.tar.xz格式存在完全相同的问题。

您可以使用zip格式进行修复。 zip.tar.gz具有更大的优势,因为它具有紧凑的索引,可以在一个位置列出所有归档成员,并且它允许快速读取该列表并仅提取您需要的文件,而无需提取( gunzip).tar.gz遭受的整个档案。

答案 1 :(得分:0)

我找到了解决方案。我将在此提供参考:

import subprocess
file_name = /var/log/2013-06-10.tar.gz
gzip_data = subprocess.Popen(["tar", "-Oxf", file_name], stdout=subprocess.PIPE)
data = subprocess.Popen(["zcat"], stdin=gzip_data.stdout, stdout=subprocess.PIPE)
for line in data.stdout:
    do_my_process_on(line)
相关问题