上次使用sftp.get同步遠端目錄,現在需要用python合并日志
别人很早就寫出來了
<code>收集Tomcat異常日志并發送郵件</code>
<code>http:</code><code>/</code><code>/</code><code>linux5588.blog.</code><code>51cto</code><code>.com</code><code>/</code><code>65280</code><code>/</code><code>1208951</code>
<code>#!/usr/bin/env python</code>
<code># coding=utf-8</code>
<code> </code>
<code>#---------------------------------------------------------</code>
<code># Name: Tomcat錯誤日志發送郵件腳本</code>
<code># Purpose: 收集Tomcat異常日志并發送郵件</code>
<code># Version: 1.0</code>
<code># Author: LEO</code>
<code># BLOG: http://linux5588.blog.51cto.com</code>
<code># EMAIL: [email protected]</code>
<code># Created: 2013-05-22</code>
<code># Copyright: (c) LEO 2013</code>
<code># Python: 2.7/2.4 皆可使用</code>
<code>#--------------------------------------------------------</code>
<code>from</code> <code>smtplib </code><code>import</code> <code>SMTP</code>
<code>from</code> <code>email </code><code>import</code> <code>MIMEText</code>
<code>from</code> <code>email </code><code>import</code> <code>Header</code>
<code>from</code> <code>os.path </code><code>import</code> <code>getsize</code>
<code>from</code> <code>sys </code><code>import</code> <code>exit</code>
<code>from</code> <code>re </code><code>import</code> <code>compile</code><code>, IGNORECASE</code>
<code>#定義主機 帳号 密碼 收件人 郵件主題</code>
<code>smtpserver </code><code>=</code> <code>'smtp.163.com'</code>
<code>sender </code><code>=</code> <code>'帳号/發件人'</code>
<code>password </code><code>=</code> <code>'密碼'</code>
<code>receiver </code><code>=</code> <code>(</code><code>'收件人1'</code><code>,</code><code>'收件人2'</code><code>,)</code>
<code>subject </code><code>=</code> <code>u</code><code>'Web伺服器Tomcat日志錯誤資訊'</code>
<code>From </code><code>=</code> <code>u</code><code>'xxx Web伺服器'</code>
<code>To </code><code>=</code> <code>u</code><code>'伺服器管理者'</code>
<code>#定義tomcat日志檔案位置</code>
<code>tomcat_log </code><code>=</code> <code>'/home/back/catalina.out'</code>
<code>#該檔案是用于記錄上次讀取日志檔案的位置,執行腳本的使用者要有建立該檔案的權限</code>
<code>last_position_logfile </code><code>=</code> <code>'/home/back/last_position.txt'</code>
<code>error_list_logfile</code><code>=</code><code>'/home/back/error_list.txt'</code>
<code>#比對的錯誤資訊關鍵字的正規表達式</code>
<code>pattern </code><code>=</code> <code>compile</code><code>(r</code><code>'Exception|^\t+\bat\b'</code><code>,IGNORECASE)</code>
<code>#發送郵件函數</code>
<code>def</code> <code>send_mail(error):</code>
<code> </code><code>#定義郵件的頭部資訊</code>
<code> </code><code>header </code><code>=</code> <code>Header.Header</code>
<code> </code><code>msg </code><code>=</code> <code>MIMEText.MIMEText(error,</code><code>'plain'</code><code>,</code><code>'utf-8'</code><code>)</code>
<code> </code><code>msg[</code><code>'From'</code><code>] </code><code>=</code> <code>header(From)</code>
<code> </code><code>msg[</code><code>'To'</code><code>] </code><code>=</code> <code>header(To)</code>
<code> </code><code>msg[</code><code>'Subject'</code><code>] </code><code>=</code> <code>header(subject</code><code>+</code><code>'\n'</code><code>)</code>
<code> </code><code>#連接配接SMTP伺服器,然後發送資訊</code>
<code> </code><code>smtp </code><code>=</code> <code>SMTP(smtpserver)</code>
<code> </code><code>smtp.login(sender, password)</code>
<code> </code><code>smtp.sendmail(sender, receiver, msg.as_string())</code>
<code> </code><code>smtp.close()</code>
<code>#讀取上一次日志檔案的讀取位置</code>
<code>def</code> <code>get_last_position(</code><code>file</code><code>):</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>data </code><code>=</code> <code>open</code><code>(</code><code>file</code><code>,</code><code>'r'</code><code>)</code>
<code> </code><code>last_position </code><code>=</code> <code>data.readline()</code>
<code> </code><code>if</code> <code>last_position:</code>
<code> </code><code>last_position </code><code>=</code> <code>int</code><code>(last_position)</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>last_position </code><code>=</code> <code>0</code>
<code> </code><code>except</code><code>:</code>
<code> </code><code>last_position </code><code>=</code> <code>0</code>
<code> </code><code>return</code> <code>last_position</code>
<code>#寫入本次日志檔案的本次位置</code>
<code>def</code> <code>write_this_position(</code><code>file</code><code>,last_positon):</code>
<code> </code><code>data </code><code>=</code> <code>open</code><code>(</code><code>file</code><code>,</code><code>'w'</code><code>)</code>
<code> </code><code>data.write(</code><code>str</code><code>(last_positon))</code>
<code> </code><code>data.write(</code><code>'\n'</code> <code>+</code> <code>"Don't Delete This File,It is Very important for Looking Tomcat Error Log !! \n"</code><code>)</code>
<code> </code><code>data.close()</code>
<code> </code><code>print</code> <code>"Can't Create File !"</code> <code>+</code> <code>file</code>
<code> </code><code>exit()</code>
<code>#分析檔案找出異常的行</code>
<code>def</code> <code>analysis_log(</code><code>file</code><code>):</code>
<code> </code><code>error_list </code><code>=</code> <code>[] </code>
<code> </code>
<code> </code><code>last_position </code><code>=</code> <code>get_last_position(last_position_logfile)</code>
<code> </code><code>this_postion </code><code>=</code> <code>getsize(tomcat_log)</code>
<code> </code><code>if</code> <code>this_postion < last_position:</code>
<code> </code><code>data.seek(</code><code>0</code><code>)</code>
<code> </code><code>elif</code> <code>this_postion </code><code>=</code><code>=</code> <code>last_position:</code>
<code> </code><code>elif</code> <code>this_postion > last_position:</code>
<code> </code><code>data.seek(last_position)</code>
<code> </code><code>for</code> <code>line </code><code>in</code> <code>data:</code>
<code> </code><code>if</code> <code>pattern.search(line):</code>
<code> </code><code>error_list.append(line)</code>
<code> </code>
<code> </code><code>write_this_position(last_position_logfile,data.tell())</code>
<code> </code><code>data.close()</code>
<code> </code><code>return</code> <code>''.join(error_list)</code>
<code>def</code> <code>writeToTxt(list_name,file_path):</code>
<code> </code><code>fp </code><code>=</code> <code>open</code><code>(file_path,</code><code>"w+"</code><code>)</code>
<code> </code><code>for</code> <code>item </code><code>in</code> <code>list_name:</code>
<code> </code><code>fp.write(</code><code>str</code><code>(item)</code><code>+</code><code>"\n"</code><code>)</code>
<code> </code><code>fp.close()</code>
<code> </code><code>except</code> <code>IOError:</code>
<code> </code><code>print</code><code>(</code><code>"fail to open file"</code><code>)</code>
<code>#調用發送郵件函數發送郵件</code>
<code>error_info </code><code>=</code> <code>analysis_log(tomcat_log)</code>
<code>writeToTxt(erro_info,error_list_logfile)</code>
自己模仿寫的
<code>import</code> <code>os</code>
<code>tomcat_log </code><code>=</code> <code>'/home/python/12/'</code>
<code>last_position_logfile </code><code>=</code> <code>'/home/python/last_position.txt'</code>
<code>error_list_logfile</code><code>=</code><code>'/home/python/error_list.txt'</code>
<code> </code><code>data </code><code>=</code> <code>open</code><code>(</code><code>file</code><code>,</code><code>'a'</code><code>)</code>
<code> </code><code>data.write(</code><code>str</code><code>(last_positon) </code><code>+</code> <code>'\n'</code><code>)</code>
<code> </code><code>#data.write('\n' + "Don't Delete This File,It is Very important for Looking Tomcat Error Log !! \n")</code>
<code> </code>
<code> </code><code>#last_position = get_last_position(last_position_logfile)</code>
<code> </code><code>last_position </code><code>=</code> <code>0</code>
<code> </code><code>this_postion </code><code>=</code> <code>getsize(</code><code>file</code><code>)</code>
<code> </code>
<code>def</code> <code>walk(local_dir):</code>
<code> </code><code>for</code> <code>root, dirs, files </code><code>in</code> <code>os.walk(local_dir):</code>
<code> </code><code>for</code> <code>filespath </code><code>in</code> <code>files:</code>
<code> </code><code>#return filespath</code>
<code> </code><code>local_file </code><code>=</code> <code>os.path.join(root,filespath)</code>
<code> </code><code>#error_info2 = analysis_log('/home/python/12/xx.log')</code>
<code> </code><code>#print error_info2</code>
<code> </code><code>error_info </code><code>=</code> <code>analysis_log(local_file)</code>
<code> </code><code>fp </code><code>=</code> <code>open</code><code>(error_list_logfile,</code><code>"a+"</code><code>)</code>
<code> </code><code>fp.write(error_info)</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>walk(tomcat_log)</code>
<code> </code><code>#調用發送郵件函數發送郵件</code>
<code> </code><code>#error_info = analysis_log(tomcat_log)</code>
<code> </code><code>#writeToTxt(error_info,error_list_logfile)</code>
<code> </code><code>#fp = open(error_list_logfile,"w+")</code>
<code> </code><code>#fp.write(str(error_info))</code>
第二版
生成zabbix監控,隻是監控異常數量,沒有過濾exception
先執行第一個腳本,生成資料
<code># !/usr/bin/env python</code>
<code>#-*-coding:utf-8-*-</code>
<code>import</code> <code>sys</code>
<code>import</code> <code>time</code>
<code>import</code> <code>datetime</code>
<code>import</code> <code>string</code>
<code>tomcat_log </code><code>=</code> <code>'/home/logs/'</code>
<code>last_position_logfile </code><code>=</code> <code>'/home/back/test/last_position.txt'</code>
<code>error_list_logfile </code><code>=</code> <code>'/home/back/test/error_list.txt'</code>
<code>pattern </code><code>=</code> <code>compile</code><code>(r</code><code>'Exception|^\t+\bat\b'</code><code>, IGNORECASE)</code>
<code>fp </code><code>=</code> <code>open</code><code>(error_list_logfile, </code><code>"w+"</code><code>)</code>
<code>def</code> <code>writeToTxt(list_name, file_path):</code>
<code> </code><code>fp </code><code>=</code> <code>open</code><code>(file_path, </code><code>"a+"</code><code>)</code>
<code> </code><code>fp.write(</code><code>str</code><code>(item) </code><code>+</code> <code>"\n"</code><code>)</code>
<code># 分析檔案找出異常的行</code>
<code> </code><code>#parent_file = os.path.dirname(file)</code>
<code> </code><code>error_list </code><code>=</code> <code>[]</code>
<code> </code><code>data </code><code>=</code> <code>open</code><code>(</code><code>file</code><code>, </code><code>'r'</code><code>)</code>
<code> </code><code>error_list.append(</code><code>file</code><code>)</code>
<code> </code><code>break</code>
<code> </code><code>if</code> <code>len</code><code>(error_list)</code><code>=</code><code>=</code><code>1</code><code>:</code>
<code> </code><code>#return ''.join(error_list)</code>
<code> </code><code>writeToTxt(error_list,error_list_logfile)</code>
<code> </code><code>#return error_list</code>
<code> </code><code>#if errors_list == 1:</code>
<code> </code><code>#print "%s num is %d" %(file,errors_list)</code>
<code> </code><code>#print ''.join(errors_list)</code>
<code> </code><code># return filespath</code>
<code> </code><code>local_file </code><code>=</code> <code>os.path.join(root, filespath)</code>
<code> </code><code># print error_info2</code>
<code>def</code> <code>walk_dir(home_dir):</code>
<code> </code><code>homedir</code><code>=</code><code>[]</code>
<code> </code><code>for</code> <code>root, dirs, files </code><code>in</code> <code>os.walk(home_dir):</code>
<code> </code><code>for</code> <code>dirname </code><code>in</code> <code>dirs:</code>
<code> </code><code>local_dir </code><code>=</code> <code>os.path.join(root, dirname)</code>
<code> </code><code>now </code><code>=</code> <code>datetime.datetime.now()</code>
<code> </code><code>strdatetime </code><code>=</code> <code>now.strftime(</code><code>"%Y/%m/%d"</code><code>)</code>
<code> </code><code>Date</code><code>=</code><code>now.strftime(</code><code>"%d"</code><code>)</code>
<code> </code><code>#print "Date is %s" %Date</code>
<code> </code><code>result </code><code>=</code> <code>string.find(local_dir,strdatetime)!</code><code>=</code><code>-</code><code>1</code>
<code> </code><code>if</code> <code>result:</code>
<code> </code><code>#print local_dir.count('/')</code>
<code> </code><code>if</code> <code>local_dir.count(</code><code>'/'</code><code>)</code><code>=</code><code>=</code><code>8</code><code>:</code>
<code> </code><code>homedir.append(local_dir)</code>
<code> </code><code>return</code> <code>homedir</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>: </code>
<code> </code><code>tomcat_last_dir</code><code>=</code><code>walk_dir(tomcat_log)</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>tomcat_last_dir:</code>
<code> </code><code>walk(i)</code>
2.zabbix腳本兩個
python以後都可以這樣寫
<code>import</code> <code>json</code>
<code>file</code> <code>=</code> <code>'/home/back/test/error_list.txt'</code>
<code>error_list</code><code>=</code><code>[]</code>
<code>service</code><code>=</code><code>[]</code>
<code>try</code><code>:</code>
<code> </code><code>data </code><code>=</code> <code>open</code><code>(</code><code>file</code><code>, </code><code>'r'</code><code>)</code>
<code>except</code><code>:</code>
<code> </code><code>exit()</code>
<code>for</code> <code>line </code><code>in</code> <code>data:</code>
<code> </code><code>error_list.append(line.split(</code><code>'/'</code><code>)[</code><code>8</code><code>])</code>
<code> </code><code>#service.append(line.split('/')[3])</code>
<code>news_error_list </code><code>=</code> <code>list</code><code>(</code><code>set</code><code>(error_list))</code>
<code>#news_service = list(set(service))</code>
<code>#print news_error_list</code>
<code>#print news_service</code>
<code>javas</code><code>=</code><code>[]</code>
<code>for</code> <code>x </code><code>in</code> <code>news_error_list:</code>
<code> </code><code>javas.append({</code><code>'{#EXCEPTION}'</code><code>:x.strip(</code><code>'\n'</code><code>)})</code>
<code>print</code> <code>json.dumps({</code><code>'data'</code><code>:javas},indent</code><code>=</code><code>4</code><code>,separators</code><code>=</code><code>(</code><code>','</code><code>,</code><code>':'</code><code>))</code>
<code>if</code> <code>len</code><code>(sys.argv) </code><code>=</code><code>=</code> <code>2</code><code>:</code>
<code> </code><code>argv1 </code><code>=</code> <code>sys.argv[</code><code>1</code><code>]</code>
<code> </code><code>print</code> <code>error_list.count(argv1)</code>
<code>else</code><code>:</code>
<code> </code><code>print</code> <code>-</code><code>1</code>
标記一些常用寫法
result = string.find(local_dir,strdatetime)!=-1
news_error_list = list(set(error_list))
print error_list.count(argv1)
python将數組寫入檔案
fp = open(error_list_logfile,"w+")
fp.write(str(error_info))
這些腳本,主要的作用就是針對每個檔案,過濾帶有exception的檔案并在grafana顯示。
本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1861459,如需轉載請自行聯系原作者