概述

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. 洛谷P4009 汽车加油行驶问题

    题目描述 给定一个 N \times NN×N 的方形网格,设其左上角为起点◎,坐标(1,1)(1,1),XX 轴向右为正, YY 轴向下为正,每个方格边长为 11 ,如图所示. 一辆汽车从起点◎出发 ...

  2. redis实现简单延时队列(转)

    继之前用rabbitMQ实现延时队列,Redis由于其自身的Zset数据结构,也同样可以实现延时的操作 Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性scor ...

  3. python开发_zlib_完整版_博主推荐

    ''' python中的zlib模块提供了压缩和解压缩的方法 实现功能: 读取一个文件的内容,然后把该文件的内容以字符串的形式返回 然后对返回回来的字符串进行压缩处理,然后写入到另一个文件中 同时,也 ...

  4. PNP NPN NMOS PMOS S8050 S8550 SI2301 SI2302 2N3904 2N3906 78L05 TL431

  5. linux下的系统调用函数到内核函数的追踪

    http://blog.csdn.net/maochengtao/article/details/23598433

  6. 让mbox支持up效果

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. KVM-Introduce

    相信非常多的人对虚拟机并不陌生,眼下也有非常多优秀的虚拟机软件,比如:VMware, VirtualBox, Xen, KVM等.而本文的主要内容是介绍KVM. KVM: Kernel Based V ...

  8. 类似于GROUP BY SUM() 用于字符串连接的语句

    CREATE TABLE T ( [f1] VarCHAR(100), [f2] VarCHAR(100))goINSERT INTO T   VALUES ('a','abc')INSERT INT ...

  9. LaTeX排版设置图表的位置 Positioning images and tables

    Positioning images and tables LATEX is an editing tool that takes care of the format so you only hav ...

  10. 对 getaddrinfo Android 返回错误 EAI_BADFLAGS

    我们尝试使用 getaddrinfo 对 Android API 14 及以上 (在 c + + 代码使用 NDK r12) 从 IPV4 获得合成的 IPV6 地址 address .这是在 IPV ...