다음을 통해 공유


log_reduce_fl()

함수 log_reduce_fl() 는 로그 줄과 같은 반구조화된 텍스트 열에서 일반적인 패턴을 찾아 추출된 패턴에 따라 선을 클러스터합니다. 각 빈도에 따라 위에서 아래로 정렬된 찾은 패턴을 포함하는 요약 테이블을 출력합니다.

사전 요구 사항

  • 클러스터에서 Python 플러그 인 을 사용하도록 설정해야 합니다. 함수에 사용되는 인라인 Python에 필요합니다.
  • 데이터베이스에서 Python 플러그 인 을 사용하도록 설정해야 합니다. 함수에 사용되는 인라인 Python에 필요합니다.

Syntax

T|invokelog_reduce_fl(reduce_col [,use_logram [,use_drain [,custom_regexes [,custom_regexes_policy [구분 기호 ],similarity_th [,,tree_depth [,trigram_th [,bigram_th ]]]]]]]]])

구문 규칙에 대해 자세히 알아보세요.

매개 변수

다음 매개 변수 설명은 요약입니다. 자세한 내용은 알고리즘 섹션에 대한 자세한 내용을 참조하세요.

Name 형식 필수 Description
reduce_col string ✔️ 함수가 적용되는 문자열 열의 이름입니다.
use_logram bool Logram 알고리즘을 사용하거나 사용하지 않도록 설정합니다. 기본값은 true여야 합니다.
use_drain bool 드레이닝 알고리즘을 사용하거나 사용하지 않도록 설정합니다. 기본값은 true여야 합니다.
custom_regexes dynamic 각 입력 행에서 검색할 정규식 및 대체 기호 쌍을 포함하고 해당 일치하는 기호로 바꿔야 하는 동적 배열입니다. 기본값은 dynamic([])여야 합니다. 기본 정규식 테이블은 숫자, IP 및 GUID를 대체합니다.
custom_regexes_policy string 'prepend', 'append' 또는 'replace'입니다. 기본 custom_regexes 앞에 추가/추가/바꿀지 여부를 제어합니다. 기본값은 'prepend'입니다.
delimiters dynamic 구분 기호 문자열을 포함하는 동적 배열입니다. 기본값은 이며 dynamic([" "])공백을 유일한 단일 문자 구분 기호로 정의합니다.
similarity_th real 드레이닝 알고리즘에서 사용하는 유사성 임계값입니다. similarity_th 증가하면 더 구체화된 클러스터가 생성됩니다. 기본값은 0.5입니다. 드레이닝이 사용하지 않도록 설정된 경우 이 매개 변수는 영향을 주지 않습니다.
tree_depth int tree_depth 늘리면 드레이닝 알고리즘의 런타임이 향상되지만 정확도가 저하될 수 있습니다. 기본값은 4입니다. 드레이닝이 사용하지 않도록 설정된 경우 이 매개 변수는 영향을 주지 않습니다.
trigram_th int trigram_th 줄이면 Logram이 토큰을 와일드카드로 바꿀 가능성이 높아질 수 있습니다. 기본값은 10입니다. Logram을 사용하지 않도록 설정하면 이 매개 변수가 적용되지 않습니다.
bigram_th int bigram_th 줄이면 Logram이 토큰을 와일드카드로 바꿀 가능성이 높아질 수 있습니다. 기본값은 15입니다. Logram을 사용하지 않도록 설정하면 이 매개 변수가 적용되지 않습니다.

알고리즘에 대한 자세한 정보

함수는 행에 대한 다중 전달을 실행하여 일반 패턴으로 줄입니다. 다음 목록에서는 통과에 대해 설명합니다.

  • 정규식 바꾸기: 이 단계에서 각 줄은 정규식 집합과 독립적으로 일치하며 일치하는 각 식은 대체 기호로 바뀝니다. 기본 정규식은 IP, 숫자 및 GUID를 /IP, GUID 및 /<<NUM>으로 바꿉니다.><> 사용자는 더 많은 정규식을 추가/추가하거나 custom_regexes 수정하여 새 정규식 또는 빈 목록으로 바꿀 수 custom_regexes_policy. 예를 들어 정수를 WNUM> 집합 custom_regexes=pack_array('/^\d+$/', '<WNUM>')으로 <바꾸려면 정규식 대체 집합 custom_regexes_policy='replace''를 취소합니다. 각 줄에 대해 함수는 원래 식 목록(대체 전)을 제네릭 대체 토큰의 매개 변수로 출력되도록 유지합니다.

  • 토큰화: 이전 단계와 마찬가지로 각 줄은 독립적으로 처리되고 구분 기호 집합에 따라 토큰으로 나뉩니다. 예를 들어 쉼표, 마침표 또는 세미콜론 집합 구분 기호=pack_array(',', '.', ';')로 토큰 호환성이 손상되는 것을 정의합니다.

  • Logram 알고리즘 적용: 이 패스는 선택 사항이며 보류 중인 use_logram true입니다. 대규모가 필요한 경우와 로그 항목의 첫 번째 토큰에 매개 변수가 나타날 수 있는 경우 Logram을 사용하는 것이 좋습니다. OTOH는 알고리즘이 토큰을 와일드카드로 너무 자주 바꾸는 경향이 있으므로 로그 항목이 짧을 때 사용하지 않도록 설정합니다. Logram 알고리즘은 3개의 튜플과 2개의 튜플 토큰을 고려합니다. 3개 튜플의 토큰이 로그 줄에서 일반적인 경우( trigram_th 번 이상 표시됨) 세 토큰이 모두 패턴의 일부일 수 있습니다. 3 튜플이 드문 경우 와일드카드로 대체해야 하는 변수가 포함되어 있을 수 있습니다. 드문 3 튜플의 경우 3 튜플에 포함된 2 튜플이 나타나는 빈도를 고려합니다. 2 튜플이 일반적인 경우( bigram_th 번 이상 표시됨) 나머지 토큰은 패턴의 일부가 아닌 매개 변수일 수 있습니다.
    Logram 알고리즘은 쉽게 병렬화할 수 있습니다. 로그 모음에는 두 개의 패스가 필요합니다. 첫 번째 패스는 각 3 튜플과 2 튜플의 빈도를 계산하고 두 번째 패스는 각 항목에 이전에 설명된 논리를 적용합니다. 알고리즘을 병렬화하려면 로그 항목을 분할하고 다른 작업자의 빈도 수를 통합하기만 하면 됩니다.

  • 드레이닝 알고리즘 적용: 이 패스는 선택 사항이며 보류 중인 use_drain true입니다. 드레이닝은 잘린 깊이 접두사 트리를 기반으로 하는 로그 구문 분석 알고리즘입니다. 로그 메시지는 길이에 따라 분할되며, 각 길이에 대해 로그 메시지의 첫 번째 tree_depth 토큰은 접두사 트리를 빌드하는 데 사용됩니다. 접두사 토큰과 일치하는 항목이 없으면 새 분기가 만들어집니다. 접두사에 대한 일치 항목이 발견되면 트리 리프에 포함된 패턴 중에서 가장 유사한 패턴을 검색합니다. 패턴 유사성은 모든 토큰에서 일치하는 비와일드 카드 토큰의 비율로 측정됩니다. 가장 유사한 패턴의 유사성이 유사성 임계값( similarity_th 매개 변수)을 초과하면 로그 항목이 패턴과 일치합니다. 해당 패턴의 경우 함수는 일치하지 않는 모든 토큰을 와일드카드로 대체합니다. 가장 유사한 패턴의 유사성이 유사성 임계값보다 낮으면 로그 항목이 포함된 새 패턴이 만들어집니다.
    다양한 로그 테스트를 기반으로 기본 tree_depth 4로 설정합니다. 이 깊이를 늘리면 런타임이 향상될 수 있지만 패턴 정확도가 저하될 수 있습니다. 감소하면 각 노드가 더 많은 유사성 테스트를 수행하기 때문에 더 정확하지만 느립니다.
    일반적으로 드레이닝은 패턴을 효율적으로 일반화하고 줄입니다(병렬화하기는 어렵지만). 그러나 접두사 트리를 사용하므로 첫 번째 토큰에 매개 변수가 포함된 로그 항목에서 최적이 아닐 수 있습니다. 대부분의 경우 Logram을 먼저 적용하여 이 문제를 해결할 수 있습니다.

함수 정의

다음과 같이 해당 코드를 쿼리 정의 함수로 포함하거나 데이터베이스에 저장된 함수로 만들어 함수를 정의할 수 있습니다.

다음 let 문을 사용하여 함수를 정의합니다. 사용 권한이 필요 없습니다.

중요

let 문은 자체적으로 실행할 수 없습니다. 그 뒤에 테이블 형식 식 문이 있어야 합니다. 의 log_reduce_fl()작업 예제를 실행하려면 예제를 참조 하세요.

let log_reduce_fl=(tbl:(*), reduce_col:string,
              use_logram:bool=True, use_drain:bool=True, custom_regexes: dynamic = dynamic([]), custom_regexes_policy: string = 'prepend',
              delimiters:dynamic = dynamic(' '), similarity_th:double=0.5, tree_depth:int = 4, trigram_th:int=10, bigram_th:int=15)
{
    let default_regex_table = pack_array('(/|)([0-9]+\\.){3}[0-9]+(:[0-9]+|)(:|)', '<IP>', 
                                         '([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})', '<GUID>', 
                                         '(?<=[^A-Za-z0-9])(\\-?\\+?\\d+)(?=[^A-Za-z0-9])|[0-9]+$', '<NUM>');
    let kwargs = bag_pack('reduced_column', reduce_col, 'delimiters', delimiters,'output_column', 'LogReduce', 'parameters_column', '', 
                          'trigram_th', trigram_th, 'bigram_th', bigram_th, 'default_regexes', default_regex_table, 
                          'custom_regexes', custom_regexes, 'custom_regexes_policy', custom_regexes_policy, 'tree_depth', tree_depth, 'similarity_th', similarity_th, 
                          'use_drain', use_drain, 'use_logram', use_logram, 'save_regex_tuples_in_output', True, 'regex_tuples_column', 'RegexesColumn', 
                          'output_type', 'summary');
    let code = ```if 1:
        from log_cluster import log_reduce
        result = log_reduce.log_reduce(df, kargs)
    ```;
    tbl
    | extend LogReduce=''
    | evaluate python(typeof(Count:int, LogReduce:string, example:string), code, kwargs)
};
// Write your query to use the function here.

예제

다음 예제에서는 invoke 연산자를 사용하여 함수를 실행합니다. 이 예제에서는 Apache Hadoop 분산 파일 시스템 로그를 사용합니다.

쿼리 정의 함수를 사용하려면 포함된 함수 정의 다음에 호출합니다.

let log_reduce_fl=(tbl:(*), reduce_col:string,
              use_logram:bool=True, use_drain:bool=True, custom_regexes: dynamic = dynamic([]), custom_regexes_policy: string = 'prepend',
              delimiters:dynamic = dynamic(' '), similarity_th:double=0.5, tree_depth:int = 4, trigram_th:int=10, bigram_th:int=15)
{
    let default_regex_table = pack_array('(/|)([0-9]+\\.){3}[0-9]+(:[0-9]+|)(:|)', '\<IP>', 
                                         '([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})', '<GUID>', 
                                         '(?<=[^A-Za-z0-9])(\\-?\\+?\\d+)(?=[^A-Za-z0-9])|[0-9]+$', '\<NUM>');
    let kwargs = bag_pack('reduced_column', reduce_col, 'delimiters', delimiters,'output_column', 'LogReduce', 'parameters_column', '', 
                          'trigram_th', trigram_th, 'bigram_th', bigram_th, 'default_regexes', default_regex_table, 
                          'custom_regexes', custom_regexes, 'custom_regexes_policy', custom_regexes_policy, 'tree_depth', tree_depth, 'similarity_th', similarity_th, 
                          'use_drain', use_drain, 'use_logram', use_logram, 'save_regex_tuples_in_output', True, 'regex_tuples_column', 'RegexesColumn', 
                          'output_type', 'summary');
    let code = ```if 1:
        from log_cluster import log_reduce
        result = log_reduce.log_reduce(df, kargs)
    ```;
    tbl
    | extend LogReduce=''
    | evaluate python(typeof(Count:int, LogReduce:string, example:string), code, kwargs)
};
//
// Finding common patterns in HDFS logs, a commonly used benchmark for log parsing
//
HDFS_log
| take 100000
| invoke log_reduce_fl(reduce_col="data")

출력

개수 LogReduce 예제
55356 081110 <NUM NUM><> INFO dfs. FSNamesystem: BLOCK* NameSystem.delete: blk_<NUM>이 IP> 081110 220623 26 INFO dfs의 <invalidSet에 추가됩니다. FSNamesystem: BLOCK* NameSystem.delete: blk_1239016582509138045 invalidSet 10.251.123.195:50010에 추가됨
10278 081110 <NUM NUM><> INFO dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: blockMap 업데이트됨: <IP>가 blk_<NUM> 크기 <NUM> 081110 215858 27 INFO dfs에 추가됩니다. FSNamesystem: BLOCK* NameSystem.addStoredBlock: blockMap updated: 10.250.11.85:50010이 blk_5080254298708411681 크기에 추가되었습니다67108864
10256 081110 <NUM NUM><> INFO dfs. DataNode$PacketResponder: 블록 blk_NUM> 종료 081110 215858< 15496 INFO dfs에 대한 PacketResponder <NUM>입니다. DataNode$PacketResponder: 블록 blk_ 7746692545918257727 종료에 대한 PacketResponder 2
10256 081110 <NUM NUM><> INFO dfs. DataNode$PacketResponder: IP> 081110 215858< 15485 INFO dfs에서 <NUM 크기의 <블록 blk_NUM>>을 수신했습니다. DataNode$PacketResponder: /10.251.43.21에서 67108864 크기의 블록 blk_5080254298708411681 수신됨
9140 081110 <NUM NUM><> INFO dfs. DataNode$DataXceiver: 수신 블록 blk_<NUM> src: <IP dest: <IP>> 081110 215858 15494 INFO dfs. DataNode$DataXceiver: 수신 블록 blk_-7037346755429293022 src: /10.251.43.21:45933 dest: /10.251.43.21:50010
3047 081110 <NUM NUM><> INFO dfs. FSNamesystem: BLOCK* NameSystem.allocateBlock: /user/root/rand3/temporary/task<NUM NUM><>m<NUM_<NUM>>/part-NUM><. <> 081110 215858 26 INFO dfs. FSNamesystem: BLOCK NameSystem.allocateBlock: /user/root/rand3/_temporary/task_200811101024_0005_m_001805_0/part-01805. blk-7037346755429293022
1402 081110 <NUM><NUM> INFO <>: <> 블록 blk_<NUM> <><> 081110 215957 15556 INFO dfs. DataNode$DataTransfer: 10.250.15.198:50010:/10.251.203.129:50010으로 blk_-3782569120714539446 블록 전송
177 081110 <NUM><NUM> 정보 <>: <>><<> <*> 081110 215859 13 INFO dfs. DataBlockScanner: blk_ 7244926816084627474 대한 확인 성공
36 081110 <NUM><NUM> INFO <>: <>>> <<블록 <*> 081110 215924 15636 INFO dfs. DataNode$BlockReceiver: 블록 blk_3991288654265301939 대한 빈 패킷 수신
12 081110 <NUM NUM><> INFO dfs. FSNamesystem: BLOCK* <>><> <> <> <><><> <081110 215953 19 INFO dfs. FSNamesystem: BLOCK* ask 10.250.15.198:50010 to replicate blk_-3782569120714539446 to datanode(s) 10.251.203.129:50010
12 081110 <NUM NUM>>< INFO <>: <>><> <> <<>블록 blk_<NUM><> <> 081110 215955 18 INFO dfs. DataNode: 10.250.15.198:50010 블록 blk_-3782569120714539446 10.251.203.129:50010으로 전송하는 스레드 시작
12 081110 <NUM NUM><> INFO dfs. DataNode$DataXceiver: 수신된 블록 blk_<NUM> src: <IP> dest: <NUM> 081110 215957 15226 INFO dfs 크기의 <IP>입니다. DataNode$DataXceiver: 수신된 블록 blk_-3782569120714539446 src: /10.250.15.198:51013 dest: /10.250.15.198:50010 크기 14474705
6 081110 <NUM><NUM><> dfs. FSNamesystem: BLOCK NameSystem.addStoredBlock: <>> <<><> <<> <> <>>크기 <NUM> 081110 215924 27 WARN dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: 10.251.202.134:50010 크기 67108864 blk_2522553781740514003 대해 받은 중복 addStoredBlock 요청
6 081110 <NUM NUM><> INFO dfs. DataNode$DataXceiver: <>> <<> <<>>: <><><> <>> <081110 215936 15714 INFO dfs. DataNode$DataXceiver: writeBlock blk_720939897861061328 java.io.IOException 예외를 수신했습니다. 스트림에서 읽을 수 없습니다.
3 081110 <NUM NUM><> INFO dfs. FSNamesystem: BLOCK* NameSystem.addStoredBlock: <>><> <<> <<> <>> size <NUM><>>> <><<<> <> <><>. 081110 220635 28 INFO dfs. FSNamesystem: BLOCK NameSystem.addStoredBlock: addStoredBlock 요청이 10.250.17.17.177:50010 크기 53457811 blk_-81196479666306310 대해 수신되었지만 파일에 속하지 않습니다.
1 081110 <NUM NUM><><>> <: <><<<>>>> <<> <> <. .><> <><> <> 081110 220631 19 WARN dfs. FSDataset: 블록 blk_ 2012154052725261337 삭제하려고 하는 예기치 않은 오류입니다. volumeMap에서 BlockInfo를 찾을 수 없습니다.

이 기능은 지원되지 않습니다.