基于终端的日志工具logview

概述

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

详细

代码下载:http://www.demodashi.com/demo/12739.html

一、功能简介

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

  • 脚本所采用的算法非常适合用来监视大型日志文件
  • 将所监视出的错误信息发送给指定的邮件列表
  • 可以设置监视频率,比如30s/1h扫描一次日志文件
  • 将错误信息发送到指定的tty,达到出现错误立即知晓的目的
  • 自动指定脚本从何时开始监视日志文件,以及何时结束监视
  • 自由指定错误发生时,脚本所要执行的操作,比如kill掉产生日志文件的进程等.
  • 给错误信息配色
  • 日志文件分析及生成日志报告的功能
  • 可以自由指定所要监控的报错信息
  • 只要你有bash以及mail命令即可运行此工具

二、实现方法

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

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

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

### read cli options
# separate groups of short options. replace --foo=bar with --foo bar
while [[ -n $1 ]]; do
    case "$1" in
        -- )
            for arg in "[email protected]"; do
                ARGS[${#ARGS[*]}]="$arg"
            done
            break
            ;;
        --debug )
            set -v
            DEBUG=0
            ;;
        --*=?* )
            ARGS[${#ARGS[*]}]="${1%%=*}"
            ARGS[${#ARGS[*]}]="${1#*=}"
            ;;
        --* )
            #die "$0: option $1 requires a value"
            ARGS[${#ARGS[*]}]="$1"
            ;;
        -* )
            for shortarg in $(sed -e ‘s|.| -&|g‘ <<< "${1#-}"); do
                ARGS[${#ARGS[*]}]="$shortarg"
            done
            ;;
        * )
            ARGS[${#ARGS[*]}]="$1"
    esac
    shift
done

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

[ "$DEBUG" -eq 0 ] && echo "DEBUG: ARGS[@]: ${ARGS[@]}"
while [[ -n $1 ]]; do
    ((args=1))
    case "$1" in
        -- )
            shift && getfilenames "[email protected]" && break
            ;;
        -h | --help )
            Usage
            exit 0
            ;;
        -a )
            getawkfile
            exit 0
            ;;
        -m | --mail-list )
            requiredarg "[email protected]"
            maillist="$2"
            ;;
        --max-record )
            requiredarg "[email protected]"
            maxrecord=$2
            ;;
        -s | --scan-time )
            requiredarg "[email protected]"
            delay=$(conv2seconds "$2")
            [ "$delay" == "unknow" ] && die "$0: Unavailable time format."
            ;;
        -l | --log-file )
            requiredarg "[email protected]"
            loglist=$2
            ;;
        -n | --notice )
            requiredarg "[email protected]"
            notice=$2
            ;;
        --mail-time )
            requiredarg "[email protected]"
            mail_time=$(conv2seconds "$2")
            [ "$mail_time" == "unknow" ] && die "$0: Unavailable time format."
            ;;
        --start-time )
            requiredarg "[email protected]"
            start_time=$2
            ;;
        --end-time )
            requiredarg "[email protected]"
            end_time=$2
            ;;
        -r | --report )
            requiredarg "[email protected]"
            reprot=$2
            ;;
        --format )
            requiredarg "[email protected]"
            format=$2
            ;;
            --parse )
                requiredarg "[email protected]"
                parse="$2"
                ;;
            --timeout-start )
                requiredarg "[email protected]"
                timeout_start=$(conv2seconds "$2")
                [ "$timeout_start" == "unknow" ] && die "$0: Unavailable time format."
                ;;
            --timeout-end )
                requiredarg "[email protected]"
                timeout_end=$(conv2seconds "$2")
                [ "$timeout_end" == "unknow" ] && die "$0: Unavailable time format."
                ;;
            --back-color )
                requiredarg "[email protected]"
                back_color=\${b$2}
                ;;
            --font-color )
                requiredarg "[email protected]"
                font_color=\${$2}
                ;;
            --font )
                requiredarg "[email protected]"
                font=\${$2}
                ;;
            -f )
                requiredarg "[email protected]"
                [ "$2" == "" ] && die "$0: no input file for ‘-f‘ option."
                awkfile="$2"
                ;;
            -e )
                requiredarg "[email protected]"
                [ "$2" == "" ] && die "$0: no input file for ‘-f‘ option."
                errorfile="$2"
                ;;
            -c | --command-message )
                requiredarg "[email protected]"
                command_message="$2"
                ;;
            -p | --print )
                print_colors
                exit 0
                ;;
            -v | --version )
                echo "$version"
                exit 0
                ;;
            -* )
                die "$0: unrecognized option ‘$1‘"
                ;;
            *)
                getfilenames "$1"
                ;;
        esac
        shift $args
    done
    # Get log file list
    [ "$loglist" != "" ] && {
    for f in $(cat $loglist|grep -v ^#)
    do
        #[[ -f $f ]] || die "$0: $f No such file found."
        f="$(deal_remote $f)"
        FILES[${#FILES[*]}]="$f"
    done
}

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

        -m | --mail-list )
            requiredarg "[email protected]"
            maillist="$2"
            ;;

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

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

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

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

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

通过:

while true
do
    ...
done

来循环的监控文件。

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

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

下面的代码主要功能是:

  1. 记住上次扫描的行数
  2. 计算:下次扫描时用文件总行数 - 上次扫描的函数 = 这次需要扫描的行数。开始扫描行为上次扫描的最后一行的行number。
  3. 调用awk脚本来判断当前行是否是错误信息。

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

    for ((i=0;i<FILENUM;i++))
    do
        sync_file "${MONFILES[i]}" #KONG
        [ -f "${MONFILES[i]}" ] &&
            eval COUNT$i=$(wc -l ${MONFILES[i]} | awk ‘{print $1}‘) ||
            eval COUNT$i=0

        #eval declare -i comp$i=0
        comp=$(($(eval echo ‘$COUNT‘$i) - $(eval echo ‘$BASE‘$i)))

        if [ $comp -gt 0 ];then
            LINES=$(eval expr ‘$COUNT‘$i - ‘$BASE‘$i)
            eval  BASE$i=‘$COUNT‘$i
            IFS=$‘\n‘

            for MSGS in $(tail -$LINES ${MONFILES[i]}| eval "$GrepAwk")
            do
                [ $DEBUG -eq 0 ] && echo "DEBUG: \"error\" message is: [$MSGS]"

                [ -n "$MSGS" ] && {
                deal "$MSGS" "${MONFILES[i]}"
                tellb
            }
            done
        fi
    done

三、安装方法

1、准备工作

1. 1台Linux服务器

2、安装步骤

1. 解压logview.zip包

unzip logview.zip

2. 进入logview目录

cd logview

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

3、使用方法

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

logview -a

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

2. 运行./logview脚本

./logview awk.example -f test.log

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

logview -h

4. 举例:

  • logview awk.example -f logfile

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

  • 运行命令监视日志文件 - 例1
logview awk.example -f logfile --font-color=red --font=bold -s 5s -c ./command.sh [email protected] --mail-time=5m参数解释:

参数解释

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

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

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

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

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

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

  • 运行命令监视日志文件 - 例2
 logview awk.example -f logfile --font-color=red --font=bold -s 5s -c ./command.sh -m [email protected] --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参数。

代码下载:http://www.demodashi.com/demo/12739.html

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

原文地址:https://www.cnblogs.com/demodashi/p/9452897.html

时间: 2024-10-18 22:52:29

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

Java 基于log4j的日志工具类

Java 基于log4j的日志工具类 对log4j日志类进行了简单封装,使用该封装类的优势在于以下两点: 1.不必在每个类中去创建对象,直接类名 + 方法即可 2.可以很方便的打印出堆栈信息 package com.tradeplatform.receiveorder.util; import java.io.PrintWriter; import java.io.StringWriter; import org.apache.log4j.Logger; /** * @Description 日

基于SQL的日志分析工具myselect

基本介绍 程序开发人员经常要分析程序日志,包括自己打印的日志及使用的其它软件打印的日志,如php,nginx日志等,linux环境下分析日志有一些内置命令可以使用,如grep,sort,uniq,awk等,其中最强大的是awk,是作为一门小巧的文本处理语言存在的,但由于它是一门语言,功能强大,但在命令行下使用并不那么方便,因为awk是面向计算而不是面向统计的.awk可以定义变量,可以进行计算,命令行下就是一个包含隐式for循环的语言. awk如果很长时间不用,它的一些语法就忘了,要分析线上日志时

基于mariadb的日志服务器及用loganalyzer实现日志的管理分析

日志文件和相关服务进程 日志文件用来记录系统,服务等在运行过程中发生的事件,事件发生的时间及事件的关键性程序.这些记录的信息在服务器运行出现问题时用来查看分析,以便解决问题.在Linux上,日志的记录一般有两种方式,一种是由软件自身完成自身运行状态的记录,例如httpd:另一种是由Linux上提供的日志文件管理系统来统一管理.运行的软件只需要调用这个管理系统中的相关服务,即可完成日志的记录.rsyslog就是这样的一个日志文件管理系统. rsyslog内置了很多facility,这个可以理解为服

tcp_wrapper:简单的基于主机的访问控制工具

一.常用的主机访问控制工具 独立(stand alone)守护进程(httpd,vsftpd).瞬时(transient)守护进程(rsync,tftp,telnet), 这两类守护进程都支持基于iptables进行控制.哪一端口运行客户端访问,哪一端口不允许客户端访问,基于主机做防火墙时,都能进行控制. 做主机防火墙时,有些瞬时守护进程,甚至是某些独立独立守护进程,还能够接受另一种方式,tcp_wrapper,来控制. 在众多的基于主机的安全访问控制中,tcp-wrapper是简单而易于配置的

Win10手记-为应用集成日志工具Logger

日志工具由来已久,是很受大家欢迎的debug工具.其中.NET平台上很出名的是log4net,但是由于Windows 10通用应用项目没有了System.Configuration引用,所以也就不能很好使用log4net工具了. Windows Runtime框架大家从它面世以来一直在吐槽,log4net也因为其缺少api不能使用,但是我们仍然可以找到替代方案.Windows.Foundation.Diagnostics命名空间下就提供了一套简单的日志工具,能够正常使用下去. 方案 根据MSDN

【工具推荐】ELMAH——可插拔错误日志工具

ELMAH 是 Error Logging Modules and Handlers for ASP.NET 的缩写.ELMAH可以让你记录下你的网站发生的任何一个错误,在将来,你可以重新检查这些错误.你可以从ELMAH项目的官方网站免费下载ELMAH:http://code.google.com/p/elmah/. ELMAH既支持ASP.NET Web Forms 又支持 ASP.NET MVC.你可以对ELMAH进行配置来存储各种不同的错误(XML文件,事件日志,Access数据库,SQL

Python 日志工具(logging) 基础教程

什么是 logging ? 日志是跟踪软件运行时发生的事件,软件的开发人员可以通过日志快速的定位问题的位置.事件也分重要性即事件的严重程度. 什么时候使用日志? logging 提供了一组方便操作日志记录的功能,这些是 debug(), info(),warning(),error(),critical(). 通过想要执行的任务确定使用日志记录的方法. 你想要执行的任务 日志记录的最佳方法 一个脚本或程序显示在终端上 print() 程序正常运行过程中发生的事件 logging.info() o

基于服务的日志架构

背景 对于日志的记录,无论是Log4Net也好,NLog日志也罢,提供的功能都比较全面,并且久经历史考验,但是基于服务的日志架构并不采用他们其中的任何一个框架来实现,即使他们可以处理的更好,该架构主要用来处理对于多台服务器,并且每台服务器下的有许多不同的站点,集中对日志进行处理,包含需要记录的审计日志和系统日志,统一交由一个服务来实现对日志的存储.并且可通过相应的工具进行查看日志的实时监控情况. 整体设计图 原理 我相信主要我画的不太毛糙的话,基本原理也都可以看得懂,主要的原理实现起来也很简单.

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

源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还不会用 Log4j,那你真的很有必要读一下这篇文章了.很多朋友反映想写程序日志,但是却不知道怎么把日志写到日志文件里,而且 Java 这方面的资料似乎不多.如<如何写log4j.xml日志配置文件> 所述.本文详细介绍了如何在项目中使用 Log4j 的步骤,并附加了一个例子性质的代码.