diff --git a/log4cl-examples.asd b/log4cl-examples.asd index 0dbbcf1..6482a94 100644 --- a/log4cl-examples.asd +++ b/log4cl-examples.asd @@ -13,12 +13,8 @@ ;;; See the License for the specific language governing permissions and ;;; limitations under the License. -(asdf:defsystem #:log4cl-examples - :version "1.1.2" - :depends-on (#:log4cl #:swank) - :components ((:file "examples/naming-examples") +(asdf:defsystem "log4cl-examples" + :version "1.1.3" + :depends-on ("log4cl" "swank") + :components ((:file "examples/naming-examples") (:file "examples/customize-log-expr"))) - - - - diff --git a/log4cl.asd b/log4cl.asd index 025ee5f..cab8b53 100644 --- a/log4cl.asd +++ b/log4cl.asd @@ -13,61 +13,71 @@ ;;; See the License for the specific language governing permissions and ;;; limitations under the License. -(defpackage :log4cl.system - (:use #:cl #:asdf)) - -(in-package :log4cl.system) - -(defsystem :log4cl +(asdf:defsystem "log4cl" :version "1.1.3" - :depends-on (:bordeaux-threads - #+sbcl :sb-posix) - :components - ((module "src" :serial t - :components ((:file "impl-package") - (:file "defs") - (:file "naming") - #+sbcl (:file "naming-sbcl") - #+ccl (:file "naming-ccl") - (:file "appender-base") - (:file "hierarchy-base") - (:file "hierarchy") - (:file "logger") - (:file "logging-macros") - (:file "self-logger") - (:file "layout") - (:file "simple-layout") - (:file "pattern-layout") - (:file "appender") - (:file "watcher") - (:file "configurator") - (:file "property-parser") - (:file "property-configurator") - (:file "package")))) - :in-order-to ((test-op (test-op :log4cl/test)))) + :depends-on ("bordeaux-threads" + #+sbcl "sb-posix") ; for SB-POSIX:GETPID in pattern-layout.lisp + :components ((:module "src" + :serial t + :components ((:file "impl-package") + (:file "defs") + (:file "naming") + #+sbcl (:file "naming-sbcl") + #+ccl (:file "naming-ccl") + (:file "hierarchy-base") + (:file "hierarchy") + (:file "logger") + (:file "logging-macros") + (:file "self-logger"))) + (:module "appender" + :pathname "src/appender" + :depends-on ("src") + :serial t + :components ((:file "layout") + (:file "simple-layout") + (:file "pattern-layout") + + (:file "appender-base") + (:file "appender"))) + (:module "configuration" + :pathname "src" + :depends-on ("src" "appender") + :serial t + :components ((:file "configurator") + (:file "property-parser") + (:file "property-configurator"))) + (:module "watcher" + :pathname "src" + :depends-on ("src" "appender") + :components ((:file "watcher"))) + (:module "client-package" + :pathname "src" + :depends-on ("src" "configuration") + :components ((:file "package")))) + :in-order-to ((test-op (test-op "log4cl/test")))) -(defmethod perform :after ((op load-op) (system (eql (find-system :log4cl)))) - (when (find-package :log4cl) - (let ((*package* (find-package :log4cl)) - (foo (find-symbol (symbol-name '#:%fix-root-logger-check) - (find-package :log4cl)))) - (when foo - (funcall foo)))) +(defmethod perform :after ((op load-op) (system (eql (find-system "log4cl")))) + (let ((package (find-package '#:log4cl))) + (when package + (let ((*package* package) + (foo (find-symbol (symbol-name '#:%fix-root-logger-check)))) + (when foo + (funcall foo))))) (values)) -(defsystem :log4cl/syslog +(asdf:defsystem "log4cl/syslog" :version "1.1.3" - :depends-on (:log4cl - #-sbcl :cl-syslog) + :depends-on ("log4cl" + #-sbcl "cl-syslog") :components ((:module "src" :serial t :components ((:file "syslog-appender") #+sbcl (:file "syslog-appender-sbcl") #-sbcl (:file "syslog-appender-cffi"))))) -(defsystem :log4cl/test +(asdf:defsystem "log4cl/test" :version "1.1.3" - :depends-on (:log4cl :stefil) + :depends-on ("log4cl" "stefil") :components ((:module "tests" :serial t :components ((:file "test-defs") diff --git a/log4slime.asd b/log4slime.asd index 3c65f82..0816d9e 100644 --- a/log4slime.asd +++ b/log4slime.asd @@ -13,11 +13,7 @@ ;;; See the License for the specific language governing permissions and ;;; limitations under the License. -(asdf:defsystem #:log4slime - :version "1.1.2" - :depends-on (#:log4cl #:swank) +(asdf:defsystem "log4slime" + :version "1.1.3" + :depends-on ("log4cl" "swank") :components ((:file "src/log4slime"))) - - - - diff --git a/src/appender-base.lisp b/src/appender/appender-base.lisp similarity index 99% rename from src/appender-base.lisp rename to src/appender/appender-base.lisp index 0bd5dc2..ab55137 100644 --- a/src/appender-base.lisp +++ b/src/appender/appender-base.lisp @@ -68,6 +68,7 @@ opened.")) (:documentation "Called from SAVE-HOOKS, must close appenders that own their stream in a such way, so its possible to reopen them")) + (defgeneric appender-do-append (appender logger level log-func) (:documentation "Writes the log message into the appender. Text of the log message @@ -137,7 +138,7 @@ Type | Description ------------------------|------------------------------------------------------ NUMBER or :NUMBER | Integer property, converted by (parse-integer) ------------------------|------------------------------------------------------ -BOOLEAN or :BOOLEAN | Boolean, accepts \"true\" \"t\" \"on\" \"false\" +BOOLEAN or :BOOLEAN | Boolean, accepts \"true\" \"t\" \"on\" \"false\" | \"off\" \"nil\" and empty string ------------------------|------------------------------------------------------ STRING or :STRING | Value as-is after the equal sign in NAME = @@ -151,7 +152,7 @@ configurable from by property file configurator. See also PROPERTY-INITARG-FROM-STRING")) (defgeneric appender-do-flush (appender time) - (:documentation + (:documentation "Perform any flushes of appender output if needed, marking the that output was performed at time TIME. This function can be called from any thread and should take care of serializing") diff --git a/src/appender.lisp b/src/appender/appender.lisp similarity index 99% rename from src/appender.lisp rename to src/appender/appender.lisp index eb57e38..3d6eff7 100644 --- a/src/appender.lisp +++ b/src/appender/appender.lisp @@ -241,9 +241,8 @@ time of the flush with TIME" (all-appenders all-hierarchies)))) (defun save-all-appenders (&optional (all-hierarchies t)) - "Flush any appenders that had output since being flushed" - (map nil (lambda (x) (save-appender x)) - (all-appenders all-hierarchies))) + "Save all appenders, that is, clean up all resources." + (map nil #'save-appender (all-appenders all-hierarchies))) (defmethod appender-do-append :around ((this serialized-appender) logger level log-func) @@ -262,7 +261,7 @@ time of the flush with TIME" ;; Save one generic function dispatch by accessing STREAM slot directly (defmethod appender-do-append ((this fixed-stream-appender-base) logger - level + level log-func) (with-slots (layout stream %output-since-flush) this (layout-to-stream layout stream logger level log-func) diff --git a/src/layout.lisp b/src/appender/layout.lisp similarity index 100% rename from src/layout.lisp rename to src/appender/layout.lisp diff --git a/src/pattern-layout.lisp b/src/appender/pattern-layout.lisp similarity index 100% rename from src/pattern-layout.lisp rename to src/appender/pattern-layout.lisp index da05f9f..ae29f07 100644 --- a/src/pattern-layout.lisp +++ b/src/appender/pattern-layout.lisp @@ -663,13 +663,13 @@ unchanged" start-depth end-depth))) (values)) +(declaim (inline adjusted-logger-depth)) + (defun adjusted-logger-depth (logger) (if (typep logger 'source-file-logger) (1- (logger-depth logger)) (logger-depth logger))) -(declaim (inline adjusted-logger-depth)) - (define-pattern-formatter (#\c) "Format the %c (full log category) pattern" (declare (ignore log-level log-func)) diff --git a/src/simple-layout.lisp b/src/appender/simple-layout.lisp similarity index 100% rename from src/simple-layout.lisp rename to src/appender/simple-layout.lisp diff --git a/src/syslog-appender-cffi.lisp b/src/appender/syslog-appender-cffi.lisp similarity index 100% rename from src/syslog-appender-cffi.lisp rename to src/appender/syslog-appender-cffi.lisp diff --git a/src/syslog-appender-sbcl.lisp b/src/appender/syslog-appender-sbcl.lisp similarity index 100% rename from src/syslog-appender-sbcl.lisp rename to src/appender/syslog-appender-sbcl.lisp diff --git a/src/syslog-appender.lisp b/src/appender/syslog-appender.lisp similarity index 100% rename from src/syslog-appender.lisp rename to src/appender/syslog-appender.lisp diff --git a/src/impl-package.lisp b/src/impl-package.lisp index d05fc33..df26c92 100644 --- a/src/impl-package.lisp +++ b/src/impl-package.lisp @@ -21,197 +21,190 @@ ;; Use this package if you are extending LOG4CL or writing your own ;; appenders -(defpackage #:log4cl-impl-fixer - (:use :cl)) +(defpackage #:log4cl.package-setup + (:use #:cl)) -(in-package #:log4cl-impl-fixer) - -(eval-when (:compile-toplevel :load-toplevel :execute) - (let* ((p1 (find-package '#:log4cl)) - (p2 (find-package '#:log4cl-impl))) - (when (and p1 p2 (not (eq p1 p2))) - (delete-package p1)))) +(in-package #:log4cl.package-setup) (macrolet ((%define-log4cl-package () - (let* ((p2 (find-package '#:log4cl-impl))) - (let* ((old-exports (when p2 - (let (list) - (do-external-symbols (s p2 list) - (push s list))))) - (new-exports - '( - ;; log levels - #:+log-level-unset+ #:+log-level-unset+ #:+log-level-debu9+ - #:+log-level-debu8+ #:+log-level-debu7+ #:+log-level-debu6+ - #:+log-level-debu5+ #:+log-level-debu4+ #:+log-level-debu3+ - #:+log-level-debu2+ #:+log-level-debu1+ #:+log-level-trace+ - #:+log-level-debug+ #:+log-level-info+ #:+log-level-warn+ - #:+log-level-error+ #:+log-level-fatal+ #:+log-level-off+ - ;; logging macros - #:log-fatal #:log-error #:log-warn #:log-info #:log-debug #:log-trace - #:log-debu1 #:log-debu2 #:log-debu3 #:log-debu4 #:log-debu5 #:log-debu6 - #:log-debu7 #:log-debu8 #:log-debu9 #:log-sexp #:log-sexp-with-level - ;; sexp version of logging macros - #:log-sexp-fatal #:log-sexp-error #:log-sexp-warn #:log-sexp-info #:log-sexp-debug #:log-sexp-trace - #:log-sexp-debu1 #:log-sexp-debu2 #:log-sexp-debu3 #:log-sexp-debu4 #:log-sexp-debu5 #:log-sexp-debu6 - #:log-sexp-debu7 #:log-sexp-debu8 #:log-sexp-debu9 - #:log-indented - ;; logger access functions - #:make-log-level #:make-logger - #:set-log-level - #:logger-parent - #:logger-log-level - #:logger-appenders - #:effective-log-level - #:effective-appenders - #:add-appender - #:appender-added - #:appender-removed - #:logger-added - #:logger-removed - #:stream-appender - #:log-config - #:logger-name - #:logger-category - #:logger-depth - #:naming-option - #:log-level-from-object - #:resolve-logger-form - #:resolve-default-logging-form - #:enclosing-scope-block-name - #:reset-logging-configuration - #:clear-logging-configuration - ;; special variables - #:*hierarchy* #:*root-logger* #:*default-logger-name* #:*log-indent* - #:*ndc-context* #:*global-console* - ;; hierarchy - #:hierarchy-index - #:with-log-hierarchy - #:in-log-hierarchy - #:with-package-log-hierarchy - #:in-package-log-hierarchy - ;; layouts & appenders - #:layout - #:layout-to-stream - #:appender-do-append - ;; standard layouts - #:default-layout - #:simple-layout - ;; standard appenders - #:appender - #:stream-appender - #:console-appender - #:serialized-appender - #:fixed-stream-appender - #:appender-stream - #:pattern-layout - #:pattern-layout-error - #:+min-log-level+ - #:+max-log-level+ - #:log-level-to-string - #:with-ndc-context - #:with-ndc - #:with-log-indent - #:logger-additivity - #:appender-error - #:handle-appender-error - #:file-appender-base - #:file-appender - #:rolling-file-appender-base - #:time-rolling-file-appender - #:maybe-roll-file - #:backup-log-file - #:appender-logger-count - #:close-appender - #:remove-appender - #:remove-all-appenders - #:appender-filename - #:daily-file-appender - #:+self-logger+ - #:package-wrapper - #:logger-categories - #:property-parser - #:parse-property-stream - #:property-configurator - #:conversion-pattern - #:property-parser-error - #:configure - #:logger-children - #:logger-descendants - #:map-logger-children - #:map-logger-descendants - #:start-hierarchy-watcher-thread - #:stop-hierarchy-watcher-thread - #:add-watch-token - #:remove-watch-token - #:watch-token-check - #:log4cl-error - #:save - #:*configurations-file* - #:*save-configurations-to-file* - #:*max-configurations* - #:restore - #:same-configuration-p - #:all-configurations - #:list-configurations - #:configuration-element - #:configuration - #:*logger-truename* - #:logger-file - #:*default-naming-configuration* - #:*naming-configuration* - #:naming-configuration - #:appender-next-backup-file - #:appender-last-backup-file - #:logger-file-namestring - #:logger-file-logger - #:logger-ancestors - #:inherited-log-level - #:+self-meta-logger+ - #:appender-layout - #:appender-last-error - #:appender-last-ignored-error - #:appender-error-count - #:appender-ignored-error-count - #:appender-message-count - #:appender-enabled-p - #:counting-appender - #:this-console-appender - #:temp-appender - #:temp-appender-error-type - #:appender-loggers - #:old-logging-macros - #:packge-options - #:appender-do-flush - #:flush-appender - #:flush-all-appenders - #:save-appender - #:all-appenders - #:+expr-format-simple+ - #:+expr-format-fancy+ - #:category-separator - #:category-case - #:expr-print-format - #:join-categories - #:make-package-categories - #:%get-logger - #:with-package-naming-configuration - #:fix-method-spec-list - #:tricky-console-appender - #:syslog-appender)) - ;; avoid SBCL (also exports) error - (removed-exports - (set-difference old-exports - new-exports - :test #'string= - :key #'string)) - (defpackage-form - `(defpackage #:log4cl-impl - (:nicknames #:log4cl) - (:use #:cl) - (:export ,@new-exports)))) - (when (and p2 removed-exports) - (unexport removed-exports p2)) - defpackage-form)))) + (let* ((p2 (find-package '#:log4cl-impl)) + (old-exports (when p2 + (let ((list '())) + (do-external-symbols (s p2 list) + (push s list))))) + (new-exports + '(;; log levels + #:+log-level-unset+ #:+log-level-unset+ #:+log-level-debu9+ + #:+log-level-debu8+ #:+log-level-debu7+ #:+log-level-debu6+ + #:+log-level-debu5+ #:+log-level-debu4+ #:+log-level-debu3+ + #:+log-level-debu2+ #:+log-level-debu1+ #:+log-level-trace+ + #:+log-level-debug+ #:+log-level-info+ #:+log-level-warn+ + #:+log-level-error+ #:+log-level-fatal+ #:+log-level-off+ + ;; logging macros + #:log-fatal #:log-error #:log-warn #:log-info #:log-debug #:log-trace + #:log-debu1 #:log-debu2 #:log-debu3 #:log-debu4 #:log-debu5 #:log-debu6 + #:log-debu7 #:log-debu8 #:log-debu9 #:log-sexp #:log-sexp-with-level + ;; sexp version of logging macros + #:log-sexp-fatal #:log-sexp-error #:log-sexp-warn #:log-sexp-info #:log-sexp-debug #:log-sexp-trace + #:log-sexp-debu1 #:log-sexp-debu2 #:log-sexp-debu3 #:log-sexp-debu4 #:log-sexp-debu5 #:log-sexp-debu6 + #:log-sexp-debu7 #:log-sexp-debu8 #:log-sexp-debu9 + #:log-indented + ;; logger access functions + #:make-log-level #:make-logger + #:set-log-level + #:logger-parent + #:logger-log-level + #:logger-appenders + #:effective-log-level + #:effective-appenders + #:add-appender + #:appender-added + #:appender-removed + #:logger-added + #:logger-removed + #:stream-appender + #:log-config + #:logger-name + #:logger-category + #:logger-depth + #:naming-option + #:log-level-from-object + #:resolve-logger-form + #:resolve-default-logging-form + #:enclosing-scope-block-name + #:reset-logging-configuration + #:clear-logging-configuration + ;; special variables + #:*hierarchy* #:*root-logger* #:*default-logger-name* #:*log-indent* + #:*ndc-context* #:*global-console* + ;; hierarchy + #:hierarchy-index + #:with-log-hierarchy + #:in-log-hierarchy + #:with-package-log-hierarchy + #:in-package-log-hierarchy + ;; layouts & appenders + #:layout + #:layout-to-stream + #:appender-do-append + ;; standard layouts + #:default-layout + #:simple-layout + ;; standard appenders + #:appender + #:stream-appender + #:console-appender + #:serialized-appender + #:fixed-stream-appender + #:appender-stream + #:pattern-layout + #:pattern-layout-error + #:+min-log-level+ + #:+max-log-level+ + #:log-level-to-string + #:with-ndc-context + #:with-ndc + #:with-log-indent + #:logger-additivity + #:appender-error + #:handle-appender-error + #:file-appender-base + #:file-appender + #:rolling-file-appender-base + #:time-rolling-file-appender + #:maybe-roll-file + #:backup-log-file + #:appender-logger-count + #:close-appender + #:remove-appender + #:remove-all-appenders + #:appender-filename + #:daily-file-appender + #:+self-logger+ + #:package-wrapper + #:logger-categories + #:property-parser + #:parse-property-stream + #:property-configurator + #:conversion-pattern + #:property-parser-error + #:configure + #:logger-children + #:logger-descendants + #:map-logger-children + #:map-logger-descendants + #:start-hierarchy-watcher-thread + #:stop-hierarchy-watcher-thread + #:add-watch-token + #:remove-watch-token + #:watch-token-check + #:log4cl-error + #:save + #:*configurations-file* + #:*save-configurations-to-file* + #:*max-configurations* + #:restore + #:same-configuration-p + #:all-configurations + #:list-configurations + #:configuration-element + #:configuration + #:*logger-truename* + #:logger-file + #:*default-naming-configuration* + #:*naming-configuration* + #:naming-configuration + #:appender-next-backup-file + #:appender-last-backup-file + #:logger-file-namestring + #:logger-file-logger + #:logger-ancestors + #:inherited-log-level + #:+self-meta-logger+ + #:appender-layout + #:appender-last-error + #:appender-last-ignored-error + #:appender-error-count + #:appender-ignored-error-count + #:appender-message-count + #:appender-enabled-p + #:counting-appender + #:this-console-appender + #:temp-appender + #:temp-appender-error-type + #:appender-loggers + #:old-logging-macros + #:packge-options + #:appender-do-flush + #:flush-appender + #:flush-all-appenders + #:save-appender + #:all-appenders + #:+expr-format-simple+ + #:+expr-format-fancy+ + #:category-separator + #:category-case + #:expr-print-format + #:join-categories + #:make-package-categories + #:%get-logger + #:with-package-naming-configuration + #:fix-method-spec-list + #:tricky-console-appender + #:syslog-appender)) + ;; avoid SBCL (also exports) error + (removed-exports + (set-difference old-exports + new-exports + :test #'string= + :key #'string)) + (defpackage-form + `(defpackage #:log4cl-impl + (:nicknames #:log4cl) + (:use #:cl) + (:export ,@new-exports)))) + (when (and p2 removed-exports) + (unexport removed-exports p2)) + defpackage-form))) (%define-log4cl-package)) diff --git a/src/logger.lisp b/src/logger.lisp index e401bd5..ad781af 100644 --- a/src/logger.lisp +++ b/src/logger.lisp @@ -40,7 +40,7 @@ ;; root logger (declaim (special *root-logger*) (type logger *root-logger*) - (type fixnum *log-indent*) + (type fixnum *log-indent*) (inline is-enabled-for current-state log-level-to-string log-level-to-lc-string @@ -92,11 +92,18 @@ (state (map-into (make-array *hierarchy-max*) #'make-logger-state) :type (simple-array logger-state *))) +(defun current-state (logger) + (svref (%logger-state logger) *hierarchy*)) + (defstruct (root-logger (:constructor %create-root-logger) (:include logger)) (dummy nil)) +(declaim (inline logger-category logger-category-separator + logger-name-start-pos logger-parent logger-child-hash + logger-state)) + (defun logger-category (logger) (%logger-category logger)) (defun logger-category-separator (logger) (%logger-category-separator logger)) (defun logger-name-start-pos (logger) (%logger-name-start-pos logger)) @@ -104,10 +111,6 @@ (defun logger-child-hash (logger) (%logger-child-hash logger)) (defun logger-state (logger) (%logger-state logger)) -(declaim (inline logger-category logger-category-separator - logger-name-start-pos logger-parent logger-child-hash - logger-state)) - ;; Special logger representing the source file (defstruct (source-file-logger (:constructor create-source-file-logger) @@ -477,9 +480,6 @@ which is a special type of leaf logger representing the source file." (setf (fdefinition 'get-logger-internal) (fdefinition '%get-logger)) -(defun current-state (logger) - (svref (%logger-state logger) *hierarchy*)) - (defun is-enabled-for (logger level) "Returns t if log level is enabled for the logger in the context of the current application." diff --git a/src/watcher.lisp b/src/watcher.lisp index a3d1a3a..340059d 100644 --- a/src/watcher.lisp +++ b/src/watcher.lisp @@ -18,22 +18,6 @@ (defvar *watcher-thread-bindings* nil "Extra bindings for watcher thread") -;; Not sure if this stuff is needed, but since we exit hierarchy -;; watcher thread by asynchronous bt:destroy-thread, and SBCL provides -;; support for it, no penalty in being extra careful - -(defmacro %without-interrupts (&body body) - #+sb-thread `(sb-sys:without-interrupts ,@body) - #-sb-thread`(progn ,@body)) - -(defmacro %allow-with-interrupts (&body body) - #+sb-thread `(sb-sys:allow-with-interrupts ,@body) - #-sb-thread`(progn ,@body)) - -(defmacro %with-local-interrupts (&body body) - #+sb-thread `(sb-sys:with-local-interrupts ,@body) - #-sb-thread`(progn ,@body)) - (defun call-with-logged-problems (context thunk) (handler-case (funcall thunk) (error (condition) @@ -60,21 +44,18 @@ (bordeaux-threads:make-thread (lambda () ;; prevent two watcher threads from being started due to race - (%without-interrupts - (when (with-hierarchies-lock - (cond (*watcher-thread* - (%with-local-interrupts - (log-debug "Watcher thread already started") - nil)) - (t (setq *watcher-thread* (bt:current-thread))))) - (unwind-protect - (%with-local-interrupts - (handler-case - (progn - (log-info :logger logger "Hierarchy watcher started") - (loop for *watcher-event-time* = (get-universal-time) - do (hierarchy-watcher-once) - until + (when (with-hierarchies-lock + (cond (*watcher-thread* + (log-debug "Watcher thread already started") + nil) + (t (setq *watcher-thread* (bt:current-thread))))) + (unwind-protect + (handler-case + (progn + (log-info :logger logger "Hierarchy watcher started") + (loop for *watcher-event-time* = (get-universal-time) + do (hierarchy-watcher-once) + until #-ecl ; timeout on cv signals error in ECL 16.1.3 (bt:with-lock-held (*stop-lock*) (bt:condition-wait *stop-cv* *stop-lock* @@ -85,20 +66,19 @@ (bt:with-timeout (*hierarchy-watcher-heartbeat*) (bt:acquire-lock *stop-lock*)) (serious-condition () nil)))) - (error (e) - (log-error :logger logger "Error in hierarchy watcher thread:~%~A" e)))) - (with-hierarchies-lock - ;; lock might not have been acquired (i.e terminate-thread was called) - #+ecl (ignore-errors (bt:release-lock *stop-lock*)) - (setf *watcher-thread* nil)) - (%with-local-interrupts (log-info :logger logger "Hierarchy watcher thread ended")))))) + (error (e) + (log-error :logger logger "Error in hierarchy watcher thread:~%~A" e))) + (with-hierarchies-lock + ;; lock might not have been acquired (i.e terminate-thread was called) + #+ecl (ignore-errors (bt:release-lock *stop-lock*)) + (setf *watcher-thread* nil)) + (log-info :logger logger "Hierarchy watcher thread ended")))) :name "Hierarchy Watcher" :initial-bindings `((*hierarchy* . 0) - (*package* . (find-package :log4cl-impl)) + (*package* . (find-package '#:log4cl-impl)) ,@*watcher-thread-bindings*))))) - (defun hierarchy-watcher-do-one-token (hier token) (with-slots (name) hier (with-log-hierarchy (hier)