使用aws cli删除日志组的所有日志流

时间:2017-02-09 10:59:23

标签: amazon-web-services aws-cli amazon-cloudwatch

要使用CLI命令从日志组中删除日志流,需要单独的日志流名称。 有没有办法使用单个命令删除属于日志组的所有日志流?

12 个答案:

答案 0 :(得分:19)

您可以使用document.getElementById('status').value = 'true';​​​​​​​​​​ 定位--query的结果来实现此目的。这允许您循环并删除结果。

describe-log-streams

您可以使用aws logs describe-log-streams --log-group-name $LOG_GROUP_NAME --query 'logStreams[*].logStreamName' --output table | awk '{print $2}' | grep -v ^$ | while read x; do aws logs delete-log-stream --log-group-name $LOG_GROUP_NAME --log-stream-name $x; done 定位所有或特定的群组或流。

删除特定月份的流

--query

删除所有日志组 - 警告,它会删除所有内容!

aws logs describe-log-streams --log-group-name $LOG_GROUP --query 'logStreams[?starts_with(logStreamName,`2017/07`)].logStreamName' --output table | awk '{print $2}' | grep -v ^$ | while read x; do aws logs delete-log-stream --log-group-name $LOG_GROUP --log-stream-name $x; done

清除特定日志组

aws logs describe-log-groups --query 'logGroups[*].logGroupName' --output table | awk '{print $2}' | grep -v ^$ | while read x; do aws logs delete-log-group --log-group-name $x; done

Credit

答案 1 :(得分:5)

这是使用python删除日志组中所有日志的脚本。只需更改logGroupName即可与您的logGroup匹配。

import boto3

client = boto3.client('logs')

response = client.describe_log_streams(
    logGroupName='/aws/batch/job'
)


def delete_stream(stream):
    delete_response = client.delete_log_stream(
        logGroupName='/aws/batch/job',
        logStreamName=stream['logStreamName']
    )

    print(delete_response)


results = map(lambda x: delete_stream(x), response['logStreams'])

答案 2 :(得分:5)

使用来自@ Stephen的答案的命令实现脚本。该脚本在删除前显示摘要并跟踪删除的进度。

#!/usr/bin/env bash

LOG_GROUP_NAME=${1:?log group name is not set}

echo Getting stream names...
LOG_STREAMS=$(
    aws logs describe-log-streams \
        --log-group-name ${LOG_GROUP_NAME} \
        --query 'logStreams[*].logStreamName' \
        --output table |
        awk '{print $2}' |
        grep -v ^$ |
        grep -v DescribeLogStreams
)

echo These streams will be deleted:
printf "${LOG_STREAMS}\n"
echo Total $(wc -l <<<"${LOG_STREAMS}") streams
echo

while true; do
    read -p "Prceed? " yn
    case $yn in
    [Yy]*) break ;;
    [Nn]*) exit ;;
    *) echo "Please answer yes or no." ;;
    esac
done

for name in ${LOG_STREAMS}; do
    printf "Delete stream ${name}... "
    aws logs delete-log-stream --log-group-name ${LOG_GROUP_NAME} --log-stream-name ${name} && echo OK || echo Fail
done

Github link

答案 3 :(得分:3)

要删除与特定日志组关联的所有日志流,请运行以下命令,将NAME_OF_LOG_GROUP替换为您的组:

aws logs describe-log-streams --log-group-name NAME_OF_LOG_GROUP --output text | awk '{print $7}' | while read x; 
do aws logs delete-log-stream --log-group-name NAME_OF_LOG_GROUP --log-stream-name $x
done

答案 4 :(得分:2)

使用单个aws Cli命令无法完成此操作。因此,我们使用一个脚本来实现这一点,我们首先检索日志组的所有日志流,然后在循环中删除它们。

答案 5 :(得分:1)

- 在aws cli中,log-group-name不是可选的,您可以尝试使用* for --log-group-name值(在测试环境中)

aws logs delete-log-group --log-group-name my-logs

参考网址: http://docs.aws.amazon.com/cli/latest/reference/logs/delete-log-group.html

答案 6 :(得分:0)

在Windows上使用Powershell CLI的替代版本,启动powershell命令行并使用:

$LOG_GROUP_NAME="cloud-watch-group-name";
$LOG_STREAM_NAMEP="cloud-watch-log-stream-name";

Set-DefaultAWSRegion -Region us-your-regions;
Set-AWSCredential -AccessKey ACCESSKEYEXAMPLE -SecretKey sEcReTKey/EXamPLE/xxxddddEXAMPLEKEY -StoreAs MyProfileName

Get-CWLLogStream -loggroupname $LOG_GROUP_NAME -logstreamnameprefix $LOG_GROUP_NAMEP | Remove-CWLLogStream -LogGroupName $LOG_GROUP_NAME;

如果您不想一一确认,可以在 Remove-CWLogStream Cmdlet上使用 -Force 参数。

参考 https://docs.aws.amazon.com/powershell/latest/reference/Index.html

答案 7 :(得分:0)

基于@ german-lashevich的答案

如果您有成千上万的日志流,则需要进行并行化。

#!/usr/bin/env bash

LOG_GROUP_NAME=${1:?log group name is not set}

echo Getting stream names...
LOG_STREAMS=$(
    aws logs describe-log-streams \
        --log-group-name ${LOG_GROUP_NAME} \
        --query 'logStreams[*].logStreamName' \
        --output table |
        awk '{print $2}' |
        grep -v ^$ |
        grep -v DescribeLogStreams
)

echo These streams will be deleted:
printf "${LOG_STREAMS}\n"
echo Total $(wc -l <<<"${LOG_STREAMS}") streams
echo

while true; do
    read -p "Prceed? " yn
    case $yn in
    [Yy]*) break ;;
    [Nn]*) exit ;;
    *) echo "Please answer yes or no." ;;
    esac
done

step() {
    local name=$1
    printf "Delete stream ${name}... "
    aws logs delete-log-stream --log-group-name ${LOG_GROUP_NAME} --log-stream-name ${name} && echo OK || echo Fail
}

N=20
for name in ${LOG_STREAMS}; do ((i=i%N)); ((i++==0)) && wait ; step "$name" & done

答案 8 :(得分:0)

对于Windows用户,此powershell脚本对于删除日志组中的所有日志流可能很有用:

#Set your log group name
$log_group_name = "/production/log-group-name"

aws logs describe-log-streams --log-group-name $log_group_name --query logStreams --output json | ConvertFrom-json | ForEach-Object {$_.logStreamName} | ForEach-Object {
    aws logs delete-log-stream --log-group-name $log_group_name --log-stream-name $_
    Write-Host ($_ + " -> deleted") -ForegroundColor Green
}

只需将其另存为 your_script_name.ps1 ,然后在powershell中执行即可。

答案 9 :(得分:0)

如果使用前缀,则可以使用以下命令。

aws logs describe-log-streams --log-group-name <log_group_name> --log-stream-name-prefix"<give_a_log_group_prefix>" --query 'logStreams[*].logStreamName' --output table | awk '{print $2}' | grep -v ^$ | while read x; do aws logs delete-log-stream --log-group-name <log_group_name> --log- stream-name $x;done;

答案 10 :(得分:0)

其他人已经描述了如何浏览所有日志流并一一删除它们。

我想提供两种(或多或少)具有相同效果的替代方法,但不需要您遍历所有日志流。


删除日志,然后重新创建具有预期效果:日志组的所有日志流都将被删除。

其次:

注意::删除日志组可能会带来意想不到的后果。例如,订阅和保留策略也将被删除,并且在重新创建日志组时也必须还原这些订阅和保留策略。


另一种解决方法是设置1天保留期。

它不会立即生效,您将不得不等待约。一天,但之后所有旧数据将被删除。虽然旧流的名称及其元数据(上次事件时间,创建时间等)仍将保留,但您无需为此付费(据我自己的账单来看)。

因此,这与您要求的不完全相同。但是,可能要删除所有日志流的最重要原因可能是删除已记录的数据(以降低成本或出于合规性原因),而这种方法可以达到目的。

警告:不要忘记在旧数据丢失后更改保留策略,否则您将在1天后不断删除数据,这很可能不是您想要的。从长远来看。

答案 11 :(得分:0)

如果您在 zshell /zsh 中执行此操作并且您只需要一个简单的 liner 命令,那么只需更新值:

* Pattern
AWS_SECRET_ACCESS_KEY
AWS_ACCESS_KEY_ID
AWS_DEFAULT_REGION
  • 模式可以是任何文本,您也可以添加 ^ 表示行的开始或添加 $ 表示行的结束。

运行下面的命令!

Pattern="YOUR_PATTERN" && setupKeys="AWS_ACCESS_KEY_ID=YOUR_KEY AWS_SECRET_ACCESS_KEY=YOUR_KEY AWS_DEFAULT_REGION=YOUR_REGION" && 
eval "${setupKeys} aws logs describe-log-groups --query 'logGroups[*].logGroupName' --output table | sed 's/|//g'| sed 's/\s//g'| grep -i ${Pattern} "| while read x; do  echo "deleting $x" && $setupKeys aws logs delete-log-group --log-group-name $x; done