如何查看所有日志

559
我在Heroku上有一个小应用程序。每当我想查看日志时,我会进入命令行并执行。
heroku logs

那只给我显示了大约100行。在Heroku上没有办法看到我们应用的完整日志吗?
22个回答

910

更新(感谢dawmail333):

heroku logs -n 1500

或者,实时跟踪日志
heroku logs -t 

Heroku日志文档

如果你需要超过几千行的日志,可以使用heroku的Syslog Drains

另外一种方法(旧方法):

$ heroku run rails c
File.open('log/production.log', 'r').each_line { |line| puts line }

5
这个现在在cedar stack上无法运行。有人找到了新的替代方案吗? - nathanvda
2
只需使用 heroku logs -n 1500 命令,这是Cedar上可用的最佳方法。如果您需要更多行,请使用syslog drain:https://devcenter.heroku.com/articles/logging#syslog_drains - Liam Dawson
实际上是 heroku run rails c。已更新! - glebm
3
为什么在旧方法中你会运行一个 Rails console 而不是只运行 heroku run cat log/production.log 呢? - Chloe
我认为旧版的Heroku可能有一个可以运行的白名单,但是我已经记不清了 :) - glebm
显示剩余4条评论

150

Heroku的日志记录得到了极大的改进!

$ heroku logs -n 500
更好!
$ heroku logs --tail

参考文献:http://devcenter.heroku.com/articles/logging

更新:

这些不再是插件,而是默认功能的一部分:)


6
另外,-n 可以增加到1500,我猜想 Heroku 会在此之后将其截断。 - Liam Dawson

55

Heroku将日志视为按时间排序的事件流。在这种环境中,不建议访问文件系统上的*.log文件,原因有很多。

首先,如果您的应用程序有多个dyno,则每个日志文件仅代表您的应用程序事件的部分视图。您需要手动聚合所有文件才能获得完整的视图。

其次,Heroku上的文件系统是暂时性的,这意味着每当您的dyno重新启动或移动(大约一天一次),日志文件就会丢失。因此,您最多只能查看该单个dyno的日志一天的视图。

最后,在运行heroku console甚至heroku run bashCedar stack上,您不会连接到当前正在运行的dyno。它会为bash命令专门生成一个新的进程,这被称为one-off process。因此,您将无法在为heroku run生成的进程中找到运行实际http进程的其他dynos的日志文件。 Logging和可见性是Heroku上的一等公民,并且有几个工具来解决这些问题。首先,要查看跨应用程序/堆栈的所有dynos和所有层的应用程序事件的实时流,请使用heroku logs -t命令将输出尾随到终端。
$ heroku logs -t
2010-09-16T15:13:46-07:00 app[web.1]: Processing PostController#list (for 208.39.138.12 at 2010-09-16 15:13:46) [GET]
2010-09-16T15:13:46-07:00 app[web.1]: Rendering template within layouts/application
2010-09-16T15:13:46-07:00 heroku[router]: GET myapp.heroku.com/posts queue=0 wait=0ms service=1ms bytes=975
2010-09-16T15:13:47-07:00 app[worker.1]: 2 jobs processed at 16.6761 j/s, 0 failed ...

这对于观察应用程序的行为非常有用。如果您想将日志存储更长时间,可以使用提供日志保留、警报和触发器的众多logging add-ons之一。
最后,如果您想自己存储日志文件,可以设置自己的syslog drain来接收来自Heroku的事件流,并进行后处理/分析。
总结:不要使用heroku consoleheroku run bash查看静态日志文件。使用heroku logs或日志添加组件将日志事件流导入Heroku。

34

以上答案非常有帮助,它将帮助你从命令行查看日志。如果你想要从GUI中检查,那么你需要登录到你的Heroku账户,然后选择你的应用程序,最后点击查看日志 image


4
此方法仅在您点击“查看日志”选项后显示日志输出,并从那时起开始。因此,除非您只想基本地跟踪日志而无需进入控制台,否则这种方法没有用处。 - Jeremy Gunter
7
有没有办法在这个UI上看到所有的日志选项? - Sunil Garg
顶一下,我有和@SunilGarg一样的问题。 - Hefe

32

请参考 Heroku 日志文档

以下是查看日志的方法:

  1. logs 命令可以默认检索 100 行日志。

heroku logs

  1. 使用 --num(或 -n)选项最多可以显示 200 行日志。

heroku logs -n 200

  1. 实时显示日志。

heroku logs --tail

  1. 如果您在 Heroku 上有多个应用程序,请使用以下命令查看您想要的应用程序的日志:

heroku logs --app your_app_name


29

还可以查看单独的流/过滤器。

例如,仅查看您的应用程序日志

heroku logs --source app -t

或者只查看路由器日志

heroku logs --ps router

或将它们链接在一起。
heroku logs --source app --ps worker

So good..


7
为了仅查看我的应用程序日志,我执行以下命令:heroku logs --ps web.1(使用1个dyno)。 - Maxence

12

您可以使用Heroku的命令行界面(CLI Usage)访问日志文件。

如果已安装Heroku的CLI并且您知道应用程序名称(例如https://myapp.herokuapp.com/),则可以运行以下命令:

heroku logs --tail --app=myapp

您还可以使用以下方式实时访问日志流:

heroku logs --source app --tail --app=myapp

如果日志显示类似以下内容:

npm ERR!这次运行的完整日志可以在以下位置找到:

npm ERR!/app/.npm/_logs/2017-07-11T08_29_45_291Z-debug.log

那么您也可以通过Heroku CLI使用bash终端访问它们:

heroku run bash --app=myapp
less ./.npm/_logs/2017-07-11T08_29_45_291Z-debug.log

我收到了“/usr/bin/less:无法执行二进制文件”的错误信息。 - Michael Fulton

10

heroku logs -t可以展示我们实时的日志。


但它会在一段时间后停止。 - Neeraj Sewani

9

也许值得在你的应用程序中添加类似免费的Papertrail计划的东西。零配置,你可以获取7天的日志数据,每天最高10MB,并且可以搜索2天的日志。


8
我的解决方案是在应用程序第一次启动时获取完整日志,例如:
heroku logs -n 1500 > log

然后添加fgrep -vf以使其保持最新,如下所示:
heroku logs -n 1500 > newlog ; fgrep -vf log newlog >> log

对于持续记录,只需使用watch每隔x分钟(或秒)进行迭代即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接