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))
}
}
'= '를'= "'상황과 구별하기 위해 마지막 토큰으로 사용하십시오. 정규 표현식은 'blahblah (=) ['('['는 그룹에서 빠져서 델리 미터로 삼켜지지 않지만 고려 될 것입니다.) –
같은 이름으로 정의를 시도했습니다. * : (\ [) "" ". r'] 그러나 그것은 실패합니다 : 파서의 [문자열] =" "[\ w \. '[1.84] 실패 :'] '예상했지만'm'을 찾았습니다. 그래서 _evt.logic-check-listers.tmr = [_ 이름보다 더 많이 사용되었습니다. – gartcimore
나는 이름에 대해 두 가지 정의를하고 있습니다. kpi와 같은 하나의 카운터에 대해 다음과 같이 정의 할 수 있습니다 : def kpiName : Parser [String] = "" "[\ w \. - \\, \\ (\\) {} =] *? = \ [" "".r'과 'def counterName : 파서 [Any] = "" "[\ w \. -] *? =" ""r "그것은 일을하는 것처럼 보입니다. – gartcimore