天天看點

Python 腳本學習(三),日志分析腳本,檔案差異對比,HTTP狀态檢測

日志分析腳本:

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 &gt;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&amp;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>"&lt;!DOCTYPE html&gt;"</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)&gt;</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