在企业中,从日志中提取数据进行分析,可以帮助企业更加了解用户行为,用户最感兴趣的产品或者内容,分析得到数据后,可以决定企业在今后的走向。

从这些日志数据中,比较重要的有:

1. 用户访问最多的url,即用户在企业网站最感兴趣的产品或者内容

2. 用户群体的的主要线路是什么?移动?联通?电信?

3. 用户访问的高峰期是什么时候?最高PV(访问量)、UV(独立访客)、IP(独立IP)。

4. 各时段状态码数。比如304,表示静态资源在没有发生改变时,服务器要求客户使用了浏览器本地的缓存,可以降低服务器流量负载等。403、404如果异常得出现很多,则要根据访问得url来判断是否有恶意用户在对网站目录进行扫描和探测。400、500等状态码很多的情况就需要运维人员及时分析并排查原因。

5. 客户浏览器的名称、版本。统计出各种浏览器的分布情况,比如:如果手机浏览器、IE 6.0版本浏览器访问记录很多,则大概可以判断出用户群体大概的操作系统是winXP,win7以上版本,或是手机访问。那就需要考虑是否要对特定版本浏览器进行页面优化,或者如果客户是手机浏览器,那是否要压缩网站页面大小,降低流量消耗,亦或是否要对手机端优化,提升用户体验,牢牢得抓住客户。。

这里涉及部分SEO方面知识,仅作了解即可,如果企业真正需要了,再深入学习。

下面的例子对访问状态码和浏览器名称、版本进行了统计,以引出日志分析、数据挖掘的重要性:

import datetime
import re
from queue import Queue
import threading
from pathlib import Path
from user_agents import parse
from collections import defaultdict # 正则,文件读取,时间窗口,队列,多线程,高阶函数,分发器,嵌套函数 logline = '''183.60.212.153 - - [19/Feb/2013:10:23:29 +0800] "GET /o2o/media.html?menu=3 HTTP/1.1" 200 16691 "-" "Mozilla/5.0 (compatible; EasouSpider; +http://www.easou.com/search/spider.html)"''' pattern = '''(?P<remote_addr>[\d\.]{7,}) - - (?:\[(?P<datetime>[^\[\]]+)\]) "(?P<request>[^"]+)" (?P<status>\d+) (?P<size>\d+) "[^"]+" "(?P<useragent>[^"]+)"''' # 数据源处理
ops = {
'datetime': lambda timestr: datetime.datetime.strptime(timestr, "%d/%b/%Y:%H:%M:%S %z"),
'request': lambda request: dict(zip(('method', 'url', 'protocol'), request.split())),
'status': int,
'size': int,
'useragent': lambda useragent: parse(useragent)
} regex = re.compile(pattern) def extract(line):
matcher = regex.match(line)
if matcher:
return {k: ops.get(k, lambda x: x)(v) for k, v in matcher.groupdict().items()} def openfile(path:str):
with open(path) as f:
for line in f:
fields = extract(line)
if fields:
yield fields # return generator objects,next(load(path))
else:
# TODO 不合格数据有哪些
continue # TODO 解析失败就抛弃,或者打印日志 def load(*paths):
'''装载日志文件或路径'''
for item in paths:
p = Path(item)
if not p.exists():
continue if p.is_dir():
for file in p.iterdir():
if file.is_file():
yield from openfile(str(file))
elif p.is_file():
yield from openfile(str(p)) def window(src:Queue, handler, width: int, interval: int):
'''
窗口函数
:param src: 数据源,生成器,用来拿数据
:param handler: 数据处理函数
:param width: 时间窗口宽度,秒
:param interval: 处理时间间隔,秒/ 时间偏移量,秒
:return:
''' start = datetime.datetime.strptime('1970/01/01 01:01:01 +0800', '%Y/%m/%d %H:%M:%S %z')
current = datetime.datetime.strptime('1970/01/01 01:01:02 +0800', '%Y/%m/%d %H:%M:%S %z')
delta = datetime.timedelta(seconds=width-interval) buffer = [] #窗口里的待计算数据 while True: #while True方式迭代queue
# 从数据源获取数据
data = src.get() # block阻塞的 if data:
buffer.append(data)
current = data['datetime'] if (current - start).total_seconds() >= interval:
ret = handler(buffer) # 如何处理
print("{}".format(ret)) start = current buffer = [i for i in buffer if i['datetime'] > current - delta] def donothing_handler(iterable:list):
# print(iterable)
return iterable # 状态码时间段百分比分析
def status_handler(iterable:list):
d = {}
for item in iterable:
key = item['status']
if key not in d:
d[key] = 0
d[key] += 1 total= sum(d.values())
return {'{}: {:.2f}%'.format(k,v/total*100) for k,v in d.items()} # 浏览器分析函数
ua_dict = defaultdict(lambda : 0) # 作用域改为全局之后,字典递增保存所有ua及其版本
def browser_handler(iterable):
for item in iterable:
ua = item['useragent']
key = (ua.browser.family, ua.browser.version_string)
ua_dict[key] += 1
return ua_dict # 分发器,嵌套函数
def dispatcher(src):
queues = [] # 队列列表
threads = [] # 线程管理 def reg(handler, width, interval):
q = Queue() # 分配队列
queues.append(q) # 方便调用 t = threading.Thread(target=window,args=(q, handler, width, interval))
threads.append(t) def run():
for t in threads:
t.start() for x in src:
for q in queues:
q.put(x) return reg,run reg,run = dispatcher(load('test.log')) # reg注册 窗口
# reg(donothing_handler, 10, 5) #注册测试
# reg(status_handler, 10, 5) # 注册状态码处理函数
reg(browser_handler, 60, 60) # 注册useragent处理函数,注意时间窗口宽度 run()

  

Python 日志处理(三) 日志状态码分析、浏览器分析的更多相关文章

  1. 利用python完成多个url状态码的检测

    import re import requests import json from threading import Thread,Lock from concurrent.futures impo ...

  2. HTTP协议图--HTTP 响应状态码(重点分析)

    1. 状态码概述 HTTP 状态码负责表示客户端 HTTP 请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作. HTTP 状态码如 200 OK ,以 3 位数字和原因短语组成.数字中 ...

  3. HTTP学习记录:三、状态码

    学习资源主要为:@小坦克HTTP相关博客 常见的HTTP状态码: 200--请求成功: 302--重定向: 304--Not Modified:表示上次的文档已经被缓存了,还可以继续使用: 400-- ...

  4. python 使用异常代替返回状态码

  5. (转)Python 日志处理(三) 日志状态码分析、浏览器分析

    原文:https://www.cnblogs.com/i-honey/p/7791564.html 在企业中,从日志中提取数据进行分析,可以帮助企业更加了解用户行为,用户最感兴趣的产品或者内容,分析得 ...

  6. nginx 499状态码

    Web服务器在用着nginx,在日志中偶尔会看到有499这个错误. rfc2616中,400-500间的错误码仅定义到了417,所以499应该是nginx自己定义的.后来想到读读nginx代码,疑问立 ...

  7. Nginx_HTTP 499 状态码 nginx下 499错误

    日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...

  8. HTTP 499 状态码 nginx下 499错误[转]

    日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...

  9. HTTP 499 状态码 nginx下 499错误

    日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...

随机推荐

  1. vs重装找不到 $(WindowsSdkDir) 配置问题

    vs重装的一个bug,找了一个下午,删了再装vs也没用. 在配置表   HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs ...

  2. JAVA基础总结2

    2.1 关键字 常用的关键字主要包括如下: 2.2 标识符 简单而言标识符它其实就是用于标识某些东西的符号. 2.3 注释的应用 注释说明 注释的作用: 注释的应用: 2.4 常量和变量 常量的定义与 ...

  3. Git 工作流的正确打开方式

    前言 一直在使用git做版本控制,也一直工作很顺利,直到和别人发生冲突的时候.这才注意到git 工作流并不是那么简单.比如,之前遇到的清理历史.百度到的资料很多,重复性也很多,但实践性操作很少,我很难 ...

  4. 用node.js实现ORM的一种思路

    ORM是O和R的映射.O代表面向对象,R代表关系型数据库.二者有相似之处同时也各有特色.就是因为这种即是又非的情况,才需要做映射的. 理想情况是,根据关系型数据库(含业务需求)的特点来设计数据库.同时 ...

  5. Mybatis基本用法--中

    Mybatis基本用法--中 第四部分 动态 SQL 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似.MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素 ...

  6. JAVA基础-XML的解析

    一.XML的概述 XML的全名为可扩展标记语言(Extensible Markup Language),XML的作用为:1.传输,2.存取数据,3.软件的配置文件.传输现在都用更轻量的Json,而存储 ...

  7. WindowsAll下安装与破解IntelliJ IDEA2017

    IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.各类版本工具( ...

  8. CodeForces - 846F Random Query(期望)

    You are given an array a consisting of n positive integers. You pick two integer numbers l and r fro ...

  9. #define is unsafe

    #define is unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  10. iOS 中的 Delayed Transition

    Android 的动画体系中,存在一类由 TransitionManager. beginDelayedTransition 管理的动画.这个方法,很特殊.执行此方法后,其后续的 UI 变化,不会立即 ...