How to tail -f the latest log file with a given pattern
[Edit: after a quick googling for a tool]
You might want to try out multitail - http://www.vanheusden.com/multitail/
If you want to stick with Dennis Williamson's answer (and I've +1'ed him accordingly) here are the blanks filled in for you.
In your shell, run the following script (or it's zsh equivalent, I whipped this up in bash before I saw the zsh tag):
#!/bin/bash
TARGET_DIR="some/logfiles/"
SYMLINK_FILE="SoftwareLog.latest"
SYMLINK_PATH="$TARGET_DIR/$SYMLINK_FILE"
function getLastModifiedFile {
echo $(ls -t "$TARGET_DIR" | grep -v "$SYMLINK_FILE" | head -1)
}
function getCurrentlySymlinkedFile {
if [[ -h $SYMLINK_PATH ]]
then
echo $(ls -l $SYMLINK_PATH | awk '{print $NF}')
else
echo ""
fi
}
symlinkedFile=$(getCurrentlySymlinkedFile)
while true
do
sleep 10
lastModified=$(getLastModifiedFile)
if [[ $symlinkedFile != $lastModified ]]
then
ln -nsf $lastModified $SYMLINK_PATH
symlinkedFile=$lastModified
fi
done
Background that process using the normal method (again, I don't know zsh, so it might be different)...
./updateSymlink.sh 2>&1 > /dev/null
Then tail -F $SYMLINK_PATH
so that the tail hands the changing of the symbolic link or a rotation of the file.
This is slightly convoluted, but I don't know of another way to do this with tail. If anyone else knows of a utility that handles this, then let them step forward because I'd love to see it myself too - applications like Jetty by default do logs this way and I always script up a symlinking script run on a cron to compensate for it.
[Edit: Removed an erroneous 'j' from the end of one of the lines. You also had a bad variable name "lastModifiedFile" didn't exist, the proper name that you set is "lastModified"]
How to follow (tail -f) the latest file (matching a pattern) in a directory and call as alias with parameter
tail -f "$(find . -maxdepth 1 -name "logfile*" -printf "%Ts/%f\n" | sort -n | tail -1 | cut -d/ -f2)"
Tail the result of the find command. Search for files prefixed with logfile in the current directory and print the epoch time of creation as well as the file path and name, separated by a forward slash Pipe this through to sort and then print the latest entry with tail -1 before stripping out to to leave only the file path with cut.
Do a tail -F until matching a pattern
Try this:
sh -c 'tail -n +0 -f /tmp/foo | { sed "/EOF/ q" && kill $$ ;}'
The whole command-line will exit as soon as the "EOF" string is seen in /tmp/foo
.
There is one side-effect: the tail
process will be left running (in the background) until anything is written to /tmp/foo
.
Tail -f - Show last X lines that match a pattern
grep PATTERN FILE | tail -n10; tail -f -n0 FILE | grep PATTERN;
Tail -f search file with * match and latest date time
Use
tail -f $(ls -t /var/log/impala/impalad.demo.local.impala.log.INFO.* | head -1)
instead. tail
expects a file to read from, which you obtain with ls -t /var/log/impala/impalad.demo.local.impala.log.INFO.* | head -1
. Piping follows an input | output
pattern, though, so your current scheme won't get you far. Piping the filename into tail
won't work either because tail
doesn't expect filenames from standard input. To pass a filename to tail
you must pass it as an argument.
How to tail all the log files inside a folder and subfolders?
To log all the files inside a folder, you can go to the folder and write
tail -f *.log
To add the subfolders to the tailf command, use
tail -f **/*.log
Of course, the regular expression can be improved to match only specific file names.
Bash : How to tail latest file in continuous loop
#!/bin/bash
# ^^^^ -- **NOT** /bin/sh
substring=";A database exception has occurred: FATAL DBERR: SQL_ERROR: ORA-00001: unique constraint (IX_TEST1) violated"
newest=
timeout=10 # number of seconds of no input after which to look for a newer file
# sets a global shell variable called "newest" when run
# to keep overhead down, this avoids invoking any external commands
find_newest() {
set -- "${DIR?The variable DIR is required}"/env/log/LOG*
[[ -e $1 || -L $1 ]] || return 1
newest=$1; shift
while (( $# )); do
[[ $1 -nt $newest ]] && newest=$1
shift
done
}
while :; do
find_newest # check for newer files
# if the newest file isn't the one we're already following...
if [[ $tailing_from_file != "$newest" ]]; then
exec < <(tail -f -- "$newest") # start a new copy of tail following the newer one
tailing_from_file=$newest # and record that file's name
fi
if read -t "$timeout" -r line && [[ $line = *"$substring"* ]]; then
echo "Do something here"
fi
done
Shell function to tail a log file for a specific string for a specific time
#!/bin/bash
tail -f logfile | grep 'certain_word' | read -t 1200 dummy_var
[ $? -eq 0 ] && echo 'ok' || echo 'server not up'
This reads anything written to logfile, searches for certain_word, echos ok if all is good, otherwise after waiting 1200 seconds (20 minutes) it complains.
Related Topics
Count Files and Directories Using Shell Script
Undefined Reference to Symbol 'Dlsym@@Glibc_2.4'
Can an Interrupt Handler Be Preempted
I Cannot Get a Result from a Single Line Put into the Erlang Shell
How to Redirect Nohup Output to a Specified File
Shell Script Function Return a String
Redirect Qemu Window Output to Terminal Running Qemu
Command to Insert Lines Before First Match
How to Use Sed to Change File Extensions
How to Write Full-Screen Linux Console App/Script
Linux Mail < File.Log Has Content-Type: Application/Octet-Stream (A Noname Attachment in Gmail)
Stack Resident Buffer Overflow on 64-Bit
Curl Command for Https ( Ssl )
Linux Command to Replace String in Large File with Another String
Debian 8. Failed to Load Iwlwifi
Calculate Total Used Disk Space by Files Older Than 180 Days Using Find