天天看点

Python基于nginx访问日志并统计IP访问量

一、Ningx日志如下:

1

2

3

4

5

<code>41.42.97.104 - - [26</code><code>/Feb/2015</code><code>:03:35:40 -0500] </code><code>"GET /root/ HTTP/1.1"</code> <code>301 20 </code><code>"http://baibai.123.com/09"</code> <code>"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36"</code> <code>- 0.562 </code>

<code>41.42.97.104 - - [26</code><code>/Feb/2015</code><code>:03:35:41 -0500] </code><code>"GET /crossadkla.xml HTTP/1.1"</code> <code>304 0 </code><code>"https://baibai.123.com/"</code> <code>"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36"</code> <code>- 0.000 </code>

<code>99.122.189.203 - - [26</code><code>/Feb/2015</code><code>:03:35:42 -0500] </code><code>"GET /root/ HTTP/1.1"</code> <code>301 20 </code><code>"http://baibai.123.com/11"</code> <code>"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36"</code> <code>- 0.562 </code>

<code>99.122.189.203  - - [26</code><code>/Feb/2015</code><code>:03:35:44 -0500] </code><code>"GET /crossadkla.xml HTTP/1.1"</code> <code>304 0 </code><code>"https://baibai.123.com/"</code> <code>"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36"</code> <code>- 0.000</code>

<code> </code><code>#wget  http://s.qdcdn.com/17mon/17monipdb.zip</code>

<code> </code><code>#unzip  17monipdb.zip</code>

三、IP库常见问题FAQ

 示例代码:

6

7

8

9

<code>import</code> <code>os</code>

<code>from</code> <code>ipip </code><code>import</code> <code>IP</code>

<code>from</code> <code>ipip </code><code>import</code> <code>IPX</code>

<code>IP.load(os.path.abspath(</code><code>"mydata4vipday2.dat"</code><code>))</code>

<code>print</code> <code>IP.find(</code><code>"118.28.8.8"</code><code>)</code>

<code>IPX.load(os.path.abspath(</code><code>"mydata4vipday2.datx"</code><code>))</code>

<code>print</code> <code>IPX.find(</code><code>"118.28.8.8"</code><code>)</code>

 执行输出:

<code>中国  天津  天津      鹏博士</code>

<code>中国  天津  天津      鹏博士   39.128399   117.185112  Asia</code><code>/Shanghai</code>   <code>UTC+8   120000</code>

四、Python 统计代码

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

<code>#encoding=utf8</code>

<code>import</code> <code>re,sys,os,csv,smtplib</code>

<code>from</code> <code>email </code><code>import</code> <code>encoders</code>

<code>from</code> <code>email.mime.multipart </code><code>import</code> <code>MIMEMultipart</code>

<code>from</code> <code>email.mime.base </code><code>import</code> <code>MIMEBase</code>

<code>from</code> <code>email.mime.text </code><code>import</code> <code>MIMEText</code>

<code>from</code> <code>optparse </code><code>import</code> <code>OptionParser</code>

<code>reload</code><code>(sys)</code>

<code>sys.setdefaultencoding(</code><code>'utf-8'</code><code>)</code>

<code>print</code> <code>sys.getdefaultencoding()</code>

<code>nginx_log_path</code><code>=</code><code>"/app/nginx/logs/apptest_www.access.log"</code>

<code>pattern </code><code>=</code> <code>re.</code><code>compile</code><code>(r</code><code>'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'</code><code>)</code>

<code>def</code> <code>stat_ip_views(log_path):</code>

<code>    </code><code>ret</code><code>=</code><code>{}</code>

<code>    </code><code>f </code><code>=</code> <code>open</code><code>(log_path, </code><code>"r"</code><code>)</code>

<code>    </code><code>for</code> <code>line </code><code>in</code> <code>f:</code>

<code>        </code><code>match </code><code>=</code> <code>pattern.match(line)</code>

<code>        </code><code>if</code> <code>match:</code>

<code>            </code><code>ip</code><code>=</code><code>match.group(</code><code>0</code><code>)</code>

<code>            </code><code>if</code> <code>ip </code><code>in</code> <code>ret:</code>

<code>                </code><code>views</code><code>=</code><code>ret[ip]</code>

<code>            </code><code>else</code><code>:</code>

<code>                </code><code>views</code><code>=</code><code>0</code>

<code>            </code><code>views</code><code>=</code><code>views</code><code>+</code><code>1</code>

<code>            </code><code>ret[ip]</code><code>=</code><code>views</code>

<code>    </code><code>return</code> <code>ret</code>

<code>    </code> 

<code>def</code> <code>run():</code>

<code>    </code><code>ip_views</code><code>=</code><code>stat_ip_views(nginx_log_path)</code>

<code>    </code><code>max_ip_view</code><code>=</code><code>{}</code>

<code>    </code><code>fileName</code><code>=</code><code>'out.csv'</code>

<code>    </code><code>f</code><code>=</code><code>open</code><code>(</code><code>'out.csv'</code><code>,</code><code>'w+'</code><code>)</code>

<code>    </code><code>b </code><code>=</code> <code>'IP,国家,访问数总数'</code>

<code>    </code><code>print</code> <code>&gt;&gt; f,b</code>

<code>    </code><code>for</code> <code>ip </code><code>in</code> <code>ip_views:</code>

<code>        </code><code>IP.load(os.path.abspath(</code><code>"17monipdb.dat"</code><code>))</code>

<code>        </code><code>count</code><code>=</code><code>IP.find(</code><code>"%s"</code><code>%</code> <code>(ip))</code>

<code>        </code><code>conut_s</code><code>=</code><code>count.split()</code>

<code>        </code><code>countery</code><code>=</code><code>conut_s[</code><code>0</code><code>]</code>

<code>        </code><code>views</code><code>=</code><code>ip_views[ip]</code>

<code>        </code><code>c </code><code>=</code> <code>'%s,%s,%s'</code> <code>%</code><code>(ip,countery,views)</code>

<code>        </code><code>print</code> <code>&gt;&gt; f,c</code>

<code>        </code><code>if</code> <code>len</code><code>(max_ip_view)</code><code>=</code><code>=</code><code>0</code><code>:</code>

<code>            </code><code>max_ip_view[ip]</code><code>=</code><code>views</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>_ip</code><code>=</code><code>max_ip_view.keys()[</code><code>0</code><code>]</code>

<code>            </code><code>_views</code><code>=</code><code>max_ip_view[_ip]</code>

<code>            </code><code>if</code> <code>views&gt;_views:</code>

<code>                </code><code>max_ip_view[ip]</code><code>=</code><code>views</code>

<code>                </code><code>max_ip_view.pop(_ip)</code>

<code>        </code><code>print</code> <code>"IP:"</code><code>, ip, </code><code>"国家:"</code><code>, countery, </code><code>"访问数:"</code><code>, views </code>

<code>        </code> 

<code>    </code><code>print</code> <code>"总共有多少IP:"</code><code>, </code><code>len</code><code>(ip_views)</code>

<code>    </code><code>print</code> <code>"最大访问IP数:"</code><code>, max_ip_view</code>

<code>    </code><code>g </code><code>=</code> <code>""</code>

<code>    </code><code>d </code><code>=</code> <code>'总共有多少IP:%s'</code> <code>%</code><code>(</code><code>len</code><code>(ip_views))</code>

<code>    </code><code>e </code><code>=</code> <code>'最大访问IP数:%s'</code> <code>%</code><code>(max_ip_view)</code>

<code>    </code><code>print</code> <code>&gt;&gt; f,g</code>

<code>    </code><code>print</code> <code>&gt;&gt; f,d</code>

<code>    </code><code>print</code> <code>&gt;&gt; f,e</code>

<code>def</code> <code>sendMail(html,emailaddress,mailSubject,from_address</code><code>=</code><code>"[email protected]"</code><code>):</code>

<code>        </code><code>mail_list</code><code>=</code><code>emailaddress.split(</code><code>","</code><code>)</code>

<code>        </code><code>msg</code><code>=</code><code>MIMEMultipart()</code>

<code>        </code><code>msg[</code><code>'Accept-Language'</code><code>]</code><code>=</code><code>'zh-CN'</code>

<code>        </code><code>msg[</code><code>'Accept-Charset'</code><code>]</code><code>=</code> <code>'ISO-8859-1,utf-8'</code>

<code>        </code><code>msg[</code><code>'From'</code><code>]</code><code>=</code><code>from_address</code>

<code>        </code><code>msg[</code><code>'to'</code><code>]</code><code>=</code><code>";"</code><code>.join(mail_list)</code>

<code>        </code><code>msg[</code><code>'Subject'</code><code>]</code><code>=</code><code>mailSubject.decode(</code><code>"utf-8"</code><code>)</code>

<code>        </code><code>txt</code><code>=</code><code>MIMEText(html,</code><code>'html'</code><code>,</code><code>'utf-8'</code><code>)</code>

<code>        </code><code>txt.set_charset(</code><code>'utf-8'</code><code>)</code>

<code>        </code><code>msg.attach(txt)</code>

<code>        </code><code>file</code><code>=</code><code>MIMEBase(</code><code>'application'</code><code>, </code><code>'octet-stream'</code><code>)</code>

<code>        </code><code>file</code><code>.set_payload(</code><code>open</code><code>(fileName, </code><code>'rb'</code><code>).read())</code>

<code>        </code><code>encoders.encode_base64(</code><code>file</code><code>)</code>

<code>        </code><code>file</code><code>.add_header(</code><code>'Content-Disposition'</code><code>, </code><code>'attachment; filename="%s"'</code> <code>%</code> <code>os.path.basename(fileName))</code>

<code>        </code><code>msg.attach(</code><code>file</code><code>)</code>

<code>        </code><code>smtp</code><code>=</code><code>smtplib.SMTP(</code><code>"mail.test.com"</code><code>)</code>

<code>        </code><code>smtp.sendmail(msg[</code><code>"From"</code><code>],mail_list,msg.as_string())</code>

<code>        </code><code>smtp.close()</code>

<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>

<code>    </code><code>run()</code>

<code>    </code><code>cmd </code><code>=</code> <code>'iconv -f UTF8 -t GB18030 %s -o %s.bak &amp;&amp; mv %s.bak %s'</code> <code>%</code><code>(fileName,fileName,fileName,fileName)</code>

<code>    </code><code>os.system(cmd)</code>

<code>    </code><code>Content</code><code>=</code> <code>'Dear ALL: &lt;br&gt; &amp;nbsp;&amp;nbsp; 附件内国家IP访问数据分析统计,请查收!  &lt;br&gt; &amp;nbsp;&amp;nbsp; 如有任何问题,请及时与我联系!'</code>

<code>    </code><code>Subject </code><code>=</code> <code>'[分析]国家创建数据IP分析统计'</code>

<code>    </code><code>sendMail(html</code><code>=</code><code>Content,emailaddress</code><code>=</code><code>'[email protected]'</code><code>,mailSubject</code><code>=</code><code>Subject)</code>

五、执行结果

<code>utf-8</code>

<code>IP: 41.42.97.104 国家: 埃及 访问数: 2</code>

<code>IP: 99.122.189.203 国家: 美国 访问数: 3</code>

<code>总共有多少IP: 2</code>

<code>最大访问IP数: {</code><code>'99.122.189.203'</code><code>: 3}</code>

六、邮件发送结果

<a href="http://s3.51cto.com/wyfs02/M02/59/E6/wKioL1Tu5XmwRhZ6AACUl5-Zu80979.jpg" target="_blank"></a>

本文转自 kuangling 51CTO博客,原文链接:http://blog.51cto.com/kling/1615505