So, I’ve learned a lot more than I wanted to about heroku drains. These are sinks to which heroku applications can write. After the logs are out of heroku, you analyze these logs just as you would in any other application living outside of a PaaS. Logs are very useful to see long term trends, debug, etc. (I’ve worked both on a rails3 app and a java spring/camel app that are deploying to heroku.)
Here are some things I’ve learned:
- Heroku drains are well documented.
- You want definitely want them for any production application, because only 1500 lines of heroku logs are retained at any one time.
- They can go to either syslog (great for applications with a lot of other infrastructure) or https (great for applications without as much infrastructure support).
- They can’t do any kind of authorization.
- You can’t know what ip address the logs are coming from, so you can’t limit access by IP.
- There are third party extensions you can pay for to avoid dealing with drains at all (I’ve heard good things about papertrail.)
- You can use logstash to pull heroku logs from a syslog drain into elastic search.
- There are numerous github projects that can drain to databases, etc. There’s even one that, with echos of Ouroboros, drains to another heroku app.
- Drains have intelligent behavior if your listener (or listeners) fails. From heroku support: “The short answer is yes, the drain will drop logs when the sink is not responsive, but this isn’t really the full story. There are a number of undocumented limits and backoff retries that happen when a drain connection is lost.” And then they go on to explain how the backoff behaviour happens. I’m not going to cut and paste their entire answer because I assume it is undocumented for a reason (maybe it changes, maybe they don’t want to commit to supporting this behavior). Ask them yourself 🙂
- A simple drain can be as easy as
<?php error_log(file_get_contents('php://input'), 3, "/var/log/logfile.log"); ?>, but make sure you rotate that log file.
- You can use puppet to manage drains if you are bringing servers up and down, using the heroku toolbelt and CLI authentication.
If you are deploying anything beyond a toy app on heroku, don’t forget the ops folks and make sure you set up your drain!