前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >日志分析实战之清洗日志小实例5:实现获取不能访问url

日志分析实战之清洗日志小实例5:实现获取不能访问url

作者头像
用户1410343
发布2018-03-26 15:14:52
7960
发布2018-03-26 15:14:52
举报
文章被收录于专栏:about云about云

问题导读 1.在url中,如何过滤不需要的内容? 2.如何获取404记录并且获取字段? 3.获取不能访问url列表的思路是什么? about云日志分析实战之清洗日志4:统计网站相关信息 http://www.aboutyun.com/forum.php?mod=viewthread&tid=22900 上篇文章简单的统计了一些信息,下一步希望找到404对应的url。 思路: 1.获取request字段 2.过滤不需要字符 3.实现获取url,并打印输出 1.创建getRequest函数获取request字段

[Scala] 纯文本查看 复制代码

?

代码语言:javascript
复制
// get the `request` field from an access log record
def getRequest(rawAccessLogString: String): Option[String] = {
  val accessLogRecordOption = p.parseRecord(rawAccessLogString)
  accessLogRecordOption match {
    case Some(rec) => Some(rec.request)
    case None => None
  }
}

2.创建extractUriFromRequest函数

[Scala] 纯文本查看 复制代码

?

代码语言:javascript
复制
// val request = "GET /foo HTTP/1.0"
def extractUriFromRequest(requestField: String) = requestField.split(" ")(1)

这个目的大家可以猜猜它的作用 获取404页面,并且打印出请求的URL.

[Scala] 纯文本查看 复制代码

?

代码语言:javascript
复制
val distinctRecs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404")
                     .map(getRequest(_))
                     .collect { case Some(requestField) => requestField }
                     .map(extractUriFromRequest(_))
                     .distinct

[Scala] 纯文本查看 复制代码

?

代码语言:javascript
复制
distinctRecs.count

[Scala] 纯文本查看 复制代码

?

代码语言:javascript
复制
distinctRecs.collect().foreach(println(_))

3.获取url

[Scala] 纯文本查看 复制代码

?

代码语言:javascript
复制
val distinctRecs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404")
                     .map(getRequest(_))
                     .collect { case Some(requestField) => requestField }
                     .map(extractUriFromRequest(_))
                     .distinct

通过上面看,其实挺简单。Scala本身是非常简洁的。 相关说明: 上面看似简单,其实有很多需要说明的 val recs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404").map(getRequest(_)) 上面得出404对应的url.getRequest是上面我们定义的函数 val distinctRecs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404").map(getRequest(_)).distinct 这里多了distinct是为了去重,下面是直接打印。 distinctRecs.collect().foreach(println(_))。 对于extractUriFromRequest,这个主要为过滤我们不想要的内容。如下面,GET 和HTTP/1.1都不是我们想要的。所以我们取第二个元素即可。

[Bash shell] 纯文本查看 复制代码

?

代码语言:javascript
复制
GET /foo HTTP/1.0
GET /foo HTTP/1.1

知识补充: 对于collect() 函数,是比较常见的,但是对于下面内容,是什么意思。 collect { case Some(requestField) => requestField }这个作用,类似map。 ################## 更多信息: 在Scala中,当我需要对集合的元素进行转换时,自然而然会使用到map方法。而当我们在对tuple类型的集合或者针对Map进行map操作时,通常更倾向于在map方法中使用case语句,这比直接使用_1与_2更加可读。例如:

[Scala] 纯文本查看 复制代码

?

代码语言:javascript
复制
val languageToCount = Map("Scala" -> 10, "Java" -> 20, "Ruby" -> 5)
languageToCount map { case (_, count) => count + 1 }

然而对于上述场景,其实我们也可以使用collect方法:

[Scala] 纯文本查看 复制代码

?

代码语言:javascript
复制
languageToCount collect { case (_, count) => count + 1 }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 about云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档