Skip to content

Instantly share code, notes, and snippets.

@jself
Last active August 29, 2015 14:20
Show Gist options
  • Save jself/a477cb0fe9da733c32ee to your computer and use it in GitHub Desktop.
Save jself/a477cb0fe9da733c32ee to your computer and use it in GitHub Desktop.
Simple logger
(defpackage :debug
(:use :common-lisp)
(:export debug set-debug-output debug-call disable-logger enable-logger debug-type disabled with-disabled-loggers))
(in-package :debug)
(defclass logger ()
((types :initarg :types :initform nil :accessor types)
(disabled :initarg :disabled :initform nil :accessor disabled)))
;All loggers start enabled
(defparameter *logger* (make-instance 'logger))
(defun logger-disabledp (type)
(member type (disabled *logger*)))
(defun logger-enabledp (type)
(not (logger-disabledp type)))
(defun enable-logger (type)
(if (logger-disabledp type)
(setf (disabled *logger*) (reverse (intersection (disabled *logger*) (list type) :test-not #'equalp)))))
(defun disable-logger (type)
(pushnew type (disabled *logger*)))
(defmacro with-disabled-loggers (loggers &body body)
(let ((listvar (gensym)))
`(progn
(dolist (,listvar ,loggers)
(disable-logger ,listvar))
(unwind-protect (progn ,@body)
(dolist (,listvar ,loggers)
(enable-logger ,listvar))))))
(defparameter *out* *standard-output*)
(defmacro debug-type (type s &rest rest)
`(when (logger-enabledp ,type)
(format *out* "DEBUG (~a): ~a~%" ,type (format nil ,s ,@rest))))
(defmacro debug (&rest rest)
(etypecase (first rest)
(string `(debug-type :default ,@rest))
(symbol `(debug-type ,@rest))))
(defun set-debug-output (output)
(setf *out* output))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment