概述

logview是一个Shell脚本编写的基于终端的日志工具, 具有终端通知, email通知, 错误信息颜色配置, 以及灵活强大的监控配置. 还可以灵活的配置脚本监控的时间, 以及错误发生时需要进行的处理等. 该工具所使用的算法很适合监控大型日志。

详细

一、功能简介

logview 是一个Shell脚本编写的基于终端的日志工具, 具有终端通知, email通知, 错误信息颜色配置, 以及灵活强大的监控配置. 还可以灵活的配置脚本监控的时间, 以及错误发生时需要进行的处理等. 该工具所使用的算法很适合监控大型日志。该工具,居然有如下功能:

  • 脚本所采用的算法非常适合用来监视大型日志文件

  • 将所监视出的错误信息发送给指定的邮件列表

  • 可以设置监视频率,比如30s/1h扫描一次日志文件

  • 将错误信息发送到指定的tty,达到出现错误立即知晓的目的

  • 自动指定脚本从何时开始监视日志文件,以及何时结束监视

  • 自由指定错误发生时,脚本所要执行的操作,比如kill掉产生日志文件的进程等.

  • 给错误信息配色

  • 日志文件分析及生成日志报告的功能

  • 可以自由指定所要监控的报错信息

  • 只要你有bash以及mail命令即可运行此工具

二、实现方法

程序开始,global_variables用来定义一些全局变量和默认值,def_colors用来定义颜色

  1. # load global variables
  2. global_variables
  3. def_colors
  4. cat /dev/null > /tmp/logview_password.$$.log

用while来循环解析命令行参数,用shell case语法来判断不同的参数格式,不同格式不同处理:

  1. ### read cli options
  2. # separate groups of short options. replace --foo=bar with --foo bar
  3. while [[ -n $1 ]]; do
  4. case "$1" in
  5. -- )
  6. for arg in "$@"; do
  7. ARGS[${#ARGS[*]}]="$arg"
  8. done
  9. break
  10. ;;
  11. --debug )
  12. set -v
  13. DEBUG=0
  14. ;;
  15. --*=?* )
  16. ARGS[${#ARGS[*]}]="${1%%=*}"
  17. ARGS[${#ARGS[*]}]="${1#*=}"
  18. ;;
  19. --* )
  20. #die "$0: option $1 requires a value"
  21. ARGS[${#ARGS[*]}]="$1"
  22. ;;
  23. -* )
  24. for shortarg in $(sed -e 's|.| -&|g' <<< "${1#-}"); do
  25. ARGS[${#ARGS[*]}]="$shortarg"
  26. done
  27. ;;
  28. * )
  29. ARGS[${#ARGS[*]}]="$1"
  30. esac
  31. shift
  32. done

set -- "${ARGS[@]}" 为解析后的最终格式:logview -a --mail-time 5h (...),这种格式可以被如下代码解析并处理:

  1. [ "$DEBUG" -eq 0 ] && echo "DEBUG: ARGS[@]: ${ARGS[@]}"
  2. while [[ -n $1 ]]; do
  3. ((args=1))
  4. case "$1" in
  5. -- )
  6. shift && getfilenames "$@" && break
  7. ;;
  8. -h | --help )
  9. Usage
  10. exit 0
  11. ;;
  12. -a )
  13. getawkfile
  14. exit 0
  15. ;;
  16. -m | --mail-list )
  17. requiredarg "$@"
  18. maillist="$2"
  19. ;;
  20. --max-record )
  21. requiredarg "$@"
  22. maxrecord=$2
  23. ;;
  24. -s | --scan-time )
  25. requiredarg "$@"
  26. delay=$(conv2seconds "$2")
  27. [ "$delay" == "unknow" ] && die "$0: Unavailable time format."
  28. ;;
  29. -l | --log-file )
  30. requiredarg "$@"
  31. loglist=$2
  32. ;;
  33. -n | --notice )
  34. requiredarg "$@"
  35. notice=$2
  36. ;;
  37. --mail-time )
  38. requiredarg "$@"
  39. mail_time=$(conv2seconds "$2")
  40. [ "$mail_time" == "unknow" ] && die "$0: Unavailable time format."
  41. ;;
  42. --start-time )
  43. requiredarg "$@"
  44. start_time=$2
  45. ;;
  46. --end-time )
  47. requiredarg "$@"
  48. end_time=$2
  49. ;;
  50. -r | --report )
  51. requiredarg "$@"
  52. reprot=$2
  53. ;;
  54. --format )
  55. requiredarg "$@"
  56. format=$2
  57. ;;
  58. --parse )
  59. requiredarg "$@"
  60. parse="$2"
  61. ;;
  62. --timeout-start )
  63. requiredarg "$@"
  64. timeout_start=$(conv2seconds "$2")
  65. [ "$timeout_start" == "unknow" ] && die "$0: Unavailable time format."
  66. ;;
  67. --timeout-end )
  68. requiredarg "$@"
  69. timeout_end=$(conv2seconds "$2")
  70. [ "$timeout_end" == "unknow" ] && die "$0: Unavailable time format."
  71. ;;
  72. --back-color )
  73. requiredarg "$@"
  74. back_color=\${b$2}
  75. ;;
  76. --font-color )
  77. requiredarg "$@"
  78. font_color=\${$2}
  79. ;;
  80. --font )
  81. requiredarg "$@"
  82. font=\${$2}
  83. ;;
  84. -f )
  85. requiredarg "$@"
  86. [ "$2" == "" ] && die "$0: no input file for '-f' option."
  87. awkfile="$2"
  88. ;;
  89. -e )
  90. requiredarg "$@"
  91. [ "$2" == "" ] && die "$0: no input file for '-f' option."
  92. errorfile="$2"
  93. ;;
  94. -c | --command-message )
  95. requiredarg "$@"
  96. command_message="$2"
  97. ;;
  98. -p | --print )
  99. print_colors
  100. exit 0
  101. ;;
  102. -v | --version )
  103. echo "$version"
  104. exit 0
  105. ;;
  106. -* )
  107. die "$0: unrecognized option '$1'"
  108. ;;
  109. *)
  110. getfilenames "$1"
  111. ;;
  112. esac
  113. shift $args
  114. done
  115. # Get log file list
  116. [ "$loglist" != "" ] && {
  117. for f in $(cat $loglist|grep -v ^#)
  118. do
  119. #[[ -f $f ]] || die "$0: $f No such file found."
  120. f="$(deal_remote $f)"
  121. FILES[${#FILES[*]}]="$f"
  122. done
  123. }

不同选项,调用不同的函数进行处理,比如:-a,会调用getawkfile函数来生成awk文件。通过调用requiredarg函数来检查--mail-time这类参数是否提供一个值,如果没有提供则报错。如果提供则把,--mail-time的值赋值给maillist变量

  1. -m | --mail-list )
  2. requiredarg "$@"
  3. maillist="$2"
  4. ;;

上面是整个脚本最核心处理复杂命令行参数的代码。接下来是监控脚本的核心代码:

logview会转存错误信息到一个文件,如果没有提供该文件,logview会打印监控到的错误信息到stdout:

  1. [ -z "$errorfile" ] && notice=no

logview是通过调用tellb函数来通知出错信息的,如果notice=no,则不通知,如果notice=one,则调用Linux write命令将错误信息写到当前终端,如果notice=all,则logview会调用Linux wall命令将错误信息输出到所有终端。

接下来是监控脚本的核心逻辑:

通过:

  1. while true
  2. do
  3. ...
  4. done

来循环的监控文件。

  1. for ((i=0;i<FILENUM;i++))
  2. do
  3. if [ "$(eval echo '$COUNT'$i)" = "" ];then
  4. [ -f "${MONFILES[i]}" ] &&
  5. eval BASE$i=$(wc -l ${MONFILES[i]} 2>/dev/null| awk '{print $1}') ||
  6. eval BASE$i=0
  7. fi
  8. done

该代码块功能主要是循环所有的待监控文件,并做处理。

下面的代码主要功能是:

  1. 记住上次扫描的行数

  2. 计算:下次扫描时用文件总行数 - 上次扫描的函数 = 这次需要扫描的行数。开始扫描行为上次扫描的最后一行的行number。

  3. 调用awk脚本来判断当前行是否是错误信息。

代码会调用tail -$LINES ${MONFILES[i]}| eval "$GrepAwk"来执行指定的awk脚本,通过awk脚本判断当前行是否满足awk编写的规则。

  1. for ((i=0;i<FILENUM;i++))
  2. do
  3. sync_file "${MONFILES[i]}" #KONG
  4. [ -f "${MONFILES[i]}" ] &&
  5. eval COUNT$i=$(wc -l ${MONFILES[i]} | awk '{print $1}') ||
  6. eval COUNT$i=0
  7.  
  8. #eval declare -i comp$i=0
  9. comp=$(($(eval echo '$COUNT'$i) - $(eval echo '$BASE'$i)))
  10.  
  11. if [ $comp -gt 0 ];then
  12. LINES=$(eval expr '$COUNT'$i - '$BASE'$i)
  13. eval BASE$i='$COUNT'$i
  14. IFS=$'\n'
  15.  
  16. for MSGS in $(tail -$LINES ${MONFILES[i]}| eval "$GrepAwk")
  17. do
  18. [ $DEBUG -eq 0 ] && echo "DEBUG: \"error\" message is: [$MSGS]"
  19.  
  20. [ -n "$MSGS" ] && {
  21. deal "$MSGS" "${MONFILES[i]}"
  22. tellb
  23. }
  24. done
  25. fi
  26. done

三、安装方法

1、准备工作

1. 1台Linux服务器

2、安装步骤

1. 解压logview.zip包

  1. unzip logview.zip

2. 进入logview目录

  1. cd logview

3. 复制logview文件到你的$PATH路径中

3、使用方法

1. 获取awk过滤文件,脚本用该文件过滤错误信息,如果仅想过滤带error/failed的行,你可以执行:

  1. logview -a

该命令会在当前目录生成名为awk.example的文件,你可以在该文件的基础上进行修改

2. 运行./logview脚本

  1. ./logview awk.example -f test.log

3. 更多使用方法,执行:

  1. logview -h

4. 举例:

  • logview awk.example -f logfile

该命令会每隔3s扫描一次日志文件,并将包含error或者failed单词的行输 出到标准输出.

  • 运行命令监视日志文件 - 例1

  1. logview awk.example -f logfile --font-color=red --font=bold -s 5s -c ./command.sh -mlkong@tecent.com --mail-time=5m参数解释:

参数解释

-f:指定你所要监视的日志文件

--font-color=red:将错误信息以红色字体打印

--font=bold:字体格式为bold

-s5s:每隔5s扫描一次日志文件

-m:将错误信息发送给 -m参数后的maillist

--mail-time=5m:每隔5分钟发送一次email

  • 运行命令监视日志文件 - 例2

  1. logview awk.example -f logfile --font-color=red --font=bold -s 5s -c ./command.sh -m lkong@redhat.com --mail-time=5m errorfile.txt --notice=one

--notice=one:当有错误信息时,logview会将错误信息发送到你当前的tty
--notice=all:当有错误信息时,logview会将错误信息发送到你所有的tty

四、运行效果

五、压缩包文件截图

六、其他补充

其实该脚本的功能远不止这些,至于其他功能你可以参考logview -h并结合脚本源码获知其用法。该脚本很适合高频率的监视大型日志文件,假若刚启动监视脚本时是日志文件总共有10000行,设置监频率为3s,那么假设在这3s内日志文件新心曾800行,则该脚本查找错误字符串范围为10000-10800而不是0-10800,试想假若所监视的日志文件是个大型的日志文件,超过10W行,而且要不停听的监测,那么该脚本会节省很多资源和时间.而且脚本中的一些实现方法也值得学习和借鉴。当你将错误信息输出到标准输出而非文件时是,notice功能会自动被禁止掉,即使你指定了--notice参数。

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

基于终端的日志工具logview的更多相关文章

  1. Java 基于log4j的日志工具类

    对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatfo ...

  2. 基于SQL的日志分析工具myselect

    基本介绍 程序开发者常常要分析程序日志,包括自己打印的日志及使用的其他软件打印的日志,如php,nginx日志等,linux环境下分析日志有一些内置命令能够使用,如grep,sort,uniq,awk ...

  3. MyBatis 内置日志工厂基于运行时自省机制选择合适的日志工具

    mybatis – MyBatis 3 | 日志 http://www.mybatis.org/mybatis-3/zh/logging.html MyBatis 内置日志工厂基于运行时自省机制选择合 ...

  4. 基于hive的日志分析系统

    转自 http://www.cppblog.com/koson/archive/2010/07/19/120773.html           hive 简介         hive 是一个基于  ...

  5. 终端的乐趣--Linux下有趣的终端命令或者工具【转】

    转自:https://blog.csdn.net/gatieme/article/details/52144603 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  6. Java 标准日志工具 Log4j 的使用(附源代码)

    源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还 ...

  7. IIS安全工具UrlScan介绍 ASP.NET 两种超强SQL 注入免费解决方案( 基于IIS,使用免费工具) 批改或隐藏IIS7.5的Server头信息 移除X-Powered-By,MVC,ASP.NET_SessionId 的 HTTP头或者cookie名称

    微软给了我们一个很好的工具用来使IIS安全的运行-------UrlScan,下面是它的配置文件介绍 [options]UseAllowVerbs=1                ; 若为1,则使用 ...

  8. .NET日志工具介绍

    最近项目需要一个日志工具来跟踪程序便于调试和测试,为此研究了一下.NET日志工具,本文介绍了一些主流的日志框架并进行了对比.发表出来与大家分享. 综述 所谓日志(这里指程序日志)就是用于记录程序执行过 ...

  9. Java日志工具之java.util.logging.Logger

    今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...

随机推荐

  1. Chrome浏览器video样式控制-隐藏下载按钮

    Chrome浏览器在升级之后 video的样式和之前是不一样的,如果使用原生video的话可能会有影响,实际项目中最好使用第三方插件以保证video在所有浏览器都有统一的样式 一.如何隐藏video的 ...

  2. ruby 状态转移

    0. 引言       昨天遇到一个问题,就是关于对象状态转移的问题,我姑且这样命名吧.简要描述一下就是:对于一个人,他有进食,帮助他人,恋爱等功能,但是这些功能是有先后顺序的,对于刚出生的人,他要先 ...

  3. rc_80 tomcat 日志

    1 #!/bin/sh 2 cd /mnt/tomcat/tomcat_8082/logs; 3 tail -f catalina.out;

  4. cocos2d-x HelloWorld 代码一撇

        本节简单对新生成的hellowrold 项目相关代码进行简单分析,具体以代码注释的方式展示给大家.代码相对简单些,在此不作过多赘述,直接上码: int APIENTRY _tWinMain(H ...

  5. Appium+python自动化54-appium-doctor报错已解决(SyntaxError: Unexpected token ...)

    前言 由于新版的appium desktop版本是不带appium-doctor这个包的,所以想用appium-desktop检查环境的话需要另外的安装了,在安装的时候小编又遇到了一个坑 报错信息:S ...

  6. 【GISER&&Painter】Chapter01:WebGL渲染初体验

    基于上一篇OpenGL的渲染原理,这两周又陆续接触了一些关于WebGL绘图的一些内容,因为刚入门,很多东西又很晦涩,所以特意花了小半天的时间整理了一下,特此记录. 零  画一个多边形吧! 把一个多边形 ...

  7. 用百度SDK获取地理位置和天气信息

    以下实现通过百度SDK获取地理位置和天气信息,请參考title=android-locsdk/guide/v5-0">百度开发文档 1. 在相关下载最新的库文件.将so文件的压缩文件解 ...

  8. 用mappedbytebuffer实现一个持久化队列【转】

    自从前段时间的一个事故让队列里缓存的大量关键数据丢失后,一直琢磨着弄一个能持久化到本地文件的队列,这样即使系统再次发生意外,我也不至于再苦逼的修数据了.选定使用mappedbytebuffer来实现, ...

  9. 织梦(DEDE)CMS V5.3 覆盖任意变量导致远程包含漏洞

    漏洞版本: 织梦(DEDE)CMS V5.3 漏洞描述: 织梦内容管理系统,最强大的中文开源CMS网站管理项目,使用PHP+MySQL架构. 在文件include/common.inc.php中: f ...

  10. C++primer习题--第1章

    本文地址:http://www.cnblogs.com/archimedes/p/cpp-primer-chapter1-ans.html,转载请注明源地址. [习题 1.3] 编一个程序,在标准输出 ...