Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能
2013-09-17 14:05
495 查看
Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能
本文链接:http://codingstandards.iteye.com/blog/803686 (转载请注明出处)
问题描述
在开发Java应用程序时,我们经常使用log4j作为日志输出工具,它可以根据配置文件来决定生成日志文件的策略,比如可以配置成每小时生成一个日志文件(附件压缩包里有log4j.properties的样本)。我们可以用tail -f logfile的形式去实时跟踪日志,以方便观察程序运行的信息。但是在log4j配置成每隔一定时间生成文件时,当时间间隔到达时,原来的日志文件会根据一定规则进行改名,比如ADMIN.LOG改成ADMIN.2010-11-05-10的格式,然后log4j会重新创建一个新的日志文件。这个时候,就会发现正在运行的tail-f命令不会继续输出新的日志文件内容,而是停在那里不动了,需要Ctrl+C杀掉原来的,再重新运行。能不能通过某种方式来避免这种情况发生呢?
解决思路
Linux系统下每个文件都有一个称为inode的数值,相当于文件的ID,在重新创建文件时,系统会新分配一个inode给这个文件,因此我们可以根据文件的inode是否改变来判断是否有新的日志文件生成。我根据这一点编写了一个bash脚本ftail.sh来做到了原来tail -f无法做到的事情,见后面的脚本内容部分,里面有注释。
使用方式
下 载附件ftail.tar.gz,上传到Linux系统,然后执行tar zxf ftail.tar.gz,就可以看到ftail.sh了。格式:ftail.sh <file>
[root@web web_server]# ./ftail.sh
+-------------------------------------------------------------------------------------------------------+
| ftail.sh v0.1 - a bash script that enhanced 'tail -f', written by codingstandards@gmail.com |
+-------------------------------------------------------------------------------------------------------+
usage: ./ftail.sh <file>
[root@web web_server]# ./ftail.sh log/ADMIN.LOG
+-------------------------------------------------------------------------------------------------------+
| ftail.sh v0.1 - a bash script that enhanced 'tail -f', written by codingstandards@gmail.com |
+-------------------------------------------------------------------------------------------------------+
##### ./ftail.sh: FILE log/ADMIN.LOG INODE=118259971 PID 11495 #####
此处省略了日志输出的具体内容。
提示:可以把ftail.sh复制到/usr/bin下,然后就可以在任何有日志的目录进行使用了。
[root@web web_server]# cp ftail.sh /usr/bin -af
cp:是否覆盖“/usr/bin/ftail.sh”? y
[root@web web_server]# ftail.sh log/ADMIN.LOG
+---------------------------------------------------------------------------------------------+
| ftail.sh v0.1 - a bash script that enhanced 'tail -f', written by codingstandards@gmail.com |
+---------------------------------------------------------------------------------------------+
##### /usr/bin/ftail.sh: FILE log/ADMIN.LOG INODE=118259971 PID 11973 #####
此处省略了日志输出的具体内容。
脚本内容
附件压缩包中的ftail.sh文件Bash代码
#!/bin/sh
# ftail.sh = tail -f 的增强版本,可检查文件是否重建过或删除过
# usage: ftail.sh <file>
# author: codingstandards@gmail.com
# release time: v0.1 2010.11.04/05
# 显示title
echo "+---------------------------------------------------------------------------------------------+"
echo "| ftail.sh v0.1 - a bash script that enhanced 'tail -f', written by codingstandards@gmail.com |" >&2
echo "+---------------------------------------------------------------------------------------------+"
echo
# 判断参数个数
if [ "$#" != "1" ]; then
echo "usage: $0 <file>" >&2
exit 1
fi
# 取文件参数
FILE="$1"
# 取文件的inode
INODE=$(stat -c "%i" "$FILE")
# 启动tail -f进程,并打印信息
# usage: fork_tail
fork_tail()
{
if [ -r "$FILE" ]; then
tail -f "$FILE" &
PID=$!
echo "##### $0: FILE $FILE INODE=$INODE PID $PID #####" >&2
else
PID=
INODE=
echo "##### $0: FILE $FILE NOT FOUND #####" >&2
fi
}
# 杀掉tail进程
# usage: kill_tail
kill_tail()
{
if [ "$PID" ]; then
kill $PID
fi
}
# 检查inode是否变化了
# usage: inode_changed
inode_changed()
{
NEW_INODE=$(stat -c "%i" "$FILE" 2>/dev/null)
if [ "$INODE" == "$NEW_INODE" ]; then
return 1
else
INODE=$NEW_INODE
fi
}
# 设置陷阱,按Ctrl+C终止或者退出时杀掉tail进程
trap "kill_tail; exit" SIGINT SIGTERM SIGQUIT EXIT
# 首次启动tail -f进程
fork_tail
# 每隔一定时间检查文件的inode是否变化,如果变化就先杀掉原来的tail进程,重新启动tail进程
while :
do
sleep 5
if inode_changed; then
kill_tail
fork_tail
fi
done
# END.
相关文章推荐
- 我使用过的Linux命令之tailf - 跟踪日志文件/更好的tail -f版本
- linux下c语言实现tail -f功能---实时读取变化文件中的增量内容
- tail -f 实时查看日志文件
- Linux查看日志文件命令tail
- .LOG4J的配置(输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能)
- linux tail 过滤日志文件中的关键字
- Linux删除日志文件和清除日志文件脚本
- linux查看日志文件内容命令tail、cat、tac、head、echo
- /var/log目录下的20个Linux日志文件功能详解
- /var/log目录下的20个Linux日志文件功能详解
- linux 下日志文件操作的基本命令(tail,grep)
- Java中获取Log4j日志文件,Mybatis 的ScriptRunner执行带pl/sql的 代码块脚本
- /var/log目录下的20个Linux日志文件功能详解
- /var/log目录下的20个Linux日志文件功能详解
- linux tail 过滤日志文件中的关键字
- linux tail 过滤日志文件中的关键字
- 每天一个linux命令(15):tail 命令,实时打印TOMCAT日志
- 【Linux】使用SHELL脚本实时查看文件大小
- tail日志跟踪功能实现
- 实时查看日志文件 tail -f gallerylogs.log