Linux下好用的日志库,我使用過的Linux命令之tailf - 跟蹤日志文件/更好的tail -f版本...

用途說明

tailf命令幾乎等同於tail -f,嚴格說來應該與tail --follow=name更相似些。當文件改名之后它也能繼續跟蹤,特別適合於日志文件的跟蹤(follow the growth of a log file)。與tail -f不同的是,如果文件不增長,它不會去訪問磁盤文件(It is similar to tail -f but does not access the file when it is not growing.  This has the side effect of not updating the access  time for the file, so a filesystem flush does not occur periodically when no log activity is happening.)。tailf特別適合那些便攜機上跟蹤日志文件,因為它能省電,因為減少了磁盤訪問嘛(tailf  is extremely useful for monitoring log files on a laptop when logging is infrequent and the user desires that the hard disk spin down to conserve battery life.)。tailf命令不是個腳本,而是一個用C代碼編譯后的二進制執行文件,某些Linux安裝之后沒有這個命令,本文提供了怎么編譯安裝tailf命令的方法。

常用參數

格式:tailf logfile

動態跟蹤日志文件logfile,最初的時候打印文件的最后10行內容。

使用示例

示例一 使用tailf命令跟蹤日志

[root@web imx_server]# tailf log/WEB.LOG

"seq": 5710,

"clientId": 1291343201649254,

"presenceStatus": "1"

} }})

16:09:21.324 DEBUG http-80-79 hyjc.cometd.CometdServlet - { "cid": 1291343201649002, "op": "recv", "ncc0": 175}

16:09:21.444 DEBUG http-80-32 hyjc.filter.AccessCounterFilter - uri=/imx/cometd/service

16:09:21.506 DEBUG http-80-79 hyjc.filter.AccessCounterFilter - uri=/imx/cometd/service

16:09:23.239 DEBUG http-80-45 hyjc.cometd.CometdServlet - { "cid": 1291343201649184, "op": "recv", "ncc0": 55}

16:09:23.327 DEBUG http-80-45 hyjc.filter.AccessCounterFilter - uri=/imx/cometd/service

16:09:24.288 DEBUG http-80-145 hyjc.cometd.CometdServlet - { "cid": 1291283017076175, "op": "recv", "ncc0": 82}

16:09:24.339 DEBUG http-80-81 hyjc.cometd.CometdServlet - { "cid": 1291283017076151, "op": "recv", "ncc0": 142}

16:09:24.360 DEBUG http-80-64 hyjc.cometd.CometdServlet - { "cid": 1291343201649090, "op": "recv", "ncc0": 40}

16:09:24.359 DEBUG http-80-143 hyjc.cometd.CometdServlet - { "cid": 1291283017076176, "op": "recv", "ncc0": 66}

16:09:24.878 DEBUG http-80-145 hyjc.filter.AccessCounterFilter - uri=/imx/cometd/service

16:09:24.892 DEBUG http-80-143 hyjc.filter.AccessCounterFilter - uri=/imx/cometd/service

16:09:24.896 DEBUG http-80-64 hyjc.filter.AccessCounterFilter - uri=/imx/cometd/service

16:09:24.906 DEBUG http-80-81 hyjc.filter.AccessCounterFilter - uri=/imx/cometd/service

16:09:25.095 DEBUG http-80-115 hyjc.filter.AccessCounterFilter - uri=/imx/cometd/service

16:09:25.095 DEBUG http-80-115 hyjc.cometd.CometdServlet - msgType IMX_ACTIVE_TEST msgBody {"clientId":1291343201649002,"presenceStatus":"1","seq":385}

16:09:25.095  INFO http-80-115 imx.client.ImxClient - Tx IMX_ACTIVE_TEST{seq=5711,client_id=1291343201649002,presence_status=1(presence_status_online),}

16:09:25.095 DEBUG http-80-115 hyjc.cometd.CometdServlet - { "cid": 1291343201649002, "op": "send", "sent": 0, "rc": 1, "msg": { "mt": "IMX_ACTIVE_TEST", "mb": {

"seq": 5711,

"clientId": 1291343201649002,

"presenceStatus": "1"

} }}

Ctrl+C

[root@web imx_server]#

示例二 編譯安裝tailf命令

有些Linux版本不帶tailf命令的。

[root@smsgw root]# tailf

-bash: tailf: command not found

[root@smsgw root]#

到代碼搜索網站www.koders.com輸入tailf.c就可以搜索到源代碼

tailf.c結果頁面:http://www.koders.com/default.aspx?s=tailf.c&submit=Search&la=*&li=*

tailf.c源碼頁面:http://www.koders.com/c/fidB6EFAC156A7B4C4A46B38039C79B4AD34939EED0.aspx?s=tailf#L1

點左上角的download就可下載,也可直接下載本文附件tailf.zip。

[root@smsgw tailf]# unzip tailf.zip

Archive:  tailf.zip

inflating: tailf.c

[root@smsgw tailf]# ls

tailf.c  tailf.zip

[root@smsgw tailf]# gcc -o /usr/bin/tailf tailf.c

tailf.c:34:17: nls.h: 沒有那個文件或目錄

tailf.c: In function `tailf':

tailf.c:53: warning: passing arg 2 of `fprintf' makes pointer from integer without a cast

tailf.c: In function `main':

tailf.c:88: `LC_ALL' undeclared (first use in this function)

tailf.c:88: (Each undeclared identifier is reported only once

tailf.c:88: for each function it appears in.)

tailf.c:89: `PACKAGE' undeclared (first use in this function)

tailf.c:89: `LOCALEDIR' undeclared (first use in this function)

tailf.c:93: warning: passing arg 2 of `fprintf' makes pointer from integer without a cast

tailf.c:105: warning: passing arg 2 of `fprintf' makes pointer from integer without a cast

[root@smsgw tailf]#

修改一下tailf.c的源代碼。

第34行附近:注釋掉頭文件,增加宏定義

//#include "nls.h"

#define _(s) s

第89行附近:把原來的代碼注釋掉

//setlocale(LC_ALL, "");

//bindtextdomain(PACKAGE, LOCALEDIR);

//textdomain(PACKAGE);

看了源代碼之后,你是不是發現其實Linux命令其實並不太神秘。

注:本文附件中的tailf.c已經修改成下面的樣子。

C代碼  4b52fe8fb87ef83bec3d98ee36f6bc5a.png

/* tailf.c -- tail a log file and then follow it

* Created: Tue Jan  9 15:49:21 1996 by faith@acm.org

* Copyright 1996, 2003 Rickard E. Faith (faith@acm.org)

*

* Permission is hereby granted, free of charge, to any person obtaining a

* copy of this software and associated documentation files (the "Software"),

* to deal in the Software without restriction, including without limitation

* the rights to use, copy, modify, merge, publish, distribute, sublicense,

* and/or sell copies of the Software, and to permit persons to whom the

* Software is furnished to do so, subject to the following conditions:

*

* The above copyright notice and this permission notice shall be included

* in all copies or substantial portions of the Software.

*

* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL

* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR

* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,

* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR

* OTHER DEALINGS IN THE SOFTWARE.

*

* less -F and tail -f cause a disk access every five seconds.  This

* program avoids this problem by waiting for the file size to change.

* Hence, the file is not accessed, and the access time does not need to be

* flushed back to disk.  This is sort of a "stealth" tail.

*/

#include 

#include 

#include 

#include 

#include 

//#include "nls.h"

#define _(s) s

static size_t filesize(const char *filename)

{

struct stat sb;

if (!stat(filename, &sb)) return sb.st_size;

return 0;

}

static void tailf(const char *filename, int lines)

{

char **buffer;

int  head = 0;

int  tail = 0;

FILE *str;

int  i;

if (!(str = fopen(filename, "r"))) {

fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename);

perror("");

exit(1);

}

buffer = malloc(lines * sizeof(*buffer));

for (i = 0; i 

while (fgets(buffer[tail], BUFSIZ, str)) {

if (++tail >= lines) {

tail = 0;

head = 1;

}

}

if (head) {

for (i = tail; i 

for (i = 0; i 

} else {

for (i = head; i 

}

fflush(stdout);

for (i = 0; i 

free(buffer);

}

int main(int argc, char **argv)

{

char       buffer[BUFSIZ];

size_t     osize, nsize;

FILE       *str;

const char *filename;

int        count;

//setlocale(LC_ALL, "");

//bindtextdomain(PACKAGE, LOCALEDIR);

//textdomain(PACKAGE);

if (argc != 2) {

fprintf(stderr, _("Usage: tailf logfile\n"));

exit(1);

}

filename = argv[1];

tailf(filename, 10);

for (osize = filesize(filename);;) {

nsize = filesize(filename);

if (nsize != osize) {

if (!(str = fopen(filename, "r"))) {

fprintf(stderr, _("Cannot open \"%s\" for read\n"), filename);

perror(argv[0]);

exit(1);

}

if (!fseek(str, osize, SEEK_SET))

while ((count = fread(buffer, 1, sizeof(buffer), str)) > 0)

fwrite(buffer, 1, count, stdout);

fflush(stdout);

fclose(str);

osize = nsize;

}

usleep(250000);     /* 250mS */

}

return 0;

}

[root@smsgw tailf]# gcc -Wall -o /usr/bin/tailf tailf.c

[root@smsgw tailf]# tailf

Usage: tailf logfile

[root@smsgw tailf]#

下載次數: 16

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android学习笔记(四十):Preference的使用

Preference直译为偏好,博友建议翻译为首选项。一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这样的情况&#xff…

telegr怎么连接不上_无线网密码正确但是手机连接不上wifi?

现在企业、家庭、餐厅、宾馆到处都有WiFi无线网络信号,为大家的电脑、手机提供免费的无线网络服务,但是有的时候明明有信号而无线网密码正确却连不上,是多么痛苦的一件事情。那么无线网密码正确但是手机连接不上wifi怎么回事?下面…

hdu3652(数位dp)

要求找出范围内含有“13”且能被13整除的数字的个数 可以使用数位dp dp[i][j][0] 表示长度为i,余数为j,不含13的数字的个数 dp[i][j][1] 表示长度为i,余数为j,3开头的数字的个数 dp[i][j][2] 表示长度为i,余数为j&…

怎么查看电脑是不是禁ping_怎么查看电脑内存的大小,找回丢失的内存,电脑小技巧...

小A自己组装了一台电脑,配件都是在jd买了。他高高兴兴的安装了系统准备开始体验一把,同事突然问,你的电脑内存是多少,他点来点去也没找到答案。他只知道他买了一个8G的内存条。.我们一般查看内存有两个地方。一我们的电脑 属性 安…

finereport字段显示设置_QA | 表单如何设置字段显示逻辑?

Hi,大家好!表姐又来给大家答疑解惑啦!这一期的Q&A我们来聊聊表单如何设置字段显示逻辑。字段显示逻辑是什么?字段显示逻辑是指根据设定字段条件,显示或隐藏特定的字段,可以实现选择不同内容&#xff0c…

数据库管理之数据表管理(1)

数据类型 创建数据表 语法 CREATE TABLE 表名 ( 字段名1 数据类型 列的属性 列约束, 字段名2 数据类型 列的属性 列约束, 字段名3 数据类型 列的属性 列约束, … )列属性的格式: [NULL|NOT NULL] [IDENTITY(标识种子, 标识增量)]列约束的格式: [CONST…

AngularJs-指令和指令之间的交互(动感超人)

前言: 上节我们学习到了指令和控制器之间的交互,通过给指令添加动作,调用了控制器中的方法。本节我们学习指令和指令之间是如何交互的,我们通过一个小游戏来和大家一起学习,听大漠老师说这是国外的人写的demo&#xff…

vba 指定列后插入列_在不同的列左侧插入指定数量的空白列

任务: 在不同的列左侧插入指定数量的空白列(本例是要求在每列左侧插入第2行数字对应的空白列) 插入空白列前 插入空白列后 vba代码如下: Sub 在不同的列左侧插入指定数量的空白列() Dim m, n, i As Integer For n 5 To 1 Step -1 Sheets("Sheet1").C…

怎么监听linux防火墙,linux怎么查看防火墙是否开启并清除防火墙规则?

iptables是linux下的防火墙组件服务,相对于windows防火墙而言拥有更加强大的功能,下面我们就来看看linux系统中关于iptables的一般常见操作,判断linux系统是否启用了iptables服务,并清除防火墙规则的教程。一、检查iptables是否安…

手册如何看运放的db_如何处理金属离子与配体之间的配位键?

更多资讯,请访问www.yinfotek.com 或关注微信公众号“殷赋科技”。殷赋学术交流2群已建立,需求加群的朋友,请在公众号输入“加群”,验证后即入群。1A:请教大家一个问题:在做对接模拟的过程中蛋白活性中心存在重要金属离…

secure连不上远程地址_[笔记]Mariadb安装并配置远程访问

引言熟悉的小伙伴都知道我自用有一台NAS,并为此折腾了不少内容:西蒙宫:折腾,用J3455搭建家庭nas西蒙宫:让家庭NAS走向世界,兼谈Zerotier西蒙宫:折腾——组装NAS编译安装ffmpeg在NAS上部署了Next…

从Wireshark看TCP连接的建立与关闭

TCP是一种面向连接、可靠的协议。TCP连接的建立与断开,都是需要经过通信双方的协商。用一句话概括就是:三次握手say hello(建立连接);四次握手say goodbye(断开连接)。要了解TCP连接的建立与断开…

用Visual C#来清空回收站(2)

四.程序的源代码(recycled.cs)、编译方法及运行后的界面:  (1).程序的源代码:recycled.cs: using System.IO ; using System.Windows.Forms ; //导入程序中用到的名称空间 class Recycle { pu…

jq苹果手机全屏下点击无效果_苹果系统自带外挂?无需越狱也可录制动作脚本...

网络游戏开始流行起来之后,随之而来的是外挂的兴起,各式各样的外挂中有两种最为致命:物理外挂和系统自带外挂。随着国内电竞行业和电竞直播的兴起,“物理外挂”出现在我们周围的频率也越来越高,比如扩大视角的显示器、…

c语言不同类型变量用什么表示什么作用,C语言数据类型及变量整理

数据类型获取int的字节数大小方法printf("int bytes:%d",sizeof(int));列表整理Int 与 long int的区别早期的C平台是16位int系统,int用二字节表示,范围是-32768~32767;long是long int的简写,用4字节表示,范围…

通知:即日起本博客暂停更新,请移步至yanxin8.com获取最新文章

通知:即日起本博客暂停更新,请移步至yanxin8.com与博主交流及获取最新文章 转载于:https://www.cnblogs.com/iplus/p/4467089.html

通信系统概论_现代通信系统概论 第一章 概述(1)

2020年,又开始上一门新课!!!喜欢挑战!让同学们开阔知识是本课程的主要目的!本课程讲解导航、遥控遥测等军用尖端技术和数字电话、广播电视、综合信息网、多媒体宽带网等现代民用技术。通信在过去分为模拟通…

安装CentOS6.2操作系统

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/40131523 说明:因为之前有相关安装文章能够查…

在用c语言写代码是这么找出错误,写代码(C语言)常见粗心小错误

打码(C语言)常见粗心小错误标签(空格分隔): 博客自我介绍本人学院 (http://sdcs.sysu.edu.cn/) 欢迎访问本人学号 16340213目录##1.前言小萌新们是不是经常打完码之发现程序运行达不到自己的效果,然后自己用大脑运行的时候发现完全没有问题,然…

Analyzer报表结果行

隐藏结果(统计)行 (注:在Analyzer设置只是临时起作用,如果要使设置一直生效,则要通过Query Designer进行设置) 显示多个值:如果结果只是由一条记录汇总得来的,则在该列上…