mylisp/log4-hi-mode.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Sat, 02 Jan 2021 00:33:04 +0200
changeset 1666 06937ff1ec5f
parent 1625 log4-hi-mode.el@ceaee5c146cc
child 1749 8a249e97c2a5
permissions -rw-r--r--
Moved my elisp modes to dedicated directory to not mixt with init.el.

;;; log4-hi-mode.el --- Syntax highlighting logs keywords.

;;; Commentary:
;; Used for highlighting ERROR/WARN/INFO like keywords and dates in logs.

;;; Code:

(defgroup log4-hi nil
  "`log4-hi-mode' mode for highlighting logs."
  :prefix "log4-hi-"
  :group 'text)

(defface log4-hi-error-face
  '((t :inherit error))
  "Face for critical message."
  :group 'log4-hi)

(defface log4-hi-warn-face
  '((t :inherit warning))
  "Face for urgent message."
  :group 'log4-hi)

(defface log4-hi-info-face
  '((t :inherit success))
  "Face for informational message."
  :group 'log4-hi)

(defface log4-hi-func-face
  '((t :inherit font-lock-function-name-face))
  "Face for functions in trace."
  :group 'log4-hi)

(defface log4-hi-time-face
  '((t :inherit font-lock-builtin-face :height 0.7))
  "Face for time."
  :group 'log4-hi)

(defface log4-hi-hide-face
  '((t :inherit shadow :height 0.7 :family "Arial"))
  "Face for extra text for hiding."
  :group 'log4-hi)

(defvar log4-hi-keywords
  '(("FATAL\\|ERROR" . 'log4-hi-error-face)
    ("WARN\\|SEVERE" . 'log4-hi-warn-face)
    ("INFO\\|DEBUG\\|TRACE" . 'log4-hi-info-face) ))

(defvar log4-hi-func-keywords
  '(("^.\\{0,5\\}at [[:alnum:]./]+\\.\\([[:alnum:]$]+\\.[[:alnum:]$<>]+\\)([[:alnum:]]+\\.java:[0-9]+)" 1 'log4-hi-func-face) )
  "Highlight regex for line from Java stack trace.")

(defvar log4-hi-time-keywords
  '(("\\(:?\\(:?[0-9]\\{2\\}?[0-9]\\{2\\}.\\)?[0-9]\\{2\\}.[0-9]\\{2\\}.\\|\\<\\)[0-9]?[0-9]:[0-9][0-9]:[0-9][0-9]\\>\\(:?[.,][0-9]\\{3,6\\}\\)?" . 'log4-hi-time-face))
  "Highlight regex for ISO date.")

(defvar log4-hi-hide-regex
  '(("\\[`.\\{3,100\\}`]" . 'log4-hi-hide-face))
  "Highlight regex for extra text for hiding.")

(defvar log4-hi-func t
  "Mark to use hilighting of function names in stacktraces. Currently only Java supported.")

(defvar log4-hi-mode-map (make-sparse-keymap)
  "Keymap for `log4-hi-mode'.")

;;;###autoload
(define-minor-mode log4-hi-mode
  "Highlight standard elements in log4* like log-files."
  nil " log4-hi" log4-hi-mode-map
  :global nil
  (catch 'exit
    (when log4-hi-mode
      (font-lock-mode 1)
      (font-lock-add-keywords nil log4-hi-keywords)
      (font-lock-add-keywords nil log4-hi-time-keywords)
      (font-lock-add-keywords nil log4-hi-hide-regex)
      (when log4-hi-func (font-lock-add-keywords nil log4-hi-func-keywords))
      (setq prettify-symbols-alist (list (cons "[`" ?$,2'f(B) (cons "`]" ?$,2'g(B)))
      (prettify-symbols-mode 1)
      (throw 'exit nil))
    (font-lock-remove-keywords nil log4-hi-keywords)
    (font-lock-remove-keywords nil log4-hi-time-keywords)
    (font-lock-remove-keywords nil log4-hi-func-keywords)
    (font-lock-remove-keywords nil log4-hi-hide-regex)
    (prettify-symbols-mode -1))
  (font-lock-flush))

(provide 'log4-hi-mode)

(provide 'log4-hi-mode)

;;; log4-hi-mode.el ends here