   (save-excursion
     (goto-char (point-min))
     (remove-overlays)
-    (let ((unknown-tags '()))
+    (let ((unknown-tags '())
+          (max-file-field-length 0))
       (while (not (eobp))
-        (when (looking-at "[0-9][^|\n]*|[^|\n]*|\\( *\\([^|\n]*\\) |\\).*$")
+        (point)
+        (when (looking-at "[0-9][^|\n]*| \\( *[^|\n]+:[0-9]+\\) *|\\( *\\([^|\n]*\\) |\\).*$")
           (let* ((beg (match-beginning 0))
                  (end (match-end 0))
                  (line-overlay (make-overlay beg end))
-                 (tag-overlay (make-overlay (match-beginning 1) (match-end 1)))
-                 (tag-list (split-string (match-string 2) "_")))
+                 (file-point (match-beginning 1))
+                 (tag-overlay (make-overlay (match-beginning 2) (match-end 2)))
+                 (file-field (match-string 1))
+                 (tag-field (match-string 3))
+                 (tag-list (split-string (match-string 3) "_")))
             (overlay-put line-overlay 'help-echo (mapconcat #'identity tag-list "; "))
+            (overlay-put line-overlay 'ovirt-log-analyzer-file-reference file-field)
+            (when (string-match "^\\(.*/\\)\\([^/]+\\)$" file-field)
+              (let ((file-overlay (make-overlay file-point (+ file-point (match-end 1))))
+                    (length (- (match-end 2) (match-beginning 2))))
+                (overlay-put file-overlay 'invisible t)
+                (overlay-put file-overlay 'ovirt-log-analyzer-file-field-length length)
+                (setq max-file-field-length (max max-file-field-length length))))
             (overlay-put tag-overlay 'invisible t)
             (dolist (tag tag-list)
               (cond

               (t
                (add-to-list 'unknown-tags tag))))))
        (forward-line))
      (when unknown-tags
        (message "Unknown tags found: %s" (mapconcat #'identity unknown-tags "; "))))))


;;; Major mode for inspecting oVirt log analyzer result output

(require 'cl-lib)
(require 'hl-line)

(defun ovirt-log-analyzer-show-log ()
  (interactive)
  (let ((file-reference (get-char-property (point) 'ovirt-log-analyzer-file-reference)))
    (unless file-reference
      (error "No file reference found"))
    (string-match "^ *\\(.*\\):\\([0-9]+\\)" file-reference)
    (let ((file (match-string 1 file-reference))
          (line (string-to-number (match-string 2 file-reference))))
      (find-file file)
      (goto-char 1)
      (forward-line (1- line)))))

(defun ovirt-log-analyzer-poi (search-function)
  (let ((point (funcall search-function (point) 'face)))
