【问题标题】:delete all log streams of a log group using aws cli使用 aws cli 删除日志组的所有日志流
【发布时间】:2017-06-27 08:31:00
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您可以通过使用--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

    清除特定的日志组

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

    Credit

    【讨论】:

    • 这可行,但会删除所有日志。 OP 正在询问如何删除组内的日志 streams
    • @brianz 好点,我已经更新了答案以正确回答所提出的问题
    • 不是以可视表格格式输出流列表,然后使用 awk 和 grep 提取表格内容,您可以像这样以文本格式输出 aws logs describe-log-streams --log-group-name $LOG_GROUP_NAME --query 'logStreams[*].[logStreamName]' --output text | while read x; do aws logs delete-log-stream --log-group-name $LOG_GROUP_NAME --log-stream-name $x; done
    【解决方案2】:

    使用来自@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】:

    这是使用 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'])
    

    【讨论】:

    • 然而,上述脚本存在一个非常小的问题。它仍然不会删除指定日志组中的all 流。这是因为describe_log_streams 有一个限制,只能最多 提取第一个 50 条记录。所以我们可以在上面添加另一个循环并删除所有流恕我直言。
    • 或者更好,分页可以这样使用:paginator = client.get_paginator('describe_log_streams')pg_response = paginator.paginate(logGroupName='/aws/batch/job', PaginationConfig={'MaxItems': 100000})response = pg_response.build_full_result()results = map(lambda x: delete_stream(x), response['logStreams'])
    【解决方案4】:

    要删除与特定日志组关联的所有日志流,请运行以下命令,将 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
    

    【讨论】:

      【解决方案5】:

      基于@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
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 如果您能提供脚本,我将不胜感激。
        【解决方案7】:

        对于 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 中执行即可。

        【讨论】:

          【解决方案8】:

          其他人已经描述了如何对所有日志流进行分页并一一删除。

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


          删除日志group,然后重新创建,效果达到预期:该日志组的所有日志流都会被删除。

          接着是:

          警告:删除日志组可能会产生意想不到的后果。例如,订阅和保留策略也将被删除,并且在重新创建日志组时也必须恢复。


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

          它不会立即生效,您需要等待大约 10 分钟。一天,但在那之后所有的旧数据都将被删除。旧流的名称及其元数据(上次事件时间、创建时间等)将保留,但您不会为此付费(据我所知,根据我自己的账单)。

          所以这不是你所要求的。但是,可能想要删除所有日志流的最重要原因是删除记录的数据(以降低成本或出于合规性原因),而这种方法可以实现这一点。

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

          【讨论】:

            【解决方案9】:

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

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

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

            【讨论】:

            • 我想使用 CLI 删除日志组下的所有日志流。不是日志组
            • 这是另一个问题的答案。
            【解决方案10】:

            在 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

            【讨论】:

              【解决方案11】:

              如果你使用前缀,你可以使用下面的命令。

              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;
              

              【讨论】:

                【解决方案12】:

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

                * 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
                

                【讨论】:

                  猜你喜欢
                  • 2018-09-22
                  • 1970-01-01
                  • 2019-12-24
                  • 2012-09-18
                  • 2022-10-11
                  • 2020-01-23
                  • 2022-12-28
                  • 2020-05-13
                  • 1970-01-01
                  相关资源
                  最近更新 更多