0

curl -w输出到文件方法:把请求耗时、状态码保存到日志的完整实战

2026.06.01 | youres | 29次围观

目录

  • 为什么要把 curl -w 的输出写到文件?
  • 方法一:直接重定向(最简单)
  • 方法二:用 -w @模板文件 实现复杂输出
  • 方法三:同时保存响应体和 -w 数据
  • 方法四:追加模式写日志(推荐生产使用)
  • 实战:把每次 curl 请求的耗时写入日志文件
  • 常见问题排查

为什么要把 curl -w 的输出写到文件?

curl 的 -w(或 --write-out)参数可以在请求完成后,把一些变量的值打印出来。默认是打印到标准输出(终端)。但在实际工作中,我们往往希望把这些数据保存下来,比如:

  • 每次接口调用的耗时,写进日志文件,方便后续分析
  • 把 HTTP 状态码、总耗时、DNS 解析时间一起保存,做性能监控
  • 批量测试多个网址,把结果输出到文件,事后统一分析

这篇文章讲清楚四种把 curl -w 输出写到文件的方法,每种都配实战例子,直接能用在自己的脚本里。

方法一:直接重定向(最简单)

这是最基础的做法,利用 Shell 的重定向符号 >>> 把输出写到文件。

# 把 -w 的输出写到 time.log(覆盖模式)
curl -s -o /dev/null -w "状态码: %{http_code}, 总耗时: %{time_total}s\n" https://www.youres.cn > time.log
# 查看结果
cat time.log

说明:

  • -s:静默模式,不显示进度条
  • -o /dev/null:把响应体丢到 /dev/null,只看 -w 的输出
  • > time.log:把标准输出重定向到文件

Windows PowerShell 用户注意,没有 /dev/null,用 $null

# PowerShell 写法
curl -s -o $null -w "状态码: %{http_code}, 总耗时: %{time_total}s`n" https://www.youres.cn | Out-File -Encoding UTF8 time.log

方法二:用 -w @模板文件 实现复杂输出

如果输出格式比较复杂(比如要写多行、包含很多变量),直接写在命令行里很难维护。curl 支持从文件读取 -w 模板

先创建一个模板文件 curl-format.txt

    HTTP状态码:  %{http_code}
    总耗时:      %{time_total}s
    DNS解析:    %{time_namelookup}s
    连接时间:   %{time_connect}s
    首字节时间: %{time_starttransfer}s
    下载速度:   %{speed_download} bytes/s
    目标URL:    %{url_effective}

然后用 -w @文件名 来引用这个模板:

# Linux / macOS
curl -s -o /dev/null -w "@curl-format.txt" https://www.youres.cn > result.txt
# Windows PowerShell
curl -s -o $null -w "@curl-format.txt" https://www.youres.cn | Out-File -Encoding UTF8 result.txt

这种方式的优点:

  • 格式清晰,易维护
  • 可以在模板里写多行,输出结构化的报告
  • 多个脚本可以共用同一个模板文件

方法三:同时保存响应体和 -w 数据

有时候我们既想要响应体,又想要 -w 的输出数据,还都想保存到文件。问题在于:-w 的输出和响应体都会写到标准输出,混在一起就乱了。

解决办法:用 -o 把响应体写到文件,用重定向把 -w 输出写到另一个文件。

# 响应体保存到 response.json,-w 的输出保存到 stats.log
curl -s -o response.json -w "状态码: %{http_code}, 耗时: %{time_total}s\n" https://www.youres.cn > stats.log
# 查看两个文件
echo "=== 响应体 ==="; cat response.json
echo "=== 性能数据 ==="; cat stats.log

或者用 tee 命令,一边显示一边保存:

curl -s -o response.json -w "状态码: %{http_code}, 耗时: %{time_total}s\n" https://www.youres.cn | tee stats.log

方法四:追加模式写日志(推荐生产使用)

如果用 >,每次都会覆盖文件。做性能监控时,我们更希望每次追加一条记录,形成完整的日志。

# 每次追加一行到 curl.log(覆盖用 >,追加用 >>)
curl -s -o /dev/null -w "[%{time_total}s] %{http_code} https://www.youres.cn\n" https://www.youres.cn >> curl.log
# 多跑几次,看看日志效果
curl -s -o /dev/null -w "[%{time_total}s] %{http_code} https://www.youres.cn\n" https://www.youres.cn >> curl.log
curl -s -o /dev/null -w "[%{time_total}s] %{http_code} https://www.youres.cn\n" https://www.youres.cn >> curl.log
# 查看日志
cat curl.log

输出效果类似:

[0.045s] 200 https://www.youres.cn
[0.052s] 200 https://www.youres.cn
[0.048s] 200 https://www.youres.cn

实战:把每次 curl 请求的耗时写入日志文件

下面是一个完整的实战脚本,每次调用接口都把性能数据追加到日志,带时间戳:

#!/bin/bash
# curl-perf-logger.sh
URL="https://www.youres.cn"
LOG_FILE="curl-perf.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")
# 执行请求,把性能数据追加到日志
curl -s -o /dev/null \
  -w "[$DATE] HTTP=%{http_code} TOTAL=%{time_total}s DNS=%{time_namelookup}s CONNECT=%{time_connect}s\n" \
  "$URL" >> "$LOG_FILE"
echo "结果已写入 $LOG_FILE"
tail -3 "$LOG_FILE"

Windows PowerShell 版本:

# curl-perf-logger.ps1
$URL = "https://www.youres.cn"
$LOG_FILE = "curl-perf.log"
$DATE = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
# 执行请求
$result = curl -s -o $null `
  -w "HTTP=%{http_code} TOTAL=%{time_total}s DNS=%{time_namelookup}s`n" `
  $URL
# 写入日志(追加)
"[$DATE] $result" | Out-File -Encoding UTF8 -Append $LOG_FILE
Write-Host "结果已写入 $LOG_FILE"

常见问题排查

问题一:-w 的输出和响应体混在一起了

原因:没有用 -o 把响应体分离出去,两者都打到标准输出。

解决:加上 -o 文件名-o /dev/null(Linux)/-o $null(PowerShell)。

问题二:PowerShell 里 `n 不换行

原因:PowerShell 的双引号字符串里,换行符是 `n(反引号 n),不是 \n

解决:\n 改成 `n

问题三:重定向后用 -w @文件 不生效

原因:模板文件的路径不对,或者文件编码有问题(Windows 下不要用 UTF-8 BOM)。

解决:用绝对路径指定模板文件,确保文件是 UTF-8 无 BOM 编码。

问题四:追加日志时,每次都有重复数据

原因:脚本里用了 >(覆盖)而不是 >>(追加)。

解决:确认用的是 >> 追加符号。


推荐继续阅读:

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论