로그에서 상태 머신 그리기

로그에서 상태 머신 그리기

다음 형식의 로그가 있습니다.

03/22/2011 14:45:06;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35707.arien.ics.muni.cz state from EXITING-RETURNSTD to EXITING-STAGEOUT (5-51)
03/22/2011 14:45:06;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35709.arien.ics.muni.cz state from RUNNING-PRERUN to RUNNING-RUNNING (4-42)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from RUNNING-RUNNING to EXITING-EXITING (5-50)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from EXITING-EXITING to EXITING-RETURNSTD (5-70)
03/22/2011 14:45:07;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35708.arien.ics.muni.cz state from EXITING-RETURNSTD to EXITING-STAGEOUT (5-51)
03/22/2011 14:45:08;0001;PBS_Server;Svr;PBS_Server;svr_setjobstate: setting job 35709.arien.ics.muni.cz state from RUNNING-RUNNING to EXITING-EXITING (5-50)

이제 상태 머신을 그래픽적으로 재구성하고 싶지만 이 문제를 어떻게 해결해야 할지 조금 망설여집니다. 전환을 제거하는 것은 문제가 되지 않지만 전환에서 그래픽 표현을 재구성하는 방법을 잘 모르겠습니다.

답변1

무슨 말인지 잘 모르겠지만, 이런 것을 찾고 계십니까?

포인트 출력

나는 사용했다그래픽 시각화, 변환을 설명하는 텍스트 입력 파일을 가져와 자동으로 그래프를 계산합니다. 정확한 명령은 다음과 같습니다.

$ sed 's/-/_/g' input | gawk '
    BEGIN {print "digraph g {"}
    END {print "}"}
    match($0, /from ([^ ]*) to ([^ ]*) \((.*)\)$/, groups) {
        print groups[1] " -> " groups[2] " [label = \"" groups[3] "\"];"
    }' > output.dot
$ dot -Tpng output.dot > output.png

설명하다

  • sed 's/-/_/g' input-- Dot은 노드 이름의 하이픈을 좋아하지 않으므로 이를 밑줄로 변환합니다.
  • gawk--표준 awk에는 gawk의 기능이 없습니다 match. 원하는 방식으로 문자열 작업을 수행할 수 있습니다(예를 들어 Perl도 좋은 선택입니다).
    • BEGIN {print "digraph g {"}--포인트 지정은 이 라인부터 시작됩니다(그래프 이름 "g"는 중요하지 않음).
    • END {print "}"}-- digraph gBEGIN 블록의 시작 부분을 종료합니다.
    • match($0, /from ([^ ]*) to ([^ ]*) \((.*)\)$/, groups)-- 로그 파일 형식과 일치하는 정규식으로 결과를 groups변수 에 저장합니다.
    • print groups[1] " -> " groups[2] " [label = \"" groups[3] "\"];"-- 출력 포인트 호환성 라인(예를 들어 A -> B [label = "C"];두 개의 노드 A와 B가 표시되고 이들 사이의 전환은 C로 표시됩니다)
  • dot -Tpng output.dot > output.png-- graphviz에게 포인트 파일을 PNG로 변환하라고 지시합니다.

생성된 포인트 파일

digraph g {
EXITING_RETURNSTD -> EXITING_STAGEOUT [label = "5_51"];
RUNNING_PRERUN -> RUNNING_RUNNING [label = "4_42"];
RUNNING_RUNNING -> EXITING_EXITING [label = "5_50"];
EXITING_EXITING -> EXITING_RETURNSTD [label = "5_70"];
EXITING_RETURNSTD -> EXITING_STAGEOUT [label = "5_51"];
RUNNING_RUNNING -> EXITING_EXITING [label = "5_50"];
}

이 파일을 실행할 때 얻는 PNG는 dot다음과 같습니다.

답변2

저는 여러분이 필요로 하는 일, 즉 로그에서 유한 상태 머신을 생성하는 도구를 개발 중입니다. 이 도구는 Synoptic이라고 하며 여기에서 자세한 정보를 찾을 수 있습니다. http://code.google.com/p/synoptic/

관련 정보