1 ! Copyright (C) 2008 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: accessors peg peg.parsers memoize kernel sequences
\r
4 logging arrays words strings vectors io io.files io.encodings.utf8
\r
5 namespaces combinators logging.server calendar calendar.format ;
\r
8 TUPLE: log-entry date level word-name message ;
\r
10 : string-of ( quot -- parser )
\r
11 satisfy repeat0 [ >string ] action ; inline
\r
15 : 'date' ( -- parser )
\r
16 [ "]" member? not ] string-of [
\r
17 dup multiline-header =
\r
18 [ drop multiline ] [ rfc3339>timestamp ] if
\r
20 "[" "]" surrounded-by ;
\r
22 : 'log-level' ( -- parser )
\r
24 [ name>> token ] keep [ nip ] curry action
\r
27 : 'word-name' ( -- parser )
\r
28 [ " :" member? not ] string-of ;
\r
32 : 'malformed-line' ( -- parser )
\r
33 [ drop t ] string-of
\r
34 [ log-entry new swap >>message malformed >>level ] action ;
\r
36 : 'log-message' ( -- parser )
\r
37 [ drop t ] string-of
\r
38 [ 1vector ] action ;
\r
40 : 'log-line' ( -- parser )
\r
49 ] seq* [ first4 log-entry boa ] action
\r
50 'malformed-line' 2choice ;
\r
52 PEG: parse-log-line ( string -- entry ) 'log-line' ;
\r
54 : malformed? ( line -- ? )
\r
55 level>> malformed eq? ;
\r
57 : multiline? ( line -- ? )
\r
58 level>> multiline eq? ;
\r
60 : malformed-line ( line -- )
\r
61 "Warning: malformed log line:" print
\r
64 : add-multiline ( line -- )
\r
65 building get empty? [
\r
66 "Warning: log begins with multiline entry" print drop
\r
68 message>> first building get peek message>> push
\r
71 : parse-log ( lines -- entries )
\r
75 { [ dup malformed? ] [ malformed-line ] }
\r
76 { [ dup multiline? ] [ add-multiline ] }
\r
82 : parse-log-file ( service -- entries )
\r
83 log-path 1 log# dup exists?
\r
84 [ utf8 file-lines parse-log ] [ drop f ] if ;
\r