2014-02-26 3 views
0

저는 완전히 스칼라에 익숙하지 않습니다. 다른 도구에서 생성 된 로그 파일을 구문 분석하고 중요한 정보를 추출하려고합니다. 메트릭 목록과 함께 이름 뒤에 = 및 값 목록이있는 하나의 큰 줄입니다. 각각의 이름 뒤에 = 및 그 다음에 오는 값이옵니다. | 사이의 각 kpi에 대해 카운터가 반복되고 동일하게갑니다=로 끝나는 =로 끝나는 전체 문자열을 찾는 방법 =

input : 20:53:19.503 Dbg 29999 [er-thread-1] KPI reporter: [sql.pstmt.executeQuery.select top 200 Interaction.Id, Interaction.MediaTypeId, Interaction.TypeId, Interaction.SubtypeId, Interaction.TenantId, Interaction.StartDate, Interaction.ParentId, Interaction.AllAttributes, Interaction.QueueName from Interaction where ((Interaction.TypeId = {0}) and (Interaction.MediaTypeId = {1}) and (Interaction.Status = {2}) and ((Interaction.CreatorAppId = {3}) or (Interaction.CreatorAppId = {4}))) order by Interaction.StartDate asc .tmr=[min="0.0"|m5_rate="0.099"|max="249.0"|count="1241"|p999="248.565"|p99="73.65"|mean_rate="0.099"|type="TIMER"|m15_rate="0.099"|duration_unit="MILLISECONDS"|m1_rate="0.096"|p50="0.0"|p75="15.0"|p95="16.0"|mean="6.533"|rate_unit="SECOND"|stddev="17.611"|p98="16.0"]] 

[1.336] 실패 : 각 KPI

내 문제 (들)에 대한 : 나는 토큰 끝

로 사용 같은 이름 = 포함 된 경우 내가 제대로 줄을 구문 분석 할 수 없습니다 : [' expected but '이 발견됨

20:53:19.503 Dbg 29999 [er-thread-1] KPI reporter: [sql.pstmt.executeQuery.select top 200 Interaction.Id, Interaction.MediaTypeId, Interaction.TypeId, Interaction.SubtypeId, Interaction.TenantId, Interaction.StartDate, Interaction.ParentId, Interaction.AllAttributes, Interaction.QueueName from Interaction where ((Interaction.TypeId = {0}) and (Interaction.MediaTypeId = {1}) and (Interaction.Status = {2}) and ((Interaction.CreatorAppId = {3}) or (Interaction.CreatorAppId = {4}))) order by Interaction.StartDate asc .tmr=[min="0.0"|m5_rate="0.099"|max="249.0"|count="1241"|p999="248.565"|p99="73.65"|mean_rate="0.099"|type="TIMER"|m15_rate="0.099"|duration_unit="MILLISECONDS"|m1_rate="0.096"|p50="0.0"|p75="15.0"|p95="16.0"|mean="6.533"|rate_unit="SECOND"|stddev="17.611"|p98="16.0"]] 
                                                                                      ^
,451,515,

여기에 내 현재 파서 :

import scala.util.parsing.combinator.RegexParsers 
import scala.util.matching.Regex 
import scala.util.parsing.combinator._ 

class kpiParser extends JavaTokenParsers { 

    override val whiteSpace = "".r 

    def name: Parser[String] = """[\w\. -\\,\\(\\){}]+?=""".r 

    def counter: Parser[Any] = name~value 

    def timer: Parser[Any] = """tmr""".r 
    def gauge: Parser[Any] = """gge""".r 
    def count: Parser[Any] = """cnt""".r 
    def meter: Parser[Any] = """mtr""".r 

    def value: Parser[Any] = """""""~(decimalNumber|intNumber|stringValue)~""""""" 
// def value: Parser[Any] = """\w+""".r 

    def stringValue: Parser[Any] = """\w+""".r 
    def intNumber: Parser[String] = """\d+""".r 

    def logLine: Parser[Any] = timeStamp~kpiReporter 
    def timeStamp: Parser[Any] = """([0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3})""".r 
    def kpiReporter: Parser[Any] = """.* KPI reporter: \[""".r~rep(kpi|"|"~kpi)~"]" 
    def kpi: Parser[Any] = name~"["~rep(counter|"|"~counter)~"]" 

} 

object ParseExpr extends kpiParser { 

    def main(args: Array[String]) { 

    val simple2 = """20:53:19.503 Dbg 29999 [er-thread-1] KPI reporter: [evt.logic-check-listeners.tmr=[min="0.023"|m5_rate="0.018"|max="0.492"|count="211"|p999="0.492"|p99="0.328"|mean_rate="0.017"|type="TIMER"|m15_rate="0.017"|duration_unit="MILLISECONDS"|m1_rate="0.025"|p50="0.055"|p75="0.061"|p95="0.134"|mean="0.064"|rate_unit="SECOND"|stddev="0.045"|p98="0.199"]|svc.OMResponse.AddStdRespUsage.success.cnt=[count="20000"|type="COUNTER"]]"""  
    val problem = """20:53:19.503 Dbg 29999 [er-thread-1] KPI reporter: [sql.pstmt.executeQuery.select top 200 Interaction.Id, Interaction.MediaTypeId, Interaction.TypeId, Interaction.SubtypeId, Interaction.TenantId, Interaction.StartDate, Interaction.ParentId, Interaction.AllAttributes, Interaction.QueueName from Interaction where ((Interaction.TypeId = {0}) and (Interaction.MediaTypeId = {1}) and (Interaction.Status = {2}) and ((Interaction.CreatorAppId = {3}) or (Interaction.CreatorAppId = {4}))) order by Interaction.StartDate asc .tmr=[min="0.0"|m5_rate="0.099"|max="249.0"|count="1241"|p999="248.565"|p99="73.65"|mean_rate="0.099"|type="TIMER"|m15_rate="0.099"|duration_unit="MILLISECONDS"|m1_rate="0.096"|p50="0.0"|p75="15.0"|p95="16.0"|mean="6.533"|rate_unit="SECOND"|stddev="17.611"|p98="16.0"]|evt.logic-check-listeners.tmr=[min="0.023"|m5_rate="0.018"|max="0.492"|count="211"|p999="0.492"|p99="0.328"|mean_rate="0.017"|type="TIMER"|m15_rate="0.017"|duration_unit="MILLISECONDS"|m1_rate="0.025"|p50="0.055"|p75="0.061"|p95="0.134"|mean="0.064"|rate_unit="SECOND"|stddev="0.045"|p98="0.199"]|svc.OMResponse.AddStdRespUsage.success.cnt=[count="20000"|type="COUNTER"]]"""  
    // println("input : " + args(0)) 
    println("input : " + simple2) 
    println(parseAll(logLine, simple2)) 
    println("input : " + complex) 
    println(parseAll(logLine, complex)) 
    println("input : " + problem) 
    println(parseAll(logLine, problem)) 
    } 
} 
+0

'= '를'= "'상황과 구별하기 위해 마지막 토큰으로 사용하십시오. 정규 표현식은 'blahblah (=) ['('['는 그룹에서 빠져서 델리 미터로 삼켜지지 않지만 고려 될 것입니다.) –

+0

같은 이름으로 정의를 시도했습니다. * : (\ [) "" ". r'] 그러나 그것은 실패합니다 : 파서의 [문자열] =" "[\ w \. '[1.84] 실패 :'] '예상했지만'm'을 찾았습니다. 그래서 _evt.logic-check-listers.tmr = [_ 이름보다 더 많이 사용되었습니다. – gartcimore

+0

나는 이름에 대해 두 가지 정의를하고 있습니다. kpi와 같은 하나의 카운터에 대해 다음과 같이 정의 할 수 있습니다 : def kpiName : Parser [String] = "" "[\ w \. - \\, \\ (\\) {} =] *? = \ [" "".r'과 'def counterName : 파서 ​​[Any] = "" "[\ w \. -] *? =" ""r "그것은 일을하는 것처럼 보입니다. – gartcimore

답변

0
이 같은 이름이 정의 내 핵심 성과 지표 (KPI)에 대한 하나의 내 카운터 하나를 수행 끝났다

:

def kpiName: Parser[String] = """[\w\. -\\,\\(\\){}=]*?=\[""".r 
def counterName: Parser[Any] = """[\w\. -]*?=""".r 

내가 구문 분석 할 다음 수 있었다 =가있는 이름

관련 문제