本文介绍如何配置LoongCollector,通过单一采集配置将日志分发至多个日志库,解决传统方案中配置膨胀和资源浪费的问题。
业务场景说明
在复杂的系统环境中,经常需要将同一来源的日志根据其内容或属性分发到不同的目的地,以满足不同的存储、分析或合规要求。例如:
日志分类存储:业务服务产生的普通日志和审计日志打印在同一个日志文件中,但审计日志需要长期归档存储以满足合规要求,而普通日志只需短期保存用于问题排查。将它们发送到不同生命周期策略的日志库可以显著降低存储成本。
K8s多容器日志分离:在Kubernetes中,一个Pod内可能运行多个容器(如业务容器和Sidecar容器),需要将它们的标准输出日志分别采集到独立的日志库进行分析。
传统方法是为每个目标日志库创建一个独立的采集配置,这会导致采集配置数量膨胀,增加管理复杂度,并在Agent端启动多个重复的采集任务,造成不必要的CPU和内存资源浪费。LoongCollector的多目标发送功能旨在通过单一采集配置解决上述问题。
方案架构
方案的核心机制是基于Tag字段的路由分发。数据从采集到最终发送的完整生命周期在一个采集任务内完成:
多路复制:当一条日志同时满足多个输出目标的路由规则时,该日志将被复制并发送到所有匹配的目标日志库。
无匹配丢弃:当一条日志不满足任何一个输出目标的路由规则时,该日志将被丢弃,不会发送到任何地方。
默认发送:如果一个输出目标未配置任何路由规则,则所有采集到的日志都将被发送到该目标。
实施步骤
本节将通过两个典型场景,详细介绍如何配置和使用LoongCollector的多目标发送功能。
本功能仅适用于LoongCollector 3.0.0及以上版本,Logtail不支持。
全局采集配置入口
与在特定日志库下创建采集配置不同,多目标发送的采集配置需要在Project的
页面进行:
登录日志服务控制台,单击目标Project名称。
在目标Project页面,单击左侧导航栏
。说明此页面集中管理Project下的所有采集配置,包括那些因日志库被误删而残留的配置。
场景一:同文件内不同类型日志的分类存储
本场景将演示如何将同一个日志文件中的普通服务日志和审计日志分发到两个具有不同存储周期的日志库。
在配置管理页面,单击创建Logtail配置。
在快速数据接入弹窗中,单击单行 - 文本日志卡片的立即接入。
机器组配置,配置完成后单击下一步。
使用场景:主机场景
安装环境:ECS
选择机器组:选择目标主机所在的机器组并添加到应用机器组。如目标主机尚未安装LoongCollector,请参考配置机器组(安装LoongCollector)完成机器组配置。
Logtail配置,配置完成后单击下一步。
配置名称:自定义采集配置名称,在其所属Project内必须唯一。创建成功后,无法修改。
输入配置
文件路径:日志采集的路径。
Linux:以“/”开头,如
/data/mylogs/**/*.log,表示/data/mylogs目录下所有后缀名为.Log的文件。Windows:以盘符开头,如
C:\Program Files\Intel\**\*.Log。
最大目录监控深度:文件路径中通配符
**匹配的最大目录深度。默认为0,表示只监控本层目录。
处理配置
日志样例:单击添加日志样例,样例内容如下:其中包含
action字段的为审计日志。2025-10-28 11:22:21 INFO User test deleted a record | action=DELETE 2025-10-28 11:22:21 INFO Cache refreshed 2025-10-28 11:22:22 INFO User guest attempted unauthorized access | action=ACCESS_DENIED 2025-10-28 11:22:23 INFO Connected to database 2025-10-28 11:22:23 INFO User admin logged in | action=LOGIN 2025-10-28 11:22:24 INFO Connected to database 2025-10-28 11:22:25 INFO User guest attempted unauthorized access | action=ACCESS_DENIED 2025-10-28 11:22:26 INFO User test deleted a record | action=DELETE 2025-10-28 11:22:26 INFO Cache refreshed 2025-10-28 11:22:29 INFO Processed 200 requests in the last minute处理模式:选择SPL。
SPL语句:输入如下SPL语句
* | parse-regexp content, '^(\d+-\d+-\d+\s\d+:\d+:\d+)\s+(\w+)\s+(.*?)\s*(?:\|\s*action=(\w+))?$' as time, level, message, action | project-away content | extend "__tag__:type" = case when action = '' then 'service_log' else 'audit_log' endSPL语句说明:
通过正则表达式提取出日志中的字段,包括time,level,message,action,并移除content字段。
新增一个Tag字段为type,当action字段不为空时,tag值为audit_log,否则tag值为service_log。
说明Tag命名说明:在SPL中创建或引用Tag时,字段名必须以
__tag__:为前缀,如__tag__:type。但在后续的路由规则配置中,仅需填写Tag名称type。
输出配置:单击
展开输出配置,添加两个输出目标。配置输出目标1:存储普通日志,
type标签值为service_log的日志。日志库:选择用于存储普通日志的日志库(如
service_log日志库)。压缩方式:支持lz4和zstd,默认为lz4。
路由配置:
Tag名称:Tag名称填写时直接使用字段名,无需添加
__tag__:前缀。此处设置tag名为type。Tag值:配置为
service_log。是否丢弃该Tag字段:开启后上传的日志中不包含该Tag字段。
配置输出目标2:存储审计日志,
type标签值为audit_log的日志。日志库:选择用于存储审计日志的日志库(如
audit_log日志库)。压缩方式:支持lz4和zstd,默认为lz4。
路由配置:
Tag名称:
type。Tag值:
audit_log。是否丢弃该Tag字段:开启后上传的日志中不包含该Tag字段。
查询分析配置:
配置完成后,单击下一步,完成整个采集流程的设置。
完成配置并保存后,LoongCollector将根据日志中的
action字段自动将日志分发到对应的日志库。audit_log日志库中应只包含带有action字段的日志记录。
service_log日志库中应只包含普通服务日志。
场景二:K8s同一Pod内不同容器日志的分离
本场景将演示如何将ACK集群中同一个Pod内两个不同容器(app1-container 和 app2-container)的标准输出日志采集到各自独立的日志库。实现在不创建多个采集配置的情况下,对同一Pod内多容器日志的精细化管理和分离。
在配置管理页面,单击创建Logtail配置。
在快速数据接入弹窗中,单击K8S - 标准输出 - 新版卡片的立即接入。
机器组配置,配置完成后单击下一步。
使用场景:K8s场景
部署方式:ACK Daemonset
选择机器组:在源机器组中将系统默认创建的机器组
k8s-group-${cluster_id}添加至右侧应用机器组。
Logtail配置,配置完成后单击下一步。
配置名称:自定义采集配置名称,在其所属Project内必须唯一。创建成功后,无法修改。
输入配置
选择开启标准输出或标准错误开关(默认全部开启)。
容器过滤:根据需要设置过滤条件,以限定采集范围。
开启容器过滤,单击,输入
^(app)$:只采集app命名空间下的容器数据。
输出配置:单击
展开输出配置,添加两个输出目标。K8s标准输出采集会自动为日志附加一系列包含容器元信息的Tag,例如
_container_name_。本场景利用此内置Tag进行路由。配置输出目标1:存储
app1容器日志。日志库:选择用于存储app1日志的日志库(例如
app1-log)。压缩方式:支持lz4和zstd,默认为lz4。
路由配置:
Tag名称:Tag名称填写时直接使用字段名,无需添加
__tag__:前缀。此处设置tag名为_container_name_。Tag值:配置为
app1-container。是否丢弃该Tag字段:开启后上传的日志中不包含该Tag字段。
配置输出目标2:存储
app2容器日志。日志库:选择用于存储app2日志的日志库(例如
app2-log)。压缩方式:支持lz4和zstd,默认为lz4。
路由配置:
Tag名称:
_container_name_。Tag值:
app2-container。是否丢弃该Tag字段:开启后上传的日志中不包含该Tag字段。
查询分析配置:
配置完成后,单击下一步,完成整个采集流程的设置。
完成配置并保存后,来自不同容器的标准输出日志被自动路由到指定的日志库。
app1-log日志库:
app2-log日志库:


