`

Linux下实时跟踪log4j日志文件的bash脚本 - 增强了tail -f的功能

阅读更多

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文件

#!/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.

 

1
2
分享到:
评论
1 楼 jiedushi 2016-09-27  
tail -F 就可以吧

相关推荐

    Advanced Bash-Scripting Guide <>

    cleanup:一个增强的和广义的删除logfile 的脚本 3-1. 代码块和I/O 重定向 3-2. 将一个代码块的结果保存到文件 3-3. 在后台运行一个循环 3-4. 备份最后一天所有修改的文件. 4-1. 变量赋值和替换 4-2. 一般的变量赋值...

    一个简单的linux命令 tail

    `tail` 是 Linux 系统中一个非常实用的命令,它允许用户查看文件的尾部内容,尤其适用于监控日志文件的实时变化。这个命令对于系统管理员来说是日常工作中不可或缺的工具,因为它可以帮助快速定位问题或跟踪系统的...

    让cmd拥有Linux的tail功能

    在Linux环境中,可以使用`tail -f`命令实时监控日志文件,比如监控`syslog`: ```bash tail -f /var/log/syslog ``` 当`syslog`文件有新的日志记录添加时,`tail`会立即显示出来。 ### 源码分析 虽然未提供源码,...

    Liunx系统定时删除任务,定时清理日志,定时清理任务

    `crontab`是Linux下的一个计划任务调度命令,它允许用户定义周期性的任务。每个Linux用户都可以有自己的crontab配置,系统级的任务则存储在`/etc/crontab`文件中。 要使用`crontab`,首先需要打开终端并输入`...

    Linux高级bash编程

    高级Bash脚本编程指南(一) 目录 ++++ 第一部分. 热身 1. 为什么使用shell编程 2. 带着一个Sha-Bang出发(Sha-Bang指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和...

    Linux下面日志代码

    - **bash脚本**:通过编写简单的bash脚本,可以实现对日志文件的读取、筛选、统计等功能。 - **awk和sed**:这两个强大的文本处理工具可以用来解析日志格式,提取关键信息。 5. **日志分析和监控** - **grep、...

    RHEL6之6:linux命令、bash、shell脚本、sudo、gpg应用、RPM包签名校验

    ### RHEL6之6:Linux命令、Bash、Shell脚本、Sudo、GPG应用、RPM包签名校验 #### 常见的文件操作命令 在Red Hat Enterprise Linux 6 (RHEL6)中,掌握常用的文件操作命令对于高效管理文件系统至关重要。 ##### 1. ...

    oracle数据库日志查看方法

    例如,在安装目录`oracle\admin\SID_name\bdump`下可以找到形如`*.log`的日志文件。 #### 四、查看Alert日志 Alert日志文件包含了数据库的重要警告信息,同样非常重要。可以使用如下命令来查找其位置: ```sql ...

    Linux jar包启动脚本start.sh

    本文将深入探讨如何创建和理解`start.sh`启动脚本,以及与其相关的`log.sh`日志管理脚本。 **一、start.sh脚本** `start.sh`脚本通常包含以下关键部分: 1. **设置环境变量**:这包括JAVA_HOME(Java安装目录)、...

    解决nohup执行python程序log文件写入不及时的问题

    这时可以使用`tail -f`命令来实现实时追踪日志文件的输出。 - 命令示例: ```bash tail -f test.log ``` - 如果希望同时显示日志文件的行号,可以使用`tail -n +1 -f`命令: ```bash tail -n +1 -f test....

    Linux系统上web服务器管理命令

    - **查看命令**: 在`/usr/tomcat/logs`目录下,使用`tail -f &lt;文件名&gt;`命令实时查看Tomcat的日志文件。 - **示例**: ```bash cd /usr/tomcat/logs tail -f catalina.out ``` ##### 3.5 进入Tomcat工程目录 - ...

    linux 6.x 安装elasticsearch 5.x指引

    tail -f logs/elasticsearch.log ``` #### 安全注意事项 - Elasticsearch 不建议在 root 用户下运行,因为其具有执行脚本的能力,可能会导致安全问题。 - 解决方案: 1. 创建一个专用的 Elasticsearch 用户组和...

    oracle日志学习

    - **位置**:通常情况下,Alert 日志文件位于 `$ORACLE_BASE/admin/orasid/bdump/alert_orasid.log` 目录下。 - **格式**:Alert 日志文件主要记录了数据库实例运行过程中的重要事件,如启动、关闭、异常情况等。...

    linuxshell面试题

    - 使用 `tail -f` 命令实时跟踪日志文件的变化。 - 通过正则表达式匹配关键字。 - 利用 `mail` 命令发送警报邮件。 #### 示例 3: 自动化部署脚本 - **需求**: 开发一个自动化部署脚本,实现软件包的下载、编译、...

    实用的shell脚本,linux相关资源

    Shell脚本是利用Shell的命令解释功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来解释...

    Linux命令大全-终极版

    - `less /var/log/*`:查看各种系统日志文件。 - `journalctl`:在Systemd系统中查看和分析日志。 10. **文件系统操作**: - `mount`/`umount`:挂载和卸载文件系统。 - `fsck`:检查并修复文件系统的错误。 -...

    BASH-log_nginx:httpd 日志的简单解析器(nginxapache)

    标题 "BASH-log_nginx:httpd 日志的简单解析器(nginxapache)" ...如果你需要更详细的帮助,比如如何使用这个脚本或者编写类似脚本,可以提供更多的信息,或者查阅 `BASH-log_nginx-master` 目录下的具体文件内容。

    第2章、Linux基础命令_linux_

    - `/var/log`目录下包含各种系统日志文件,如`/var/log/messages`。 10. 脚本编程: - `bash`:默认的shell,支持编写脚本自动化任务。 - `#!/bin/bash`:在脚本顶部指定解释器。 以上是Linux基础命令的主要...

    linux常用命令全集

    Linux操作系统是开源、免费的Unix-like系统,广泛应用于服务器、嵌入式设备和桌面环境。了解并熟练掌握Linux常用命令是每一个系统管理员或开发者必备的技能。本资料"Linux常用命令全集"全面覆盖了Linux基础操作的...

    linux上通过sh方式启动java jar程序并做为守护进程

    7. 最后的`tail -f`命令用于实时查看应用的日志输出,但这不是必需的,可以根据实际需求决定是否保留。 为了使脚本可执行,你需要使用`chmod`命令赋予它执行权限: ```bash chmod +x test.sh ``` 然后,你可以...

Global site tag (gtag.js) - Google Analytics