AWS CloudWatchログエージェントを使用して、アプリケーションログをAWS Cloudwatchにプッシュすることができました。ただし、CloudWatchウェブコンソールには、そこからログデータをダウンロード/エクスポートできるボタンが用意されていないようです。
この目標をどのように達成できるか考えていますか?
最新の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
を設定した場合、ログイベントのフェッチを継続し、新しいイベントが到着すると報告します(予想される遅延があります)。
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
その他(期間のフィルタリング、ログストリームの監視など).
このツールは、あなたが望むことをするのに役立つかもしれないと思います。
AWSがロググループ全体をS3にエクスポートする機能を追加したようです。
バケットポリシーに次を追加し、リージョンをリージョンに、バケット名をバケット名に置き換えることにより、クラウドウォッチがバケットに書き込むことができるように、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 にあります。
どうやら、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
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}"