V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
nutting
V2EX  ›  问与答

shell 监控 tail 文件输出,触发命令?

  •  
  •   nutting · Mar 15, 2017 · 3994 views
    This topic created in 3344 days ago, the information mentioned may be changed or developed.

    有没有运维人员搞过啊,比如我 tail 日志 grep 一个关键字,一旦有输出就触发调用 curl 发送提醒 因为是局方的服务器,没 root ,尽量用系统自带的功能来实现。

    12 replies    2017-03-15 13:13:06 +08:00
    AntonChen
        1
    AntonChen  
       Mar 15, 2017
    很有意思的想法,表示关注
    AntonChen
        2
    AntonChen  
       Mar 15, 2017
    补充一下 在我的认知中 tail -f 不断开是做不了后面的操作的,所以我也很想知道能不能实现卤煮的想法
    qooweds
        3
    qooweds  
       Mar 15, 2017
    我原来也遇到过,没找到什么好方法
    tail -f xxx |grep > xxx 然后再定时查 xxx 和删除 xxx 这样来做的
    不知道有没有什么直接点的方法
    ruosu0710
        5
    ruosu0710  
       Mar 15, 2017
    目前在用的.

    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import subprocess
    import time
    import datetime

    from wxnotice import *

    #日志文件是按天产生,则通过在程序中判断文件的产生日期与当前时间,更换监控的日志文件
    def catch(logfile,server):
    print '监控的日志文件是%s' %logfile
    send_notice('od8J4s4pbnj2UTwASk-tKr8hKbEU','异常监控任务启动')
    stoptime=datetime.datetime.combine(datetime.date.today(), datetime.time.max)
    stoptime = time.strftime('%Y-%m-%d %H:%M:%S',stoptime.timetuple())
    print stoptime
    popen = subprocess.Popen('tail -f ' + logfile, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    pid = popen.pid
    print('Popen.pid:' + str(pid))
    while True:
    thistime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))#当前时间
    #print thistime
    if thistime >= stoptime:
    # 终止子进程
    popen.kill()
    print '杀死 subprocess'
    break
    line = popen.stdout.readline().strip()
    # 判断内容是否有异常
    if line.find('Exception')>0:
    line=line+popen.stdout.readline().strip()#
    line=line+popen.stdout.readline().strip()#
    #line=line+popen.stdout.readline().strip()#
    #line=line+popen.stdout.readline().strip()#
    #line=line+popen.stdout.readline().strip()#多读一行.获取更多的异常信息
    openid_array=['od8J4s4pbnj2UTwASk-tKr8hKbEU','od8J4s8xWPDUtrJTXL-bQ9FYias4']
    for openid in openid_array:
    content='['+server+']'+line
    content=content.replace('\"','')
    send_notice(openid,content)#发送微信模板通知给管理员




    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    import sys
    from exception import *

    filename= '/data/app/tomcat'+sys.argv[1]+'/logs/catalina.out'
    print filename
    catch(filename,'TOMCAT'+sys.argv[1])
    rrfeng
        6
    rrfeng  
       Mar 15, 2017
    tail -f log | while read line; do if [[ `grep KEY $line` ]];then ....fi;done
    shoaly
        7
    shoaly  
       Mar 15, 2017
    如果我是来弄的话, 先管道打到我自己的主机上, 全部传过来再说. 有了一份远程的日志的复制, 然后想怎么弄就怎么弄了. 也避免了频繁更新 "局方" 那边 script 的 尴尬.
    tail -f log | ssh 自己人主机 "cat - >> log"
    lululau
        8
    lululau  
       Mar 15, 2017
    tail -f log | ruby -ne 'system(CURL_CMD) if /PATTERN/'
    ihuotui
        9
    ihuotui  
       Mar 15, 2017 via iPhone
    你需要 elk
    MrMario
        10
    MrMario  
       Mar 15, 2017 via iPhone
    楼主你需要 audit ,然后用 elk 收集日志后端分析
    dongxiaozhuo
        11
    dongxiaozhuo  
       Mar 15, 2017 via iPhone
    都要监控日志内容并触发报警,为何不和对方谈搞一套日志流程或者监控流程。
    SoloCompany
        12
    SoloCompany  
       Mar 15, 2017 via iPhone
    用 tee 应该可以吧,或者直接脚步 while read 循环 一边执行自定义脚本一边输出
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1703 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 16:24 · PVG 00:24 · LAX 09:24 · JFK 12:24
    ♥ Do have faith in what you're doing.