在 s3 存储桶内搜索日志

在 s3 存储桶内搜索日志

如何在 Amazon S3 存储桶子文件夹中的大量 .gz 文件中搜索字符串?我尝试通过 s3fs 和 zgrep 安装它,但速度太慢了。你还使用其他方法吗?

也许我可以使用任何亚马逊服务来快速 zgrep 它们?

答案1

我发现最快的方法是先在本地复制它们,然后执行本地 zgrep:

aws s3 cp s3://bucket/containing/the/logs . --recursive

这会将 ( cp) 所有日志复制到当前目录 ( .) 并包含所有子文件夹 ( --recursive)。

然后是本地的zgrep

zgrep "search words" *.gz

或者也递归搜索子目录:

find -name \*.gz -print0 | xargs -0 zgrep "STRING"

(取自unix.stackexchange.com.)

答案2

不是grep,但您现在可以使用以下命令查询日志雅典娜

第一的,从您的 S3 存储桶创建一个表

CREATE EXTERNAL TABLE IF NOT EXISTS S3Accesslogs(
  BucketOwner string,
  Bucket string,
  RequestDateTime string,
  RemoteIP string,
  Requester string,
  RequestID string,
  Operation string,
  Key string,
  RequestURI_operation string,
  RequestURI_key string,
  RequestURI_httpProtoversion string,
  HTTPstatus string,
  ErrorCode string,
  BytesSent string,
  ObjectSize string,
  TotalTime string,
  TurnAroundTime string,
  Referrer string,
  UserAgent string,
  VersionId string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
 'serialization.format' = '1',
  'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)$'
) 
LOCATION 's3://s3-server-access/logs/'

然后就可以用SQL查询了:

SELECT requestdatetime, bucket, remoteip, requesturi_key
FROM s3accesslogs
WHERE bucket IN ('bucket1', 'bucket2')
    AND remoteip = '123.45.67.89'
ORDER BY requestdatetime DESC
LIMIT 100;

答案3

我有同样的问题。我尝试编写一个 python 脚本来下载该文件并通过 zgrep 运行它。但仅运行一个 grep 命令就需要 30 秒。文件也约为 200MB,因此总体时间非常长。我必须对数百个文件执行此操作。

就我而言,我编写了一个 lambda 函数并针对不同的 .gz 文件并行运行它。使用 /tmp 存储下载 lambda 实例的 .gz 文件并运行 zgrep。

os.chdir('/tmp/') os.mkdir('s3_logs') os.chdir('s3_logs') s3.download_file(Bucket, s3object, '/tmp/s3_logs/file.gz') query = 'zgrep String file.gz' result = os.popen(query).read() print(result)

lambda 的多个实例可以使其速度至少提高几倍。尽管请记住,lambda 的 tmp 存储空间只有 500MB。

答案4

现在到 2023 年:

  • 要么使用“Mountpoint for Amazon S3”,然后使用 grep;或者

  • 使用 cloudgrep 进行以下操作:

    cloudgrep --bucket your_bucket --query your_query

相关内容