| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-12-14 23:38:14 -05:00
										 |  |  | USING: namespaces kernel io io.files io.pathnames io.directories | 
					
						
							| 
									
										
										
										
											2009-05-14 17:54:16 -04:00
										 |  |  | io.encodings.utf8 calendar calendar.format sequences continuations | 
					
						
							|  |  |  | destructors prettyprint assocs math.parser words debugger math | 
					
						
							|  |  |  | combinators concurrency.messaging threads arrays init math.ranges | 
					
						
							|  |  |  | strings ;
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  | IN: logging.server | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : log-root ( -- string )
 | 
					
						
							|  |  |  |     \ log-root get "logs" resource-path or ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : log-path ( service -- path )
 | 
					
						
							| 
									
										
										
										
											2008-03-19 20:15:32 -04:00
										 |  |  |     log-root prepend-path ;
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : log# ( path n -- path' )
 | 
					
						
							| 
									
										
										
										
											2008-03-19 20:15:32 -04:00
										 |  |  |     number>string ".log" append append-path ;
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: log-files | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : open-log-stream ( service -- stream )
 | 
					
						
							|  |  |  |     log-path | 
					
						
							|  |  |  |     dup make-directories | 
					
						
							| 
									
										
										
										
											2008-03-15 07:24:00 -04:00
										 |  |  |     1 log# utf8 <file-appender> ;
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : log-stream ( service -- stream )
 | 
					
						
							|  |  |  |     log-files get [ open-log-stream ] cache ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-05 12:36:41 -05:00
										 |  |  | : multiline-header ( -- string ) 20 CHAR: - <string> ; foldable
 | 
					
						
							| 
									
										
										
										
											2008-02-07 20:52:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 06:41:01 -05:00
										 |  |  | : (write-message) ( msg word-name level multi? -- )
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2008-02-07 20:52:40 -05:00
										 |  |  |         "[" write multiline-header write "] " write
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  |     ] [ | 
					
						
							|  |  |  |         "[" write now (timestamp>rfc3339) "] " write
 | 
					
						
							|  |  |  |     ] if
 | 
					
						
							|  |  |  |     write bl write ": " write print ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 06:41:01 -05:00
										 |  |  | : write-message ( msg word-name level -- )
 | 
					
						
							|  |  |  |     [ harvest ] 2dip { | 
					
						
							|  |  |  |         { [ pick empty? ] [ 3drop ] } | 
					
						
							|  |  |  |         { [ pick length 1 = ] [ [ first ] 2dip f (write-message) ] } | 
					
						
							| 
									
										
										
										
											2008-04-11 13:56:48 -04:00
										 |  |  |         [ | 
					
						
							| 
									
										
										
										
											2008-12-22 06:41:01 -05:00
										 |  |  |             [ [ first ] 2dip f (write-message) ] | 
					
						
							|  |  |  |             [ [ rest ] 2dip [ t (write-message) ] 2curry each ] | 
					
						
							|  |  |  |             3bi
 | 
					
						
							| 
									
										
										
										
											2008-04-11 13:56:48 -04:00
										 |  |  |         ] | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (log-message) ( msg -- )
 | 
					
						
							| 
									
										
										
										
											2008-12-22 06:41:01 -05:00
										 |  |  |     #! msg: { msg word-name level service } | 
					
						
							| 
									
										
										
										
											2008-05-05 03:19:25 -04:00
										 |  |  |     first4 log-stream [ write-message flush ] with-output-stream* ;
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : try-dispose ( stream -- )
 | 
					
						
							|  |  |  |     [ 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
 | 
					
						
							|  |  |  |     dup values [ try-dispose ] each
 | 
					
						
							|  |  |  |     clear-assoc ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-23 22:40:17 -05:00
										 |  |  | CONSTANT: keep-logs 10
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : ?delete-file ( path -- )
 | 
					
						
							|  |  |  |     dup exists? [ delete-file ] [ drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | : 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 -- )
 | 
					
						
							| 
									
										
										
										
											2009-08-13 20:21:44 -04:00
										 |  |  |     [ 1 - log# ] 2keep log# ?move-file ;
 | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : rotate-log ( service -- )
 | 
					
						
							| 
									
										
										
										
											2008-02-07 20:51:37 -05:00
										 |  |  |     dup close-log | 
					
						
							| 
									
										
										
										
											2008-02-07 18:07:43 -05:00
										 |  |  |     log-path | 
					
						
							|  |  |  |     dup delete-oldest | 
					
						
							|  |  |  |     keep-logs 1 [a,b] [ advance-log ] with each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (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 | 
					
						
							| 
									
										
										
										
											2009-10-19 22:17:02 -04:00
										 |  |  | ] "logging" add-startup-hook |