要使用CLI命令从日志组中删除日志流,需要单独的日志流名称。是否有一种方法可以使用单个命令删除属于日志组的所有日志流?
您可以通过使用--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
信用
使用@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链接
要删除与特定日志组关联的所有日志流,请运行以下命令,将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
下面是使用python删除日志组中所有日志的脚本。只需更改logGroupName
以匹配您的日志组。
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'])
基于@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
对于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中执行即可。
这不能使用单个aws-Cli命令来完成。因此,我们使用一个脚本实现了这一点,在该脚本中,我们首先检索日志组的所有日志流,然后在循环中删除它们。
在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-CWLogStreamCmdlet上使用-Force参数,以防您不想逐一确认。
参考文献https://docs.aws.amazon.com/powershell/latest/reference/Index.html
其他人已经描述了如何对所有日志流进行分页并逐个删除它们。
我想提供两种(或多或少)具有相同效果的替代方法,但不需要循环所有日志流。
删除日志组,然后重新创建它具有所需的效果:日志组的所有日志流都将被删除。
- 删除日志组
后接:
- 创建日志组
CAVEAT:删除日志组可能会产生意想不到的后果。例如,订阅和保留策略也将被删除,并且在重新创建日志组时,这些订阅和策略也必须恢复。
另一个解决方法是设置1天的保留期。
- put保留策略
它不会立即生效,您将不得不等待ca。一天,但之后所有旧数据都将被删除。尽管旧流的名称及其元数据(上次事件时间、创建时间等)将保留,但您不会为此收费(据我自己的账单所知)。
所以这并不是你想要的。然而,想要删除所有日志流的最重要原因可能是删除记录的数据(以降低成本或出于合规性原因),而这种方法实现了这一点。
警告:不要忘记在旧数据消失后更改保留策略,否则您将在1天后不断删除数据,从长远来看,这很可能不是您想要的。
如果您在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
-日志组名称在aws-cli中不是可选的,您可以尝试使用*for--日志组名称值(在测试环境中)
aws日志删除日志组--日志组名称我的日志
引用URL:http://docs.aws.amazon.com/cli/latest/reference/logs/delete-log-group.html
如果使用前缀,可以使用以下命令。
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;
一个带有分页的快速脏py脚本,用于删除组中的所有蒸汽。
从终端输入设置log_group_name
或取消注释以在代码中设置。
import boto3
# take input
print('log group name:')
log_group_name = input()
# or set in code
# log_group_name = '' # set your log name
client = boto3.client('logs')
def run(next_token: str = None):
print(f'batch w/token: {next_token}')
params = {
'logGroupName': log_group_name
}
if next_token:
params['nextToken'] = next_token
response_streams = client.describe_log_streams(**params)
streams = response_streams['logStreams']
for stream in streams:
log_stream_name = stream['logStreamName']
response_delete = client.delete_log_stream(
logGroupName=log_group_name,
logStreamName=log_stream_name
)
success = response_delete.get('ResponseMetadata', {}).get('HTTPStatusCode') == 200
print(f'delete {log_stream_name} - {"success" if success else "failed..."}')
return response_streams.get('nextToken')
# process
next_token = run()
while next_token:
next_token = run(next_token)