Alternative for "tail -f" that follows filename
I have some logs being generated using a timed rotating file logger. This logs to a file called tool.log
, and at midnight, moves this to tool.log.<date>
and starts a new tool.log
.
I have a tail -f tool.log
running on the machine to keep an eye on the logs, but at midnight, when tool.log
is renamed to tool.log.<date>
, tail
continues to watch the renamed file.
What I'm hoping for is a tool that is similar to tail
, but will continue to monitor the file named tool.log
, rather than following the inode.
Does something like this exist? If not, I can write my own in Python for this purpose.
Solution 1:
Some implementations of tail
have an option for this; here's the description from the man page for GNU tail:
-F
same as--follow=name --retry
-f
,--follow
[=
{name|descriptor}]
output appended data as the file grows;-f
,--follow
, and--follow=descriptor
are equivalent
--retry
keep trying to open a file even when it is or becomes inaccessible; useful when following by name, i.e., with--follow=name
As this option isn't specified by POSIX, you can't depend on it everywhere. Some known implementations:
-
GNU - has
-F
as described above -
Mac OS X, FreeBSD and NetBSD - have a similar
-F
option with the same effect -
OpenBSD -
-f
is enough (if the file is replaced (i.e., the inode number changes), tail will reopen the file and continue) - Solaris - no equivalent
-
Busybox -
-F
is available in recent versions, but must be compiled withENABLE_FEATURE_FANCY_TAIL
(it's not compiled-in by default)
Solution 2:
Alternative is tail -F
command.
The -F
option implies --follow=name
with --retry
option, so tail is watching your file even if it has been deleted and created again.
Solution 3:
Since you have asked for alternative:
The less
utility could be an alternative for tail -F
.
It will have to be run as follows: less --follow-name filename.log
and press Shift + F.
This will give you same results as tail -F
.
Solution 4:
Another alternative would be to use the watch
command, which will repeat any command every n seconds, every 2 seconds in this example:
watch -n2 "tail tool.log"
Use Ctrl+C to quit the command when you're finished viewing the log.