web-dev-qa-db-ja.com

AWS Cloudwatch Log-既存のログデータをそこからエクスポートすることは可能ですか?

AWS CloudWatchログエージェントを使用して、アプリケーションログをAWS Cloudwatchにプッシュすることができました。ただし、CloudWatchウェブコンソールには、そこからログデータをダウンロード/エクスポートできるボタンが用意されていないようです。

この目標をどのように達成できるか考えていますか?

36
xwk

最新のAWS CLIにはCloudWatch Logs cliがあり、JSON、テキストファイル、またはAWS CLIでサポートされるその他の出力としてログをダウンロードできます。

たとえば、グループaのストリームAからテキストファイルへの最初の10,000個のログエントリを取得するには、次を実行します。

aws logs get-log-events \
   --log-group-name A --log-stream-name a \
   --output text > a.log

コマンドは現在、リクエストごとに最大10,000レコードに制限されており、さらにある場合は、--next-tokenパラメーターを使用して独自のページステッピングメカニズムを実装する必要があります。将来的には、CLIで1つのコマンドで完全なダンプが可能になると予想しています。

更新

指定された時間以降、特定のグループ内のすべてのストリームからのイベントを一覧表示する小さなBashスクリプトを次に示します。

#!/bin/bash
function dumpstreams() {
  aws $AWSARGS logs describe-log-streams \
    --order-by LastEventTime --log-group-name $LOGGROUP \
    --output text | while read -a st; do 
      [ "${st[4]}" -lt "$starttime" ] && continue
      stname="${st[1]}"
      echo ${stname##*:}
    done | while read stream; do
      aws $AWSARGS logs get-log-events \
        --start-from-head --start-time $starttime \
        --log-group-name $LOGGROUP --log-stream-name $stream --output text
    done
}

AWSARGS="--profile myprofile --region us-east-1"
LOGGROUP="some-log-group"
TAIL=
starttime=$(date --date "-1 week" +%s)000
nexttime=$(date +%s)000
dumpstreams
if [ -n "$TAIL" ]; then
  while true; do
    starttime=$nexttime
    nexttime=$(date +%s)000
    sleep 1
    dumpstreams
  done
fi

最後の部分は、TAILを設定した場合、ログイベントのフェッチを継続し、新しいイベントが到着すると報告します(予想される遅延があります)。

51
Guss

python awslogsというプロジェクトがあり、ログを取得できます: https://github.com/jorgebastida/awslogs

次のようなものがあります。

ロググループのリスト:

$ awslogs groups

指定されたロググループのストリームをリストします。

$ awslogs streams /var/log/syslog

すべてのストリームからログレコードを取得します。

$ awslogs get /var/log/syslog

特定のストリームからログレコードを取得します。

$ awslogs get /var/log/syslog stream_A

その他(期間のフィルタリング、ログストリームの監視など).

このツールは、あなたが望むことをするのに役立つかもしれないと思います。

27
Jan Vlcinsky

AWSがロググループ全体をS3にエクスポートする機能を追加したようです。

Export to S3 menu

Export to S3 Form

バケットポリシーに次を追加し、リージョンをリージョンに、バケット名をバケット名に置き換えることにより、クラウドウォッチがバケットに書き込むことができるように、S3バケットにアクセス許可を設定する必要があります。

    {
        "Effect": "Allow",
        "Principal": {
            "Service": "logs.us-east-1.amazonaws.com"
        },
        "Action": "s3:GetBucketAcl",
        "Resource": "arn:aws:s3:::tsf-log-data"
    },
    {
        "Effect": "Allow",
        "Principal": {
            "Service": "logs.us-east-1.amazonaws.com"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::tsf-log-data/*",
        "Condition": {
            "StringEquals": {
                "s3:x-amz-acl": "bucket-owner-full-control"
            }
        }
    }

詳細は このAWSドキュメントのステップ2 にあります。

8
Josh Vickery

どうやら、AWS ConsoleからすぐにCloudWatchLogsをダウンロードできる方法はありません。おそらく、SDK/APIを使用してCloudWatchLogsフェッチを実行するスクリプトを作成できます。

CloudWatchLogsの良い点は、ログを無期限に保持できることです(Never Expire)。わずか14日間だけログを保持するCloudWatchとは異なります。つまり、オンデマンドではなく、毎月または四半期ごとにスクリプトを実行できます。

CloudWatchLogs APIの詳細、 http://docs.aws.Amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.htmlhttp://awsdocs.s3.amazonaws.com /cloudwatchlogs/latest/cwl-api.pdf

2
Naveen Vijay

1つのライナーを追加して、ストリームのすべてのログを取得します。

aws logs get-log-events --log-group-name my-log-group --log-stream-name my-log-stream | grep '"message":' | awk -F '"' '{ print $(NF-1) }' > my-log-group_my-log-stream.txt

または、もう少し読みやすい形式で:

aws logs get-log-events \
    --log-group-name my-log-group\
    --log-stream-name my-log-stream \
    | grep '"message":' \
    | awk -F '"' '{ print $(NF-1) }' \
    > my-log-group_my-log-stream.txt

そして、それから便利なスクリプトを作成できます。このスクリプトは、@ Gussほど強力ではありませんが、十分に単純です。 getLogs.shとして保存し、./getLogs.sh log-group log-streamで呼び出します

#!/bin/bash

if [[ "${#}" != 2 ]]
then
    echo "This script requires two arguments!"
    echo
    echo "Usage :"
    echo "${0} <log-group-name> <log-stream-name>"
    echo
    echo "Example :"
    echo "${0} my-log-group my-log-stream"

    exit 1
fi

OUTPUT_FILE="${1}_${2}.log"
aws logs get-log-events \
    --log-group-name "${1}"\
    --log-stream-name "${2}" \
    | grep '"message":' \
    | awk -F '"' '{ print $(NF-1) }' \
    > "${OUTPUT_FILE}"

echo "Logs stored in ${OUTPUT_FILE}"
0
Johnride