使用ALG收集监控日志文件示例
ALG(Alloy + Loki + Grafana)现代轻量级的日志管理解决方案
Alloy配置文件示例
- 配置语法:https://grafana.org.cn/docs/alloy/latest/get-started/configuration-syntax/
- 可以配置多组
- VsCode 配置文件搜索 Grafana Alloy 插件
text
config.alloylocal.file_match "local_files" {
path_targets = [
{
"__path__" = "/usr/crm/logs/*.log",
"host" = "10.1.56.207",
"app" = "crm",
"env" = "prod",
},
{
"__path__" = "/usr/oa/logs/*.log",
"host" = "10.1.56.207",
"app" = "oa",
"env" = "prod",
},
]
sync_period = "5s"
}
loki.source.file "log_scrape" {
targets = local.file_match.local_files.targets
forward_to = [loki.write.grafana_loki.receiver]
tail_from_end = true
}
loki.write "grafana_loki" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
// basic_auth {
// username = "admin"
// password = "admin"
// }
}
}Alloy配置文件讲解说明
配置文件解析
1. 文件目标定义 (local.file_match)
local.file_match "local_files" {
path_targets = [
{
"__path__" = "/usr/crm/logs/*.log",
"host" = "10.1.56.207",
"app" = "crm",
"env" = "prod",
},
{
"__path__" = "/usr/oa/logs/*.log",
"host" = "10.1.56.207",
"app" = "oa",
"env" = "prod",
},
]
sync_period = "5s"
}- 作用:动态发现需要监控的日志文件
- 关键配置项:
path_targets:定义文件路径和标签__path__:使用通配符匹配日志文件(支持*和**递归匹配)host、app、env:自定义设置日志来源标识(Loki查询时的重要标签)
sync_period:文件系统同步间隔(默认30s)
2. 日志收集配置 (loki.source.file)
loki.source.file "log_scrape" {
targets = local.file_match.local_files.targets
forward_to = [loki.write.grafana_loki.receiver]
tail_from_end = true
}- 作用:持续跟踪并收集日志文件内容
- 关键配置项:
targets:引用前边定义的文件匹配结果forward_to:指定日志处理器(可多个)tail_from_end:控制在没有找到已存储的读取位置(positions file)时,是否从日志文件的末尾开始读取日志true:组件会忽略日志文件中已有的内容,只读取新追加的日志行。这对于处理大型日志文件时非常有用,可以避免一开始就读取全部历史内容,只关注后续新增的日志false(默认值):组件会从文件的开头开始读取所有内容,包括历史日志。
3. Loki写入配置 (loki.write)
loki.write "grafana_loki" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
// basic_auth {
// username = "admin"
// password = "admin"
// }
}
}- 作用:配置日志存储后端
- 关键配置项:
url:Loki服务地址(支持HTTPS)basic_auth:基础认证配置(按需启用)
配置注意事项
路径匹配:
*.log匹配同级目录所有.log文件**/logs/递归匹配所有子目录中的logs目录- 使用绝对路径保证可靠性
标签设计:
- 最少但具有区分度的标签组合
- 避免高频变化的标签值(如时间戳)
- 推荐标签:job, env, team, cluster
性能调优:
- 生产环境建议
sync_period≥ 1m - 大日志文件(>100MB)建议增加
read_buffer_size - 高负载时调整
max_concurrent_tails
- 生产环境建议
安全配置:
endpoint { url = "https://loki.secure.com" bearer_token = "xxxxxx" tls_config { ca_file = "/path/to/ca.crt" insecure_skip_verify = false } }
Loki配置文件示例
text
loki-config.yamlyaml
# auth_enabled: false # 禁用认证模块(生产环境不建议关闭)
auth_enabled: false
# 服务端配置
server:
http_listen_port: 3100 # HTTP API 监听端口(查询/写入接口)
grpc_listen_port: 9096 # gRPC 通信端口(组件间通信)
log_level: info # 服务日志级别
grpc_server_max_concurrent_streams: 1000 # gRPC 最大并发流数
# 公共配置
common:
instance_addr: 127.0.0.1 # 实例对外地址(集群部署需改为实际IP)
path_prefix: /home/loki/data # 数据存储根目录
storage:
filesystem:
chunks_directory: /home/loki/data/chunks # 块数据存储路径
rules_directory: /home/loki/data/rules # 告警规则存储路径
replication_factor: 1 # 数据副本数(单机模式为1)
ring: # 一致性哈希环配置
kvstore:
store: inmemory # 使用内存存储哈希环(集群需改为 consul 等)
# 查询范围缓存
query_range:
results_cache:
cache:
embedded_cache: # 嵌入式查询结果缓存
enabled: true # 启用缓存
max_size_mb: 100 # 最大缓存容量 100MB
# 运行时限制配置
limits_config:
metric_aggregation_enabled: true # 启用指标聚合
allow_structured_metadata: true # 允许结构化元数据
volume_enabled: true # 启用日志体积统计
retention_period: 720h # 日志保留周期(30天)
# 存储架构配置
schema_config:
configs:
- from: 2020-10-24 # 配置生效起始时间
store: tsdb # 使用 TSDB 存储引擎(v2.4+)
object_store: filesystem # 对象存储类型(本地文件系统)
schema: v13 # 架构版本
index:
prefix: index_ # 索引文件前缀
period: 24h # 索引分片周期
# 模式分析模块
pattern_ingester:
enabled: true # 启用日志模式分析功能
metric_aggregation:
loki_address: localhost:3100 # 指标聚合服务地址
# 告警规则引擎
ruler:
enable_alertmanager_discovery: true # 自动发现 Alertmanager
enable_api: true # 启用规则管理 API
# 查询前端配置
frontend:
encoding: protobuf # 查询结果使用 Protobuf 编码
# 压缩与清理
compactor:
working_directory: /home/loki/data/retention # 清理工作目录
delete_request_store: filesystem # 删除请求存储方式
retention_enabled: true # 启用自动数据清理docker-compose.yml
text
docker-compose.ymlyaml
services:
alloy:
image: grafana/alloy:v1.7.5
ports:
- 12345:12345
- 4317:4317
- 4318:4318
volumes:
- ./alloy-data:/var/lib/alloy/data
- ./config.alloy:/etc/alloy/config.alloy
- /usr/local/app/logs:/usr/local/app/logs # 宿主机要监听的日志挂载到alloy容器中
command: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy
depends_on:
- loki
networks:
- loki
loki:
image: grafana/loki:3.4.2
ports:
- "3100:3100"
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml
# 挂载loki数据
- ./loki-data:/home/loki/data
command: -config.file=/etc/loki/local-config.yaml
privileged: true
networks:
- loki
grafana:
image: grafana/grafana:11.6.0
environment:
# 允许匿名访问并设置管理员权限
# - GF_FEATURE_TOGGLES_ENABLE=grafanaManagedRecordingRules
# - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
# - GF_AUTH_ANONYMOUS_ENABLED=true
# - GF_AUTH_BASIC_ENABLED=false
# 设置grafana的管理员账号和密码
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=YourStrongPassword123!
- GF_AUTH_ANONYMOUS_ENABLED=false # 禁用匿名访问
ports:
- 3000:3000/tcp
volumes:
- ./grafana.ini:/etc/grafana/grafana.ini
- ./grafana-data:/var/lib/grafana
entrypoint:
- sh
- -euc
- |
mkdir -p /etc/grafana/provisioning/datasources
cat <<EOF > /etc/grafana/provisioning/datasources/ds.yaml
apiVersion: 1
datasources:
- name: Loki
type: loki
access: proxy
orgId: 1
url: 'http://loki:3100'
basicAuth: false
isDefault: true
version: 1
editable: true
EOF
/run.sh
networks:
- loki
networks:
loki:注意事项
- 提前创建alloy-data、loki-data、grafana-data目录并赋予777权限
启动服务
bash
docker-compose up -d访问grafana
http://localhost:3000 - Explore -> 选择数据源 -> Label browser -> 输入 app=crm -> 点击 Run query
即可查看到日志信息