As a software developer, I cannot avoid log files. Application servers and LAMP machines are always around the corner waiting for me, so I must accept log files and do my best.
There are two kinds of log files I work with:
- static: the server wrote the content and never touched the file again
- dynamic: the server keeps appending content as the monitored process continues
The log files could be on my hard disk or located on a remote machine. During my workflow, a “remote machine” can also be a Docker container.
I leave the math to you, but it should be clear that different combinations arise. Luckily, with Emacs everything goes smoothly and I can move seamlessly across any scenario.
When it comes to static files there are no surprises. If the log file is local,
inspecting it with
counsel-grep-or-swiper is pretty much all I need. Since
I rarely need to modify a log file, I usually enable
C-x C-q to prevent accidental edits. For a remote static file, the
same easily applies thanks to TRAMP.
Things get more interesting with dynamic logs. On local files, with
auto-revert-mode I can see the changes in the buffer as soon as the underlying
file changes. If I want something fancier,
auto-revert-tail-mode behaves like
the good old
tail -f. Dynamic remote logs, however, require a different
auto-revert-mode is not enough, I also need to set
t for the desired behaviour.
What if years of
tail -f made you totally indifferent to such niceties? You
can follow Michael Albinus
suggestion and use
dired-do-shell-command in Dired.
Actually, you can even improve a little on his tip. Leave the ending
and go straight with
dired-do-async-shell-command which in Dired is aptly
bound to &. Refer to the manual for further details: Shell Commands