1 ! Copyright (C) 2008, 2010 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: kernel sequences namespaces words assocs logging sorting
\r
4 prettyprint io io.styles io.files io.encodings.utf8
\r
5 strings combinators accessors arrays math
\r
6 logging.server logging.parser calendar.format ;
\r
11 SYMBOL: word-histogram
\r
12 SYMBOL: message-histogram
\r
14 : analyze-entry ( entry -- )
\r
15 dup level>> { ERROR CRITICAL } member-eq? [ dup errors get push ] when
\r
16 dup word-name>> word-histogram get inc-at
\r
17 dup word-name>> word-names get member? [
\r
18 dup [ level>> ] [ word-name>> ] [ message>> ] tri 3array
\r
19 message-histogram get inc-at
\r
23 : recent-histogram ( assoc n -- alist )
\r
24 [ sort-values <reversed> ] dip short head ;
\r
26 : analyze-entries ( entries word-names -- errors word-histogram message-histogram )
\r
29 V{ } clone errors set
\r
30 H{ } clone word-histogram set
\r
31 H{ } clone message-histogram set
\r
33 [ analyze-entry ] each
\r
36 word-histogram get 10 recent-histogram
\r
37 message-histogram get 10 recent-histogram
\r
40 : histogram. ( assoc quot -- )
\r
41 standard-table-style [
\r
43 [ swapd with-cell pprint-cell ] with-row
\r
45 ] tabular-output ; inline
\r
47 : 10-most-recent ( errors -- errors )
\r
48 10 tail* "Only showing 10 most recent errors" print nl ;
\r
50 : errors. ( errors -- )
\r
51 dup length 10 >= [ 10-most-recent ] when
\r
54 : analysis. ( errors word-histogram message-histogram -- )
\r
55 nl "==== FREQUENT MESSAGES:" print nl
\r
56 "Total: " write dup values sum . nl
\r
58 [ first name>> write bl ]
\r
59 [ second write ": " write ]
\r
60 [ third "\n" join write ]
\r
64 "==== FREQUENT WORDS:" print nl
\r
65 [ write ] histogram.
\r
67 "==== ERRORS:" print nl
\r
70 : analyze-log ( lines word-names -- )
\r
71 [ parse-log ] dip analyze-entries analysis. ;
\r
73 : analyze-log-file ( service word-names -- )
\r
74 [ parse-log-file ] dip analyze-entries analysis. ;
\r