汇知百科
白蓝主题五 · 清爽阅读
首页  > 故障排查

Ruby on Rails日志查看:快速定位线上问题的实用技巧

ref="/tag/415/" style="color:#2B406D;font-weight:bold;">日志文件在哪里

Ruby on Rails 应用默认会把日志写在 log/ 目录下,按环境区分。开发时主要看 development.log,部署后生产环境对应的是 production.log。进入项目根目录,直接用 tail 命令就能实时查看:

tail -f log/development.log

如果服务器上查生产日志,可能得加上权限:

sudo tail -f log/production.log

看懂常见的日志格式

打开日志文件,你会看到类似这样的内容:

Started GET "/users/1" for 127.0.0.1 at 2024-03-15 10:23:45 +0800
Processing by UsersController#show as HTML
  Parameters: {"id"=>"1"}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
Completed 200 OK in 12ms (Views: 8.7ms | ActiveRecord: 0.5ms)

每一行都有线索。比如 Started GET 表示请求开始,Parameters 显示了用户传了什么参数,ActiveRecord 那行是数据库查询语句,最后的 Completed 200 是响应状态。如果这里变成 500,说明出错了。

重点关注错误和异常

当页面打不开或接口报错时,先搜日志里的 FATALERROR 关键字:

grep ERROR log/production.log

常见错误比如找不到模板、数据库连接失败、参数未定义等。例如看到:

NoMethodError (undefined method `name' for nil:NilClass):

基本可以断定是某个地方试图调用一个空对象的 name 方法,回代码里检查对应控制器逻辑就行。

调整日志级别方便调试

默认的日志级别是 info,有些细节看不到。想看更详细的信息,比如每个 SQL 查询,可以在 config/environments/development.rb 里临时调成 debug

config.log_level = :debug

改完重启服务,日志就会多出缓存读取、HTTP 头信息等内容,适合排查复杂问题。但别忘了上线前改回,不然日志文件会膨胀得很快。

利用工具提升效率

如果日志太多,手动翻太费劲,可以用 less 配合搜索:

less log/production.log
# 按 / 键输入关键词,比如 /ERROR 回车,快速跳转

或者用 rbtrace 这类工具动态追踪运行中的 Rails 进程,不过日常还是靠日志最直接。另外,线上系统建议接入 Lograge 精简日志输出,把每条请求压成一行,配合 ELK 收集分析更省心。

模拟一次排查过程

假设用户反馈点进个人主页就崩溃。你登上服务器,执行:

tail -f log/production.log

然后自己访问一次该页面,日志立刻刷出:

Completed 500 Internal Server Error in 43ms
NoMethodError (undefined method `title' for nil:NilClass)
  app/views/users/show.html.erb:12

错误定位到视图文件第 12 行,去看代码发现是 <%= @post.title %>,但没判断 @post 是否存在。补个判空,问题解决。