This file is indexed.

/usr/share/guile/site/logging/rotating-log.scm is in guile-library 0.2.1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
;; (logging rotating-log) -- a log that writes to rotating files
;; Copyright (C) 2003  Richard Todd

;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

#!
;;; Commentary:
@cindex logs, rotating

This module defines a log handler for text logs that rotate when they
get to be a user-defined size.  This is similar to the behavior of
many UNIX standard log files.  @xref{logging logger}, for more
information in general on log handlers.

;;; Code:
!#

(define-module (logging rotating-log)
  #:use-module (oop goops)
  #:use-module (logging logger)
  #:use-module (scheme documentation)
  #:export (<rotating-log>))

(define-class-with-docs <rotating-log> (<log-handler>)
"This is a log handler which writes text logs that rotate when they reach
a configurable size limit.

Keywords recognized by @code{<rotating-log>} on creation are:
@table @code
@item #:num-files
This is the number of log files you want the logger to use.  Default is 4.

@item #:size-limit
This is the size, in bytes, a log file must get before the logs get
rotated.  Default is 1MB (104876 bytes).

@item #:file-name
This is the base of the log file name.   Default is ``logfile''.  Numbers will
be appended to the file name representing the log number.  The newest log
file is always ``@var{NAME}.1''.

@item #:formatter
Allows the user to provide a function to use as the log formatter for
this handler.  @xref{logging logger <log-handler>}, for details.
@end table

Example of creating a @code{<rotating-log>}:
@lisp
 (make <rotating-log>
      #:num-files 3
      #:size-limit 1024
      #:file-name \"test-log-file\"))
@end lisp"
  (num-files #:init-value 4 #:getter num-files #:init-keyword #:num-files)
  (size-limit #:init-value 1048576 #:getter size-limit #:init-keyword #:size-limit)
  (file-name  #:init-value "logfile" #:getter file-name #:init-keyword #:file-name)
  (port       #:init-value #f        #:accessor port)
  (fpos       #:accessor fpos))

(define-method (log-file-name (self <rotating-log>) num)
  (string-append (file-name self) "." (number->string num)))

(define-method (open-log! (self <rotating-log>))
  (set! (port self) (open-file (log-file-name self 1) "a"))
  (set! (fpos self) (ftell (port self))))

(define-method (close-log! (self <rotating-log>))
  (if (port self)
      (close-port (port self)))
  (set! (port self) #f))

(define-method (rotate-log (self <rotating-log>))
  ;; close the existing log...
  (close-log! self)

  ;; loop through the files, renaming .2 to .3, .1 to .2, etc...
  (let loop ((num (- (num-files self) 1)))
    (if (<= num 0)
        #t
        (begin
          (if (access? (log-file-name self num) F_OK)
              (rename-file (log-file-name self num)
                           (log-file-name self (+ num 1))))
          (loop (- num 1)))))

  ;; now open up a new xx.1 file...
  (open-log! self))

(define-method (emit-log (self <rotating-log>) str)
  (if (port self)
      (begin 
        (display str (port self))
        (set! (fpos self) (+ (string-length str)
                             (fpos self)))
        (if (> (fpos self)
               (size-limit self))
            (rotate-log self)))))

(define-method (flush-log (self <rotating-log>))
  (if (port self) 
      (force-output (port self))))

;;; arch-tag: 2e4d28d0-2c71-4ea5-b46d-572e1aa94a22