如何按自定义条件删除Azure日志并保留指定例外日志
嘿,针对你想要按自定义条件清理Azure Application Insights日志的需求,结合你用Asp.Net Core 3.1 + Serilog上报结构化日志的场景,我整理了手动和自动两种可行方案,帮你实现「删除大部分日志,但保留近3天内事件名称为LogIn的日志」的目标:
按自定义条件清理Azure Application Insights日志的方案
一、手动清理(适合临时一次性操作)
如果你只是偶尔需要执行一次清理,可以通过日志查询+CLI/API的组合来完成:
先验证筛选条件
先在Log Analytics里跑个查询,确认你要删除的日志范围(也就是排除近3天内_function_为LogIn的所有日志):union * where timestamp < ago(3d) or (_function_ != "LogIn")这里要注意:如果你的
LogIn事件是存在于AI的name字段(而不是自定义的_function_属性),就把查询里的_function_换成name就行,确保能精准筛选出要删除的内容。执行删除操作
- 用Azure CLI的话,先拿到你的Application Insights资源ID,然后通过
az rest调用删除API:az rest --method POST --uri "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Insights/components/{componentName}/delete?api-version=2021-04-01" --body "{\"query\":\"union * where timestamp < ago(3d) or (_function_ != 'LogIn')\"}" - 也可以在Log Analytics里把要删除的日志条目ID导出,再通过REST API批量删除,不过CLI的方式更直接。
- 用Azure CLI的话,先拿到你的Application Insights资源ID,然后通过
二、自动清理(适合长期定期执行)
如果需要定期自动做这件事,推荐用Azure原生服务来实现,不用自己维护定时任务:
方案1:Azure Functions定时触发
- 建一个定时触发的Azure Function(比如每天凌晨跑一次)。
- 在Function代码里,先调用Azure Monitor的日志查询API,拿到所有需要删除的日志条目ID(就是上面那个查询的结果)。
- 接着调用Azure Monitor的日志删除API,批量删掉这些条目。
👉 注意:要给Function的服务主体分配Monitoring Contributor角色,确保它有足够权限执行删除操作。
方案2:连续导出+数据保留策略(更省心的原生方案)
这个方法不用写代码,靠Azure的原生功能就能实现:
- 导出要保留的日志:在Application Insights的「连续导出」设置里,配置只导出近3天内
_function_为LogIn的事件到Azure存储账户/ADLS Gen2。筛选条件用这个Kusto查询:where timestamp >= ago(3d) and _function_ == "LogIn" - 设置自动清理规则:在Application Insights的「数据保留」里,把保留期设为3天。这样超过3天的所有日志会自动被Azure删除,而你需要的
LogIn事件已经提前导出到存储账户里了。
如果需要长期存这些LogIn日志,还能给存储账户加个生命周期管理策略,把旧数据归档到低成本的冷存储层。
三、重要提醒
- 删除日志是不可逆的!执行前一定要反复验证你的查询条件,别误删了要保留的内容。
- 确认你的Serilog配置没问题:确保
_function_这个自定义属性确实能在Application Insights里被识别到,不然筛选条件会失效。
内容的提问来源于stack exchange,提问作者David Petric
相关产品推荐
相关产品推荐

