在 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

相關內容