开发中遇到问题,先看ref="/tag/415/" style="color:#E3A3CF;font-weight:bold;">日志
做 Ruby on Rails 开发时,最常打交道的除了代码就是日志了。比如用户提交表单后页面卡住,或者接口返回 500 错误,这时候打开日志文件,往往一眼就能发现问题所在。
Rails 默认会把日志输出到 log/ 目录下,不同环境对应不同文件,最常见的就是 development.log 和 production.log。开发时直接看 log/development.log 就行。
快速定位请求
每次发起一个请求,Rails 都会在日志里记录详细信息。比如你访问 /users/123,日志会显示:
Started GET "/users/123" for 127.0.0.1 at 2024-04-05 10:20:30 +0800
Processing by UsersController#show as HTML
Parameters: {"id"=>"123"}
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 123], ["LIMIT", 1]]
Completed 200 OK in 12ms (Views: 8.1ms | ActiveRecord: 0.5ms)从这段日志能看出:请求路径、控制器动作、传入参数、数据库查询语句,以及响应时间和状态。如果这里出现异常,比如抛出 NoMethodError,错误堆栈也会紧跟着打印出来,直接告诉你哪一行代码出了问题。
调整日志级别
有时候日志太多,干扰信息太多。可以在 config/environments/development.rb 中设置日志级别:
config.log_level = :info可选值有 :debug、:info、:warn、:error、:fatal。开发时用 :debug 没问题,生产环境建议设成 :warn 或更高,避免磁盘被写满。
在日志中添加自定义信息
想追踪某个逻辑分支,可以直接在代码里写日志:
class OrdersController < ApplicationController
def create
logger.debug "创建订单,用户 ID: #{current_user.id}"
# ...
if order.save
logger.info "订单保存成功,金额: #{order.amount}"
end
end
end这样在日志里就能看到自己的标记,排查流程问题特别有用。比如发现“订单保存成功”没打出来,那问题肯定出在 save 前面。
生产环境怎么看日志
线上出问题不能直接进服务器翻文件。可以用 tail -f 实时查看:
tail -f log/production.log或者配合 grep 过滤特定请求:
grep "/api/v1/payment" log/production.log | tail -20现在很多项目跑在 Docker 或 Kubernetes 上,就得用 docker logs 或平台自带的日志系统,但本质还是读那些文本输出。
日志就像程序的行车记录仪,只要养成随手看的习惯,大部分问题都不用打断点也能快速解决。