diff --git a/README.markdown b/README.markdown index 143d584..486d0ba 100644 --- a/README.markdown +++ b/README.markdown @@ -5,6 +5,8 @@ A Common Lisp structured logger for Fluentd. ## Usage ```common-lisp +(ql:quickload :cl-fluent-logger) + (defvar *logger* (make-instance 'fluent-logger:fluent-logger)) @@ -19,6 +21,18 @@ A Common Lisp structured logger for Fluentd. '(("from" . "userA") ("to" . "userB"))) ``` +### Log4CL Integration + +```common-lisp +(ql:quickload :cl-fluent-logger/log4cl) + +(defvar *logger* (log:category '(cl-user))) +(fluent-logger/log4cl:create-fluent-logger *logger* :tag "debug" :level :info) + +(log:info "hi") +;-> [17:03:33] (cl-user) - hi +``` + ## Author * Eitaro Fukamachi (e.arrows@gmail.com) diff --git a/log4cl.lisp b/log4cl.lisp new file mode 100644 index 0000000..5a18810 --- /dev/null +++ b/log4cl.lisp @@ -0,0 +1,38 @@ +(defpackage #:cl-fluent-logger/log4cl + (:nicknames :fluent-logger/log4cl) + (:use #:cl) + (:import-from #:cl-fluent-logger + #:fluent-logger + #:send) + (:import-from #:log4cl) + (:export #:fluent-appender + #:create-fluent-logger)) +(in-package #:cl-fluent-logger/log4cl) + +(defclass fluent-appender (log4cl:appender) + ((logger :accessor fluent-appender-logger + :initarg :logger + :initform nil))) + +(defmethod initialize-instance :after ((appender fluent-appender) &rest initargs) + (unless (fluent-appender-logger appender) + (setf (fluent-appender-logger appender) + (apply #'make-instance 'fluent-logger :allow-other-keys t initargs)))) + +(defmethod log4cl:appender-do-append ((appender fluent-appender) logger level log-func) + (declare (ignore logger)) + (send (fluent-appender-logger appender) + (string-downcase (log4cl:log-level-to-string level)) + (with-output-to-string (s) (funcall log-func s)))) + +(defun create-fluent-logger (logger &rest initargs + &key tag host port buffer-limit timeout nanosecond-precision + level) + (declare (ignore tag host port buffer-limit timeout nanosecond-precision)) + (log:config logger level) + (let* ((fluent-logger (apply #'make-instance 'fluent-logger + :allow-other-keys t + initargs)) + (appender (make-instance 'fluent-appender :logger fluent-logger))) + (log4cl:add-appender logger appender) + logger))