日志分析腳本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<code>#!/usr/local/python27/bin/python2.7</code>
<code># coding=utf-8</code>
<code>import</code> <code>pygal</code>
<code>import</code> <code>re</code>
<code>import</code> <code>os</code>
<code>import</code> <code>sys</code>
<code>import</code> <code>datetime</code>
<code>BASE_PATH </code><code>=</code> <code>"./"</code>
<code>def</code> <code>extract(path):</code>
<code> </code><code>ip </code><code>=</code> <code>dict</code><code>()</code>
<code> </code><code>time </code><code>=</code> <code>dict</code><code>()</code>
<code> </code><code>status </code><code>=</code> <code>dict</code><code>()</code>
<code> </code><code>version </code><code>=</code> <code>dict</code><code>()</code>
<code> </code><code>method </code><code>=</code> <code>dict</code><code>()</code>
<code> </code><code>with </code><code>open</code><code>(path) as f:</code>
<code> </code><code>for</code> <code>line </code><code>in</code> <code>f:</code>
<code> </code><code>matched </code><code>=</code> <code>reobj.search(line)</code>
<code> </code><code>if</code> <code>not</code> <code>matched:</code>
<code> </code><code>continue</code>
<code> </code><code>log_obj </code><code>=</code> <code>matched.groupdict()</code>
<code> </code><code>if</code> <code>log_obj.get(</code><code>"ip"</code><code>) </code><code>not</code> <code>in</code> <code>ip.keys():</code>
<code> </code><code>ip[log_obj.get(</code><code>"ip"</code><code>)] </code><code>=</code> <code>0</code>
<code> </code><code>ip[log_obj.get(</code><code>"ip"</code><code>)] </code><code>+</code><code>=</code> <code>1</code>
<code> </code><code>origin_time </code><code>=</code> <code>log_obj.get(</code><code>"time"</code><code>)</code>
<code> </code><code>if</code> <code>not</code> <code>origin_time:</code>
<code> </code><code>dt </code><code>=</code> <code>datetime.datetime.strptime(origin_time,</code><code>'%d/%b/%Y:%H:%M:%S'</code><code>)</code>
<code> </code><code>dt_s </code><code>=</code> <code>dt.strftime(</code><code>'%Y-%m-%d %H'</code><code>)</code>
<code> </code><code>if</code> <code>dt_s </code><code>not</code> <code>in</code> <code>time.keys():</code>
<code> </code><code>time[dt_s] </code><code>=</code> <code>0</code>
<code> </code><code>time[dt_s] </code><code>+</code><code>=</code> <code>1</code>
<code> </code><code>if</code> <code>log_obj.get(</code><code>'status'</code><code>) </code><code>not</code> <code>in</code> <code>status.keys():</code>
<code> </code><code>status[log_obj.get(</code><code>'status'</code><code>)] </code><code>=</code> <code>0</code>
<code> </code><code>status[log_obj.get(</code><code>'status'</code><code>)] </code><code>+</code><code>=</code> <code>1</code>
<code> </code><code>if</code> <code>log_obj.get(</code><code>'version'</code><code>) </code><code>not</code> <code>in</code> <code>version.keys():</code>
<code> </code><code>version[log_obj.get(</code><code>'version'</code><code>)] </code><code>=</code> <code>0</code>
<code> </code><code>version[log_obj.get(</code><code>'version'</code><code>)] </code><code>+</code><code>=</code> <code>1</code>
<code> </code><code>if</code> <code>log_obj.get(</code><code>"method"</code><code>) </code><code>not</code> <code>in</code> <code>method.keys():</code>
<code> </code><code>method[log_obj.get(</code><code>"method"</code><code>)] </code><code>=</code> <code>0</code>
<code> </code><code>method[log_obj.get(</code><code>"method"</code><code>)] </code><code>+</code><code>=</code> <code>1</code>
<code> </code><code>return</code> <code>ip,time,status,version,method</code>
<code>def</code> <code>make_path(dt):</code>
<code> </code><code>path </code><code>=</code> <code>os.path.join(BASE_PATH,dt)</code>
<code> </code><code>if</code> <code>not</code> <code>os.path.exists(path):</code>
<code> </code><code>os.makedirs(path)</code>
<code> </code><code>return</code> <code>path</code>
<code>def</code> <code>time_graph(time,dt):</code>
<code> </code><code>chart </code><code>=</code> <code>pygal.Bar()</code>
<code> </code><code>chart.title </code><code>=</code> <code>"Access of %s"</code> <code>%</code> <code>dt</code>
<code> </code><code>keys </code><code>=</code> <code>[</code><code>'%s %2d'</code> <code>%</code> <code>(dt,x) </code><code>for</code> <code>x </code><code>in</code> <code>range</code><code>(</code><code>24</code><code>)]</code>
<code> </code><code>values </code><code>=</code> <code>[time.get(key) </code><code>for</code> <code>key </code><code>in</code> <code>keys]</code>
<code> </code><code>chart.x_labels </code><code>=</code> <code>[x.split()[</code><code>1</code><code>] </code><code>for</code> <code>x </code><code>in</code> <code>keys]</code>
<code> </code><code>chart.add(</code><code>"Access"</code><code>,values)</code>
<code> </code><code>path </code><code>=</code> <code>make_path(dt)</code>
<code> </code><code>chart.render_to_file(os.path.join(path,</code><code>"time.svg"</code><code>))</code>
<code>def</code> <code>status_graph(status,dt):</code>
<code> </code><code>chart </code><code>=</code> <code>pygal.Pie()</code>
<code> </code><code>chart.title </code><code>=</code> <code>"Status of %s"</code> <code>%</code> <code>dt</code>
<code> </code><code>for</code> <code>k,v </code><code>in</code> <code>status.items():</code>
<code> </code><code>chart.add(k,v)</code>
<code> </code><code>chart.render_to_file(os.path.join(path,</code><code>"status.svg"</code><code>))</code>
<code>def</code> <code>version_graph(vsersion,dt):</code>
<code> </code><code>chart.title </code><code>=</code> <code>"versions of %s"</code> <code>%</code> <code>dt</code>
<code> </code><code>for</code> <code>k,v </code><code>in</code> <code>version.items():</code>
<code> </code><code>chart.render_to_file(os.path.join(path,</code><code>"version.svg"</code><code>))</code>
<code>def</code> <code>method_graph(method,dt):</code>
<code> </code><code>chart.title </code><code>=</code> <code>"methods of %s"</code> <code>%</code> <code>dt</code>
<code> </code><code>for</code> <code>k,v </code><code>in</code> <code>method.items():</code>
<code> </code><code>chart.render_to_file(os.path.join(path,</code><code>"method.svg"</code><code>))</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>log_file </code><code>=</code> <code>sys.argv[</code><code>1</code><code>]</code>
<code> </code><code>dt </code><code>=</code> <code>sys.argv[</code><code>2</code><code>]</code>
<code> </code><code>ip,time,status,version,method </code><code>=</code> <code>extract(log_file)</code>
<code> </code><code>time_graph(time,dt)</code>
<code> </code><code>status_graph(status,dt)</code>
<code> </code><code>version_graph(version,dt)</code>
<code> </code><code>method_graph(method,dt)</code>
檔案差異對比:
<code>import</code> <code>difflib</code>
<code>try</code><code>:</code>
<code> </code><code>textfile1</code><code>=</code><code>sys.argv[</code><code>1</code><code>]</code>
<code> </code><code>textfile2</code><code>=</code><code>sys.argv[</code><code>2</code><code>]</code>
<code>except</code> <code>e:</code>
<code> </code><code>print</code><code>(</code><code>"Error:"</code> <code>+</code> <code>str</code><code>(e))</code>
<code> </code><code>sys.exit()</code>
<code>def</code> <code>readfile(filename):</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>fileHandle </code><code>=</code> <code>open</code><code>(filename,</code><code>'rb'</code><code>)</code>
<code> </code><code>text</code><code>=</code><code>fileHandle.read().splitlines()</code>
<code> </code><code>fileHandle.close()</code>
<code> </code><code>return</code> <code>text</code>
<code> </code><code>except</code> <code>IOError as a:</code>
<code> </code><code>print</code><code>(</code><code>"Error:"</code> <code>+</code> <code>str</code><code>(a))</code>
<code> </code><code>sys.exit()</code>
<code>if</code> <code>textfile1 </code><code>=</code><code>=</code><code>"</code><code>" or textfile2=="</code><code>":</code>
<code> </code><code>print</code><code>(</code><code>'Usage:filediif.py filename1 filename2'</code><code>)</code>
<code>text1_lines </code><code>=</code> <code>readfile(textfile1)</code>
<code>text2_lines </code><code>=</code> <code>readfile(textfile2)</code>
<code>d </code><code>=</code> <code>difflib.HtmlDiff()</code>
<code>a </code><code>=</code> <code>d.make_file(text1_lines,text2_lines)</code>
<code>print</code><code>(a)</code>
輸出結果:
./filediff.py aa1.txt aa2.txt >diff.html
<a href="http://s3.51cto.com/wyfs02/M00/73/3F/wKioL1X4yHCRLwFyAACXbe1qGgE183.jpg" target="_blank"></a>
HTTP通路腳本
<code>import</code> <code>urllib2</code>
<code>req </code><code>=</code> <code>urllib2.urlopen(</code><code>'http://weather.yahooapis.com/forecastrss?w=2151849&u=c'</code><code>)</code>
<code>print</code><code>(req.read())</code>
HTTP狀态檢測—适用于單域名多主機DNS負載均衡場景
<code>import</code> <code>dns.resolver</code>
<code>import</code> <code>httplib</code>
<code>iplist </code><code>=</code> <code>[]</code>
<code>appdomain</code><code>=</code><code>'www.hello.com'</code>
<code>def</code> <code>get_iplist(domain</code><code>=</code><code>""):</code>
<code> </code><code>A </code><code>=</code> <code>dns.resolver.query(domain,</code><code>'A'</code><code>)</code>
<code> </code><code>except</code> <code>e:</code>
<code> </code><code>print</code><code>(</code><code>"dns resolver error:"</code> <code>+</code> <code>str</code><code>(e))</code>
<code> </code><code>return</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>A.response.answer:</code>
<code> </code><code>for</code> <code>j </code><code>in</code> <code>i.items:</code>
<code> </code><code>iplist.append(j.address)</code>
<code> </code><code>return</code> <code>True</code>
<code>def</code> <code>checkip(ip):</code>
<code> </code><code>checkurl</code><code>=</code><code>ip</code><code>+</code><code>":80"</code>
<code> </code><code>getcontent</code><code>=</code><code>""</code>
<code> </code><code>httplib.socket.setdefaulttimeout(</code><code>5</code><code>)</code>
<code> </code><code>conn</code><code>=</code><code>httplib.HTTPConnection(checkurl)</code>
<code> </code><code>conn.request(</code><code>"GET"</code><code>,</code><code>"/"</code><code>,headers </code><code>=</code> <code>{</code><code>"Host"</code><code>: appdomain})</code>
<code> </code><code>r </code><code>=</code> <code>conn.getresponse()</code>
<code> </code><code>getcontent </code><code>=</code> <code>r.read(</code><code>15</code><code>)</code>
<code> </code><code>finally</code><code>:</code>
<code> </code><code>if</code> <code>getcontent </code><code>=</code><code>=</code> <code>"<!DOCTYPE html>"</code><code>:</code>
<code> </code><code>print</code> <code>(ip</code><code>+</code><code>" [OK]"</code><code>)</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code> <code>(ip</code><code>+</code><code>" [Error]"</code><code>)</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>
<code> </code><code>if</code> <code>get_iplist(appdomain) </code><code>and</code> <code>len</code><code>(iplist)></code><code>0</code><code>:</code>
<code> </code><code>for</code> <code>ip </code><code>in</code> <code>iplist:</code>
<code> </code><code>checkip(ip)</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>print</code><code>(</code><code>"dns resolver error"</code><code>)</code>
DNS解析腳本
<code>#!/usr/local/python3/bin/python3</code>
<code>domain </code><code>=</code> <code>input</code><code>(</code><code>'please input an domain: '</code><code>)</code>
<code>A </code><code>=</code> <code>dns.resolver.query(domain,</code><code>'A'</code><code>)</code>
<code>for</code> <code>i </code><code>in</code> <code>A.response.answer:</code>
<code> </code><code>for</code> <code>j </code><code>in</code> <code>i.items:</code>
<code> </code><code>print</code><code>(j.address)</code>
MX記錄解析
<code>#這裡接收兩個參數的傳入,需要解析的域名,解析的記錄類型;</code>
<code>MX </code><code>=</code> <code>dns.resolver.query(domain,</code><code>'MX'</code><code>)</code>
<code>for</code> <code>i </code><code>in</code> <code>MX:</code>
<code> </code><code>print</code><code>(</code><code>'MX preference ='</code><code>, i.preference, </code><code>'mail exchanger = '</code><code>, i.exchange)</code>
本文轉自qw87112 51CTO部落格,原文連結:http://blog.51cto.com/tchuairen/1695204