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

问题导读 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] 纯文本查看 复制代码

?

// 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] 纯文本查看 复制代码

?

// val request = "GET /foo HTTP/1.0"
def extractUriFromRequest(requestField: String) = requestField.split(" ")(1)

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

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

?

val distinctRecs = log.filter(line => getStatusCode(p.parseRecord(line)) == "404")
                     .map(getRequest(_))
                     .collect { case Some(requestField) => requestField }
                     .map(extractUriFromRequest(_))
                     .distinct

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

?

distinctRecs.count

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

?

distinctRecs.collect().foreach(println(_))

3.获取url

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

?

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] 纯文本查看 复制代码

?

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] 纯文本查看 复制代码

?

val languageToCount = Map("Scala" -> 10, "Java" -> 20, "Ruby" -> 5)
languageToCount map { case (_, count) => count + 1 }

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

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

?

languageToCount collect { case (_, count) => count + 1 }

原文发布于微信公众号 - about云(wwwaboutyuncom)

原文发表时间:2017-10-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Albert陈凯

processArgs方法解读

/** * 处理参数 * * @param conf * @param args */ privat...

3296
来自专栏WindCoder

《Linux内核分析》之计算机是如何工作的 实验总结

马马虎虎学完了Python课程,一直想学下linux,看到里面有个linux的就选上了。当初没细看,如今听完第一节课有点傻眼,竟然糊里糊涂给自己找了一科汇编语言...

1231
来自专栏纯洁的微笑

jvm系列(一):java类的加载机制

1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Cl...

3906
来自专栏Java 技术分享

Struts2 转换器

1222
来自专栏林德熙的博客

C#判断文件是否被混淆

可以使用混淆工具对一个DLL 和 exe 进行混淆。 但是如何知道一个文件是否已经混淆了。 在发布之前,需要知道是不是有文件忘了混淆。

2382
来自专栏枕边书

搭建自己的PHP框架心得(二)

续言 对于本次更新,我想说: 本框架由本人挑时间完善,而我还不是PHP大神级的人物,所以框架漏洞难免,求大神们指出。 本框架的知识点应用都会写在博客里,大家有什...

2538
来自专栏有趣的django

7.python常用模块

time模块 常用表示时间方式: 时间戳,格式化的时间字符串,元组(struct_time) UTC(Coordinated Universal Time,世界...

48211
来自专栏Hongten

Struts2 Action

  具体Action的实现可以是一个普通的java类,里面有public String execute方法即可

852
来自专栏专注 Java 基础分享

虚拟机类加载机制

虚拟机把字节码文件从磁盘加载进内存的这个过程,我们可以粗糙的称之为「类加载」,因为「类加载」不仅仅是读取一段字节码文件那么简单,虚拟机还要进行必要的「验证」、「...

4697
来自专栏大内老A

[WCF REST] WebHttpBinding与消息编码

不论是我们采用SOAP还是REST架构风格,运行时框架体系依然不曾改变,终结点也仍旧是通信的核心。在Web HTTP编程模型中,我们采用基于WebHttpBin...

2156

扫码关注云+社区

领取腾讯云代金券