应禁用静态资源日志以减少日志量,可通过设置 log level error 配合 not path 匹配排除 js/css/图片等后缀,或仅在 api 路由块中启用日志。

FrankenPHP 默认会把所有请求(包括 JS、CSS、图片等静态资源)记进 access.log,日志量可能占总量 70% 以上。这不是 bug,是 Caddy 的默认行为——但完全没必要全量记录。
为什么静态资源日志要单独控制
Caddy 的 log 指令默认不区分请求类型,GET /js/app.js 和 POST /api/login 在日志里地位相同。而静态资源通常:无业务价值、高频访问、格式固定、可缓存。全量记录只会撑大日志体积、拖慢磁盘 I/O、干扰错误排查。
- 常见现象:
access.log单日增长超 500MB,其中 85% 是200状态的.png、.woff2请求 - 真实需求:只记录非 200 响应(如 404、500)、或只记录动态路由(
/api/、/admin/) - 关键限制:Caddy 的
log不支持按文件后缀过滤,只能靠路径匹配或状态码拦截
用 matchers + level error 实现最小化日志
最轻量、最可靠的做法是把日志级别设为 error,并配合路径 matcher 排除已知静态路径——这样只有出错的静态请求(比如漏传文件、权限问题)才会被记录。
- 在 Caddyfile 的
log块中显式指定level error,而非默认的info - 添加
match条件,只对非静态路径启用日志,例如:log { output file /var/log/frankenphp/access.log level error match { not path *.js *.css *.png *.jpg *.gif *.ico *.woff2 *.svg not path /favicon.ico } } - 注意:
match必须写在log块内,且not path支持 glob,但不支持正则;路径匹配基于request.uri,不是文件系统路径
彻底禁用静态资源日志(推荐用于 CDN 回源场景)
如果你用 Cloudflare 或 Nginx 做前置 CDN,静态资源根本不会打到 FrankenPHP,那连 error 级都不用记——直接让 Caddy 跳过日志逻辑。
- 删掉全局
{ log }块,改用条件式日志:只在需要监控的路由块里加log - 例如,仅对 API 路径记录:
route /api/* { log { output file /var/log/frankenphp/api.log level info } php { ... } } - 确保静态资源路由(如
route *.js)块里**不包含任何log指令**——Caddy 就不会为它生成日志条目 - 验证方式:发起一个
curl -I /css/app.css,检查access.log是否无新增;再触发一个curl http://localhost/nonexistent.js,确认 404 也不出现(因为没配 log)
最容易被忽略的是:Caddy 的 log 是“按路由块生效”,不是“按请求路径自动识别”。你写了 log,它就记;你没写,它就不记——和 Nginx 的 access_log off 逻辑不同,这里没有“关闭”动作,只有“不启用”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











