factor/basis/logging/server/server.factor

115 lines
3.0 KiB
Factor
Raw Normal View History

2008-02-07 18:07:43 -05:00
! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs calendar calendar.format combinators
concurrency.messaging continuations debugger destructors init io
io.directories io.encodings.utf8 io.files io.pathnames kernel
locals math math.parser math.ranges namespaces sequences
strings threads ;
2008-02-07 18:07:43 -05:00
IN: logging.server
: log-root ( -- string )
\ log-root get-global [ "logs" resource-path ] unless* ;
2008-02-07 18:07:43 -05:00
: log-path ( service -- path )
log-root prepend-path ;
2008-02-07 18:07:43 -05:00
: log# ( path n -- path' )
number>string ".log" append append-path ;
2008-02-07 18:07:43 -05:00
SYMBOL: log-files
: open-log-stream ( service -- stream )
log-path
2012-08-25 21:42:37 -04:00
[ make-directories ]
[ 1 log# utf8 <file-appender> ] bi ;
2008-02-07 18:07:43 -05:00
: log-stream ( service -- stream )
log-files get [ open-log-stream ] cache ;
: close-log-streams ( -- )
log-files get [ values dispose-each ] [ clear-assoc ] bi ;
:: with-log-root ( path quot -- )
[ close-log-streams path \ log-root set-global quot call ]
\ log-root get-global
[ \ log-root set-global close-log-streams ] curry
[ ] cleanup ; inline
: timestamp-header. ( -- )
"[" write now (timestamp>rfc3339) "] " write ;
2008-02-07 20:52:40 -05:00
: multiline-header ( -- str ) 20 CHAR: - <string> ; foldable
: multiline-header. ( -- )
"[" write multiline-header write "] " write ;
2008-02-07 18:07:43 -05:00
2008-12-22 06:41:01 -05:00
: write-message ( msg word-name level -- )
[ harvest ] 2dip pick empty? [ 3drop ] [
timestamp-header.
[ write bl write ": " write print ] 2curry
[ multiline-header. ] swap interleave
] if ;
2008-02-07 18:07:43 -05:00
: (log-message) ( msg -- )
2008-12-22 06:41:01 -05:00
#! msg: { msg word-name level service }
first4 log-stream [ write-message flush ] with-output-stream* ;
2008-02-07 18:07:43 -05:00
: try-dispose ( obj -- )
2008-02-07 18:07:43 -05:00
[ dispose ] curry [ error. ] recover ;
2008-02-07 20:51:37 -05:00
: close-log ( service -- )
2008-02-07 18:07:43 -05:00
log-files get delete-at*
[ try-dispose ] [ drop ] if ;
2008-02-07 20:51:37 -05:00
: (close-logs) ( -- )
2008-02-07 18:07:43 -05:00
log-files get
2012-08-25 21:42:37 -04:00
[ values [ try-dispose ] each ] [ clear-assoc ] bi ;
2008-02-07 18:07:43 -05:00
CONSTANT: keep-logs 10
2008-02-07 18:07:43 -05:00
: ?delete-file ( path -- )
dup exists? [ delete-file ] [ drop ] if ;
: delete-oldest ( service -- )
keep-logs log# ?delete-file ;
2008-02-07 18:07:43 -05:00
2008-02-27 15:59:15 -05:00
: ?move-file ( old new -- )
over exists? [ move-file ] [ 2drop ] if ;
2008-02-07 18:07:43 -05:00
: advance-log ( path n -- )
[ 1 - log# ] 2keep log# ?move-file ;
2008-02-07 18:07:43 -05:00
: rotate-log ( service -- )
2012-08-25 21:42:37 -04:00
[ close-log ]
[
log-path
[ delete-oldest ]
[ keep-logs 1 [a,b] [ advance-log ] with each ] bi
] bi ;
2008-02-07 18:07:43 -05:00
: (rotate-logs) ( -- )
2008-02-07 20:51:37 -05:00
(close-logs)
2008-10-19 16:41:04 -04:00
log-root directory-files [ rotate-log ] each ;
2008-02-07 18:07:43 -05:00
2008-02-10 02:39:37 -05:00
: log-server-loop ( -- )
2008-02-18 08:30:16 -05:00
receive unclip {
{ "log-message" [ (log-message) ] }
{ "rotate-logs" [ drop (rotate-logs) ] }
{ "close-logs" [ drop (close-logs) ] }
} case log-server-loop ;
2008-02-07 18:07:43 -05:00
: log-server ( -- )
2008-06-11 21:27:31 -04:00
[
init-namespaces
[ log-server-loop ]
[ error. (close-logs) ]
recover t
]
2008-02-18 08:30:16 -05:00
"Log server" spawn-server
"log-server" set-global ;
2008-02-07 18:07:43 -05:00
[
H{ } clone log-files set-global
log-server
] "logging" add-startup-hook