1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs io io.styles kernel logging
4 logging.parser math namespaces prettyprint sequences sorting
10 SYMBOL: word-histogram
11 SYMBOL: message-histogram
13 : analyze-entry ( entry -- )
14 dup level>> { ERROR CRITICAL } member-eq? [ dup errors get push ] when
15 dup word-name>> word-histogram get inc-at
16 dup word-name>> word-names get member? [
17 dup [ level>> ] [ word-name>> ] [ message>> ] tri 3array
18 message-histogram get inc-at
22 : recent-histogram ( assoc n -- alist )
23 [ sort-values <reversed> ] dip index-or-length head ;
25 : analyze-entries ( entries word-names -- errors word-histogram message-histogram )
29 H{ } clone word-histogram set
30 H{ } clone message-histogram set
32 [ analyze-entry ] each
35 word-histogram get 10 recent-histogram
36 message-histogram get 10 recent-histogram
39 : histogram. ( assoc quot -- )
40 standard-table-style [
42 [ swapd with-cell pprint-cell ] with-row
44 ] tabular-output ; inline
46 : 10-most-recent ( errors -- errors )
47 10 tail* "Only showing 10 most recent errors" print nl ;
49 : errors. ( errors -- )
50 dup length 10 >= [ 10-most-recent ] when
53 : analysis. ( errors word-histogram message-histogram -- )
54 nl "==== FREQUENT MESSAGES:" print nl
55 "Total: " write dup sum-values . nl
57 [ first name>> write bl ]
58 [ second write ": " write ]
59 [ third join-lines write ]
63 "==== FREQUENT WORDS:" print nl
66 "==== ERRORS:" print nl
69 : analyze-log ( lines word-names -- )
70 [ parse-log ] dip analyze-entries analysis. ;
72 : analyze-log-file ( service word-names -- )
73 [ parse-log-file ] dip analyze-entries analysis. ;