如何在Azure Log Analytics Workspace按文件解析Coldfusion日志
ACI部署ColdFusion 2021按日志文件维度拆分到Log Analytics的落地方案
前置修正:给stdout日志打来源标记
你当前直接用symlink把日志指向stdout的方式存在核心缺陷:软链转发的日志流不会携带任何来源文件的元信息,不同文件的日志完全混合后,Log Analytics侧没有任何依据判断日志来自哪个文件。
先替换容器启动脚本里的软链逻辑,改用带前缀标记的tail转发,示例脚本片段:
# 清空原有直接指向stdout的日志软链 rm -f /opt/coldfusion2021/logs/*.log /dev/stdout 2>/dev/null # 遍历所有CF日志文件,转发时给每条日志头部加固定格式的来源标记 for log_path in /opt/coldfusion2021/logs/*.log /your/custom/log/path/*.log; do [ -f "$log_path" ] || continue log_name=$(basename "$log_path") # 给每条日志加[CF_LOG:文件名]前缀,转发到主进程stdout tail -F -n 0 "$log_path" | awk -v logname="$log_name" '{print "[CF_LOG:" logname "] " $0}' >> /proc/1/fd/1 & done # 后面接原有ColdFusion启动命令,例如: /opt/coldfusion2021/cfusion/bin/coldfusion run
这里用tail -F可以自动跟踪CF滚动切割生成的新日志文件,不需要额外配置重载。如果需要上报容器启动前已经存在的历史日志,把-n 0改成-n +1即可。
确认ACI日志采集链路正常
- 进入你的ACI容器组配置页,确认「监控」板块下已经正确关联目标Log Analytics工作区,日志驱动为
azure-monitor - 配置生效后,容器stdout/stderr的输出会默认上报到Log Analytics,默认采集的表分两种:
- 未开启Container Insights时,日志存在
ContainerInstanceLog_CL表,日志内容字段为Message - 开启ContainerLogV2/Container Insights时,日志存在
ContainerLogV2表,日志内容字段为LogMessage
- 未开启Container Insights时,日志存在
Log Analytics侧按来源解析日志
日志正常上报后,用KQL查询提取标记位的文件名,即可实现按日志来源文件维度的筛选、统计。
针对ContainerInstanceLog_CL表的查询示例
ContainerInstanceLog_CL // 替换成你自己的ACI容器组名称 | where ContainerGroup_s == "your-cf-aci-group-name" // 解析前缀提取日志来源、真实日志内容 | parse Message with * "[CF_LOG:" LogSource "] " RawContent // 过滤掉容器启动、系统层面的非CF业务日志 | where isnotempty(LogSource) | project TimeGenerated, LogSource, RawContent, ContainerName_s, Computer // 示例1:查application.log里的错误日志 // | where LogSource == "application.log" and (RawContent contains "ERROR" or RawContent contains "Exception") // 示例2:按日志来源统计每小时的日志量 // | summarize HourlyLogCount = count() by bin(TimeGenerated, 1h), LogSource
针对ContainerLogV2表的查询示例
ContainerLogV2 | where ContainerGroup == "your-cf-aci-group-name" | parse LogMessage with * "[CF_LOG:" LogSource "] " RawContent | where isnotempty(LogSource) | project TimeGenerated, LogSource, RawContent, ContainerName, Computer
可选优化:配置采集时自动解析
如果不想每次查询都手动写parse逻辑,可以给对应日志表配置数据收集转换规则:
- 进入Log Analytics工作区的「表」管理页,找到你使用的日志表
- 选择「创建数据转换」,在转换逻辑的KQL语句中加入上述parse提取LogSource的步骤
- 保存规则后,新上报的日志会自动生成
LogSource独立列,后续查询可以直接筛选、聚合该字段,不需要重复写解析逻辑。
注意:如果你的ColdFusion有自定义输出路径的日志,记得把对应路径加到启动脚本的遍历列表里,避免漏打标记。
内容的提问来源于stack exchange,提问作者Souvik Saha Choudhury
相关产品推荐
相关产品推荐

