1 ! Copyright (C) 2003, 2008 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: logging.server sequences namespaces concurrency.messaging
\r
4 words kernel arrays shuffle tools.annotations
\r
5 prettyprint.config prettyprint debugger io.streams.string
\r
6 splitting continuations effects arrays.lib parser strings
\r
7 combinators.lib quotations fry symbols accessors ;
\r
10 SYMBOLS: DEBUG NOTICE WARNING ERROR CRITICAL ;
\r
12 : log-levels { DEBUG NOTICE NOTICE WARNING ERROR CRITICAL } ;
\r
14 : send-to-log-server ( array string -- )
\r
15 prefix "log-server" get send ;
\r
19 : check-log-message ( msg word level -- msg word level )
\r
20 3dup [ string? ] [ word? ] [ word? ] tri* and and
\r
21 [ "Bad parameters to log-message" throw ] unless ; inline
\r
23 : log-message ( msg word level -- )
\r
25 log-service get dup [
\r
26 [ [ string-lines ] [ word-name ] [ word-name ] tri* ] dip
\r
27 4array "log-message" send-to-log-server
\r
32 : rotate-logs ( -- )
\r
33 { } "rotate-logs" send-to-log-server ;
\r
36 { } "close-logs" send-to-log-server ;
\r
38 : with-logging ( service quot -- )
\r
39 log-service swap with-variable ; inline
\r
41 ! Aspect-oriented programming idioms
\r
45 : one-string? ( obj -- ? )
\r
49 [ dup first string? ]
\r
52 : stack>message ( obj -- inputs>message )
\r
53 dup one-string? [ first ] [
\r
59 } clone [ unparse ] bind
\r
64 : (define-logging) ( word level quot -- )
\r
65 [ dup ] 2dip 2curry annotate ;
\r
67 : call-logging-quot ( quot word level -- quot' )
\r
68 "called" -rot [ log-message ] 3curry prepose ;
\r
70 : add-logging ( word level -- )
\r
71 [ call-logging-quot ] (define-logging) ;
\r
73 : log-stack ( n word level -- )
\r
75 [ [ ndup ] keep narray stack>message ] 2dip log-message
\r
80 : input# ( word -- n ) stack-effect in>> length ;
\r
82 : input-logging-quot ( quot word level -- quot' )
\r
83 rot [ [ input# ] keep ] 2dip '[ , , , log-stack @ ] ;
\r
85 : add-input-logging ( word level -- )
\r
86 [ input-logging-quot ] (define-logging) ;
\r
88 : output# ( word -- n ) stack-effect out>> length ;
\r
90 : output-logging-quot ( quot word level -- quot' )
\r
91 [ [ output# ] keep ] dip '[ @ , , , log-stack ] ;
\r
93 : add-output-logging ( word level -- )
\r
94 [ output-logging-quot ] (define-logging) ;
\r
96 : (log-error) ( object word level -- )
\r
98 [ [ print-error ] with-string-writer ] 2dip log-message
\r
103 : log-error ( error word -- ) ERROR (log-error) ;
\r
105 : log-critical ( error word -- ) CRITICAL (log-error) ;
\r
107 : stack-balancer ( effect -- quot )
\r
108 [ in>> length [ ndrop ] curry ]
\r
109 [ out>> length f <repetition> >quotation ]
\r
112 : error-logging-quot ( quot word -- quot' )
\r
113 dup stack-effect stack-balancer
\r
114 '[ , [ , log-error @ ] recover ] ;
\r
116 : add-error-logging ( word level -- )
\r
117 [ [ input-logging-quot ] 2keep drop error-logging-quot ]
\r
121 #! Syntax: name level
\r
122 CREATE-WORD dup scan-word
\r
123 '[ 1array stack>message , , log-message ]
\r
124 (( message -- )) define-declared ; parsing
\r