python實時監(jiān)控logstash日志代碼
更新時間:2020年04月27日 16:30:19 作者:hey,emmby
這篇文章主要介紹了python實時監(jiān)控logstash日志代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
實時讀取logstash日志,有異常錯誤keywork即觸發(fā)報警。
# /usr/bin/env python3
# -*- coding: utf-8 -*-
# __author__ = caozhi
# create_time 2018-11-12,update_time 2018-11-15
# version = 1.0
# 錄像高可用報警
# 1 讀取日志 使用游標(biāo)移動
# 2 線上業(yè)務(wù)日志文件會切割,切割后,讀取上一個切割的日志
import os
import sys
import json
import requests
import time
import re
cini = conf.ini'
log_file = logstash.log'
def readconf():
try:
with open(cini, 'r+') as f:
CONF = json.load(f)
except:
CONF = {"seek": 0, "inode": 922817, "last_file": logstash.log"}
writeconf(CONF=CONF)
print('conf.ini 配置文件缺失,自動創(chuàng)建一個新的配置文件')
return CONF
def writeconf(CONF):
with open(cini, 'w+') as e:
json.dump(CONF, e)
def read_log(log_file, seek):
try:
f = open(log_file, 'r')
except FileNotFoundError:
f = open(logstash.log', 'r')
seek = 0
print('上一個文件讀取失敗了,請檢查切割的日志文件')
except:
print('日志文件打開錯誤,退出程序')
sys.exit()
f.seek(seek)
line = f.readline()
new_seek = f.tell()
if new_seek == seek:
print('沒有追加日志,退出程序')
sys.exit()
while line:
try:
logstash = json.loads(line)
except:
CONF = {"seek": 0, "inode": 922817, "last_file": "/data/logs/lmrs/logstash.log"}
writeconf(CONF=CONF)
print('json數(shù)據(jù)加載錯誤,重新創(chuàng)建一個新的配置文件')
sys.exit()
#if '''re.search(time.strftime("%Y:%H:%M", time.localtime()), logstash.get('log_time')) and '''logstash.get('rtype') == 6 and logstash.get('uri') == '/publish' and logstash.get('event') == 0:
if logstash.get('rtype') == 6 and logstash.get('uri') == '/publish' and logstash.get('event') == 0:
value = 1
stream = logstash.get('name')
print('{} {}'.format(value, stream))
record(value=value, stream=stream)
else:
value = 0
stream = 0
line = f.readline()
seek = f.tell()
f.close
return value, stream, seek
def record(value, stream):
data = []
record = {}
record['metric'] = 'recording_high_availability_monitor'
record['endpoint'] = os.uname()[1]
record['timestamp'] = int(time.time())
record['step'] = 60
record['value'] = value
record['counterType'] = 'GAUGE'
record['Tags'] = '{}={}'.format(int(time.time()), stream)
data.append(record)
if data:
print('這是data的json數(shù)據(jù)')
print(data)
falcon_request = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(data))
#falcon_request = requests.post("http://127.0.0.1:1988/v1/push", json=data)
print('json參數(shù)請求返回狀態(tài)碼為:' + str(falcon_request.status_code))
print('json參數(shù)請求返回為:' + str(falcon_request.text))
if __name__ == '__main__':
print()
print('***************************************')
print('本次執(zhí)行腳本時間:{}'.format(time.strftime("%Y%m%d_%H%M", time.localtime())))
CONF = readconf()
print('first_CONF :{}'.format(CONF))
print('NO1.log_file',log_file)
last_inode = CONF['inode']
inode = os.stat(log_file).st_ino
print('last_inode: {} inode: {}'.format(last_inode, inode))
if inode == last_inode:
seek = CONF['seek']
next_file = 0
else:
log_file = CONF['last_file'] + time.strftime("-%Y%m%d_", time.localtime()) + str(time.strftime("%H%M", time.localtime()))[:-1] + '0'
next_file = 1
seek = CONF['seek']
print('NO2.log_file',log_file)
value, stream, seek = read_log(log_file=log_file,seek=seek)
if next_file:
CONF['seek'] = 0
else:
CONF['seek'] = seek
CONF['inode'] = os.stat(logstash.log').st_ino
writeconf(CONF=CONF)
print('last_CONF :{}'.format(CONF))
補充知識:logstash 調(diào)用exec
我就廢話不多說了,還是直接看代碼吧!
[elk@Vsftp logstash]$ cat t3.conf
input {
stdin {
}
}
filter {
grok {
match => [ "message","(?m)\s*%{TIMESTAMP_ISO8601:time}\s*(?<Level>(\S+)).*"]
}
date {
match => ["time", "yyyy-MM-dd HH:mm:ss,SSS"]
}
mutate {
add_field =>["type","tailong"]
add_field =>["messager","%{type}-%{message}"]
remove_field =>["message"]
}
}
output {
if ([Level] == "ERROR" or [messager] =~ "Exception" ) and [messager] !~ "溫金服務(wù)未連接" and [messager] !~ "調(diào)用溫金代理系統(tǒng)接口錯誤" and [messager] !~ "BusinessException" {
exec {
command => "/bin/smail.pl \"%{messager}\" \"%{type}\" "
}
}
stdout {
codec =>rubydebug
}
}
Vsftp:/root# cat /bin/smail.pl
#!/usr/bin/perl
use Net::SMTP;
use HTTP::Date qw(time2iso str2time time2iso time2isoz);
use Data::Dumper;
use Getopt::Std;
use vars qw($opt_d );
getopts('d:');
# mail_user should be your_mail@163.com
$message= "@ARGV";
$env="$opt_d";
sub send_mail{
my $CurrTime = time2iso(time());
my $to_address = shift;
my $mail_user = 'zhao.yangjian@163.com';
my $mail_pwd = 'xx';
my $mail_server = 'smtp.163.com';
my $from = "From: $mail_user\n";
my $subject = "Subject: zjcap info\n";
my $info = "$CurrTime--$message";
my $message = <<CONTENT;
$info
CONTENT
my $smtp = Net::SMTP->new($mail_server);
$smtp->auth($mail_user, $mail_pwd) || die "Auth Error! $!";
$smtp->mail($mail_user);
$smtp->to($to_address);
$smtp->data(); # begin the data
$smtp->datasend($from); # set user
$smtp->datasend($subject); # set subject
$smtp->datasend("\n\n");
$smtp->datasend("$message\n"); # set content
$smtp->dataend();
$smtp->quit();
};
send_mail ('zhao.yangjian@163.com');
2017-01-12 10:19:19,888 jjjjj Exception
{
"@version" => "1",
"@timestamp" => "2017-01-12T02:19:19.888Z",
"host" => "Vsftp",
"time" => "2017-01-12 10:19:19,888",
"Level" => "jjjjj",
"type" => "tailong",
"messager" => "tailong-2017-01-12 10:19:19,888 jjjjj Exception"
}
以上這篇python實時監(jiān)控logstash日志代碼就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn) 多進程導(dǎo)入CSV數(shù)據(jù)到 MySQL
本文給大家分享的是使用python實現(xiàn)多進程導(dǎo)入CSV文件數(shù)據(jù)到MySQL的思路方法以及具體的代碼分享,有相同需求的小伙伴可以參考下2017-02-02
python歐拉角和旋轉(zhuǎn)矩陣變換的實現(xiàn)示例
在計算機圖形學(xué)中,歐拉角和旋轉(zhuǎn)矩陣是描述物體旋轉(zhuǎn)的常用方法,本文主要介紹了python歐拉角和旋轉(zhuǎn)矩陣變換的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-03-03
python面向?qū)ο蠖嗑€程爬蟲爬取搜狐頁面的實例代碼
這篇文章主要介紹了python面向?qū)ο蠖嗑€程爬蟲爬取搜狐頁面的實例代碼,需要的朋友可以參考下2018-05-05
Python實現(xiàn)的人工神經(jīng)網(wǎng)絡(luò)算法示例【基于反向傳播算法】
這篇文章主要介紹了Python實現(xiàn)的人工神經(jīng)網(wǎng)絡(luò)算法,結(jié)合實例形式分析了Python基于反向傳播算法實現(xiàn)的人工神經(jīng)網(wǎng)絡(luò)相關(guān)操作技巧,需要的朋友可以參考下2017-11-11

