Spark-项目中分析日志的核心代码

代码

LogRecord 类:

case class LogRecord (
    clientIpAddress: String,
    rfc1413ClientIdentity: String,
    remoteUser: String,             `
    dateTime: String,              //[day/month/year:hour:minute:second zone]
    request: String,
    httpStatusCode: String,
    bytesSent: String,
    referer: String,
    userAgent: String
)

LogParser 解析类

import java.util.regex.Pattern
import java.text.SimpleDateFormat
import java.util.Locale
import scala.util.control.Exception._
import java.util.regex.Matcher
import scala.util.{Try, Success, Failure}

@SerialVersionUID(100L)
class LogParser extends Serializable {

    private val ddd = "\\d{1,3}"
    private val ip = s"($ddd\\.$ddd\\.$ddd\\.$ddd)?"
    private val client = "(\\S+)"
    private val user = "(\\S+)"
    private val dateTime = "(\\[.+?\\])"
    private val request = "\"(.*?)\""
    private val status = "(\\d{3})"
    private val bytes = "(\\S+)"
    private val referer = "\"(.*?)\""
    private val agent = "\"(.*?)\""
    private val regex = s"$ip $client $user $dateTime $request $status $bytes $referer $agent"
    private val p = Pattern.compile(regex)

    def parseRecord(record: String): Option[AccessLogRecord] = {
        val matcher = p.matcher(record)
        if (matcher.find) {
            Some(buildAccessLogRecord(matcher))
        } else {
            None
        }
    }

    def parseRecordReturningNullObjectOnFailure(record: String): AccessLogRecord = {
        val matcher = p.matcher(record)
        if (matcher.find) {
            buildAccessLogRecord(matcher)
        } else {
            AccessLogParser.nullObjectAccessLogRecord
        }
    }

    private def buildAccessLogRecord(matcher: Matcher) = {
        AccessLogRecord(
            matcher.group(1),
            matcher.group(2),
            matcher.group(3),
            matcher.group(4),
            matcher.group(5),
            matcher.group(6),
            matcher.group(7),
            matcher.group(8),
            matcher.group(9))
    }
}

/**
 * 例子:
 * 94.102.63.11 - - [21/Jul/2009:02:48:13 -0700] "GET / HTTP/1.1" 200 18209 "http://acme.com/foo.php" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
 */
object AccessLogParser {

    val nullObjectAccessLogRecord = AccessLogRecord("", "", "", "", "", "", "", "", "")

    def parseRequestField(request: String): Option[Tuple3[String, String, String]] = {
        val arr = request.split(" ")
        if (arr.size == 3) Some((arr(0), arr(1), arr(2))) else None
    }
    def parseDateField(field: String): Option[java.util.Date] = {
        val dateRegex = "\\[(.*?) .+]"
        val datePattern = Pattern.compile(dateRegex)
        val dateMatcher = datePattern.matcher(field)
        if (dateMatcher.find) {
                val dateString = dateMatcher.group(1)
                println("***** DATE STRING" + dateString)
                // HH is 0-23; kk is 1-24
                val dateFormat = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.ENGLISH)
                allCatch.opt(dateFormat.parse(dateString))  // return Option[Date]
            } else {
            None
        }
    }

}

总结

日志分析是经常做的事情,大数据下的日志分析也是一个常用技术。

时间: 2024-08-30 01:07:29

Spark-项目中分析日志的核心代码的相关文章

shiro真正项目中的实战应用核心代码!!!

欢迎转载!!!请注明出处!!! 说道shiro的学习之路真是相当坎坷,网上好多人发的帖子全是简单的demo样例,核心代码根本没有,在学习过程中遇到过N多坑. 经过自己的努力,终于整出来了,等你整明白之后发现,确实没那么难,只是没人告诉你,自己去想向确实不好办,只能通过看源码加上自己猜想,不断尝试. 直接看主题.我就直接说受权这了,不说认证登录了,这种帖子n多个,我要说的是真正的核心代码!!!含金量超高!!!欢迎转载!请注明出处!!! 首先看先自定义的Realm: /** * 授权查询回调函数,

iOS对项目中所有加阴影的代码进行优化

1. 对项目中所有加阴影的代码进行优化 目前项目中尤其是表格单元格中使用如下加阴影代码严重影响性能(5.2.5航班查询结果页卡顿的原因)     self.cellBG.layer.shadowColor = [[UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1] CGColor];     self.cellBG.layer.shadowOffset = CGSizeMake(1, 1);     self.cellBG.layer.sha

在一个项目中同时使用Swift和Objective-C代码混合编程的方法

主要介绍了在一个项目中同时使用Swift和Objective-C代码的方法,在一个工程中同时使用Swift和Objective-C混合语言编程的方法. Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实现应用的一部分功能,并无缝地并入已有的 Objective-C 的代码中. Mix and Match 概述 Objective-C 和 Swift

沉淀再出发:如何在eclipse中查看java的核心代码

沉淀再出发:如何在eclipse中查看java的核心代码 一.前言   很多时候我们在eclipse中按F3键打算查看某一个系统类的定义的时候,总是弹出找不到类这样的界面,这里我们把核心对应的代码加进去就可以了. 二.解决办法  2.1.打开配置    首先我们打开windows->preferences->java->install jres,在弹出的界面中选中并编辑:      然后选中rt.jar包,增加依赖: 2.2.添加代码文件 那么这个依赖在哪里呢,其实我们仔细查找就会发现,

软件开发工程师(JAVA)中级考试大纲-----四(四)Log4J的原理及配置;Log4J常用的API;在项目中应用日志框架Log4J关键类和接口介绍;Java properties配置文件log

log4j Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件,甚至是套接口服务器.NT的事件记录器.UNIX Syslog守护进程等:我们也可以控制每一条日志的输出格式:通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程.最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码. 1定义 log4j--log for java(java的日志) 在强调可重用组件开发的今天,除了

项目中考核参数映射集代码片段

1. QuestionnairesService类中:         /**  * 获取岗位id-问卷id的映射, 一个岗位可能会对应两份试卷(业绩卷.能力态度卷)  *   * @return  */ public Multimap<Long, Long> getPostQuestMap() { // 当前考评周期 AppraisalPeriod period = testingService.getLast().getAppraisalPeriod(); Multimap<Long

Python+Selenium进行UI自动化测试项目中,常用的小技巧4:日志打印,longging模块(控制台和文件同时输出)

在前段时间,为了给项目中加入日志功能,就想到了 logging 模块,百度logging一大推,都是各种复制的,并没有找到自己想要的结果:我的目的很简单,就是:在把日志写入文件的同时在控制台输出,更加方便调试,我下面的代码就满足这个功能: 1 #coding=utf-8 2 3 import logging 4 import time 5 import commonparameter 6 7 class Log: 8 def __init__(self): 9 self.logname = co

Activiti学习——整合ActivitiModeler到项目中

学习来源 自己学习Activiti,主要是通过拆解和重新组装咖啡兔的项目而学习的. 咖啡兔博客:http://www.kafeitu.me/ 项目地址:https://github.com/henryyan/kft-activiti-demo 基础准备 上面的GitHub中有maven版本和no-maven版本,我下的是no-maven版本 kft-activiti-demo-no-maven下载 解压并部署项目 项目结构,报错地方是xml或者js文件,可以忽略 项目 本文就是为了将对应功能拆分

在Python Web项目中使用Jenkins进行持续集成

在一个项目的开发过程中,往往会有一些需要反复执行的操作,比如编译.测试.部署.具体于Flask项目,我一般使用nose执行单元测试.fabric进行部署.pylint执行代码质量检测等.这些频繁需要执行的步骤,是非常枯燥的,那何不交给机器来自动执行呢?最近,我参与的一个校内团队也遇到了类似的问题,于是打算调研一下相关的工具. 还是习惯性地查阅了下Kenneth Reitz大神的python-guide,果然找到了关于CI的章节.选来选去,最终没有选择Python Stack的Buildbot,而