mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 15:36:20 -05:00
services: rottlog: Define <log-rotation> objects.
* gnu/services/admin.scm (<log-rotation>): New record type. (syslog-rotation-config, simple-rotation-config): Remove. (%default-rotations): Define as a list of <log-rotation> objects. (log-rotation->config, log-rotations->/etc-entries): New procedures. (<rottlog-configuration>)[periodic-rotations]: Remove. [rotations]: New field. (rottlog-etc): Use 'log-rotations->/etc-entries'. * doc/guix.texi (Log Rotation): Update accordingly.
This commit is contained in:
parent
d30c4841de
commit
81fa2229ec
2 changed files with 118 additions and 50 deletions
|
@ -9543,7 +9543,7 @@ services admin)} module provides an interface to GNU@tie{}Rot[t]log, a
|
||||||
log rotation tool (@pxref{Top,,, rottlog, GNU Rot[t]log Manual}).
|
log rotation tool (@pxref{Top,,, rottlog, GNU Rot[t]log Manual}).
|
||||||
|
|
||||||
The example below defines an operating system that provides log rotation
|
The example below defines an operating system that provides log rotation
|
||||||
with the default settings.
|
with the default settings, for commonly encountered log files.
|
||||||
|
|
||||||
@lisp
|
@lisp
|
||||||
(use-modules (guix) (gnu))
|
(use-modules (guix) (gnu))
|
||||||
|
@ -9576,23 +9576,8 @@ The Rottlog package to use.
|
||||||
The Rottlog configuration file to use (@pxref{Mandatory RC Variables,,,
|
The Rottlog configuration file to use (@pxref{Mandatory RC Variables,,,
|
||||||
rottlog, GNU Rot[t]log Manual}).
|
rottlog, GNU Rot[t]log Manual}).
|
||||||
|
|
||||||
@item @code{periodic-rotations} (default: @code{`(("weekly" %default-rotations))})
|
@item @code{rotations} (default: @code{%default-rotations})
|
||||||
A list of Rottlog period-name/period-config tuples.
|
A list of @code{log-rotation} objects as defined below.
|
||||||
|
|
||||||
For example, taking an example from the Rottlog manual (@pxref{Period
|
|
||||||
Related File Examples,,, rottlog, GNU Rot[t]log Manual}), a valid tuple
|
|
||||||
might be:
|
|
||||||
|
|
||||||
@example
|
|
||||||
("daily" ,(plain-file "daily"
|
|
||||||
"\
|
|
||||||
/var/log/apache/* @{
|
|
||||||
storedir apache-archives
|
|
||||||
rotate 6
|
|
||||||
notifempty
|
|
||||||
nocompress
|
|
||||||
@}"))
|
|
||||||
@end example
|
|
||||||
|
|
||||||
@item @code{jobs}
|
@item @code{jobs}
|
||||||
This is a list of gexps where each gexp corresponds to an mcron job
|
This is a list of gexps where each gexp corresponds to an mcron job
|
||||||
|
@ -9600,9 +9585,44 @@ specification (@pxref{Scheduled Job Execution}).
|
||||||
@end table
|
@end table
|
||||||
@end deftp
|
@end deftp
|
||||||
|
|
||||||
|
@deftp {Data Type} log-rotation
|
||||||
|
Data type representing the rotation of a group of log files.
|
||||||
|
|
||||||
|
Taking an example from the Rottlog manual (@pxref{Period Related File
|
||||||
|
Examples,,, rottlog, GNU Rot[t]log Manual}), a log rotation might be
|
||||||
|
defined like this:
|
||||||
|
|
||||||
|
@example
|
||||||
|
(log-rotation
|
||||||
|
(frequency 'daily)
|
||||||
|
(files '("/var/log/apache/*"))
|
||||||
|
(options '("storedir apache-archives"
|
||||||
|
"rotate 6"
|
||||||
|
"notifempty"
|
||||||
|
"nocompress")))
|
||||||
|
@end example
|
||||||
|
|
||||||
|
The list of fields is as follows:
|
||||||
|
|
||||||
|
@table @asis
|
||||||
|
@item @code{frequency} (default: @code{'weekly})
|
||||||
|
The log rotation frequency, a symbol.
|
||||||
|
|
||||||
|
@item @code{files}
|
||||||
|
The list of files or file glob patterns to rotate.
|
||||||
|
|
||||||
|
@item @code{options} (default: @code{'()})
|
||||||
|
The list of rottlog options for this rotation (@pxref{Configuration
|
||||||
|
parameters,,, rottlog, GNU Rot[t]lg Manual}).
|
||||||
|
|
||||||
|
@item @code{post-rotate} (default: @code{#f})
|
||||||
|
Either @code{#f} or a gexp to execute once the rotation has completed.
|
||||||
|
@end table
|
||||||
|
@end deftp
|
||||||
|
|
||||||
@defvr {Scheme Variable} %default-rotations
|
@defvr {Scheme Variable} %default-rotations
|
||||||
Specifies weekly rotation of @var{%rotated-files} and
|
Specifies weekly rotation of @var{%rotated-files} and
|
||||||
@code{"/var/log/shepherd.log"}.
|
a couple of other files.
|
||||||
@end defvr
|
@end defvr
|
||||||
|
|
||||||
@defvr {Scheme Variable} %rotated-files
|
@defvr {Scheme Variable} %rotated-files
|
||||||
|
|
|
@ -27,8 +27,17 @@ (define-module (gnu services admin)
|
||||||
#:use-module (guix packages)
|
#:use-module (guix packages)
|
||||||
#:use-module (guix records)
|
#:use-module (guix records)
|
||||||
#:use-module (srfi srfi-1)
|
#:use-module (srfi srfi-1)
|
||||||
|
#:use-module (ice-9 vlist)
|
||||||
#:export (%default-rotations
|
#:export (%default-rotations
|
||||||
%rotated-files
|
%rotated-files
|
||||||
|
|
||||||
|
log-rotation
|
||||||
|
log-rotation?
|
||||||
|
log-rotation-frequency
|
||||||
|
log-rotation-files
|
||||||
|
log-rotation-options
|
||||||
|
log-rotation-post-rotate
|
||||||
|
|
||||||
rottlog-configuration
|
rottlog-configuration
|
||||||
rottlog-configuration?
|
rottlog-configuration?
|
||||||
rottlog-service
|
rottlog-service
|
||||||
|
@ -40,41 +49,78 @@ (define-module (gnu services admin)
|
||||||
;;; /etc/rottlog/{rc,hourly|daily|weekly}. Example usage
|
;;; /etc/rottlog/{rc,hourly|daily|weekly}. Example usage
|
||||||
;;;
|
;;;
|
||||||
;;; (mcron-service)
|
;;; (mcron-service)
|
||||||
;;; (service rottlog-service-type (rottlog-configuration))
|
;;; (service rottlog-service-type)
|
||||||
;;;
|
;;;
|
||||||
;;; Code:
|
;;; Code:
|
||||||
|
|
||||||
|
(define-record-type* <log-rotation> log-rotation make-log-rotation
|
||||||
|
log-rotation?
|
||||||
|
(files log-rotation-files) ;list of strings
|
||||||
|
(frequency log-rotation-frequency ;symbol
|
||||||
|
(default 'weekly))
|
||||||
|
(post-rotate log-rotation-post-rotate ;#f | gexp
|
||||||
|
(default #f))
|
||||||
|
(options log-rotation-options ;list of strings
|
||||||
|
(default '())))
|
||||||
|
|
||||||
(define %rotated-files
|
(define %rotated-files
|
||||||
;; Syslog files subject to rotation.
|
;; Syslog files subject to rotation.
|
||||||
'("/var/log/messages" "/var/log/secure" "/var/log/maillog"))
|
'("/var/log/messages" "/var/log/secure" "/var/log/maillog"))
|
||||||
|
|
||||||
(define (syslog-rotation-config files)
|
|
||||||
#~(string-append #$(string-join files ",")
|
|
||||||
" {
|
|
||||||
sharedscripts
|
|
||||||
postrotate
|
|
||||||
" #$coreutils "/bin/kill -HUP $(cat /var/run/syslog.pid) 2> /dev/null
|
|
||||||
endscript
|
|
||||||
}
|
|
||||||
"))
|
|
||||||
|
|
||||||
(define (simple-rotation-config files)
|
|
||||||
#~(string-append #$(string-join files ",") " {
|
|
||||||
sharedscripts
|
|
||||||
}
|
|
||||||
"))
|
|
||||||
|
|
||||||
(define %default-rotations
|
(define %default-rotations
|
||||||
`(("weekly"
|
(list (log-rotation ;syslog files
|
||||||
,(computed-file "rottlog.weekly"
|
(files %rotated-files)
|
||||||
#~(call-with-output-file #$output
|
|
||||||
(lambda (port)
|
;; Restart syslogd after rotation.
|
||||||
(display #$(syslog-rotation-config %rotated-files)
|
(options '("sharedscripts"))
|
||||||
port)
|
(post-rotate #~(let ((pid (call-with-input-file "/var/run/syslog.pid"
|
||||||
(display #$(simple-rotation-config
|
read)))
|
||||||
'("/var/log/shepherd.log"
|
(kill pid SIGHUP))))
|
||||||
"/var/log/guix-daemon.log"))
|
(log-rotation
|
||||||
port)))))))
|
(files '("/var/log/shepherd.log" "/var/log/guix-daemon.log")))))
|
||||||
|
|
||||||
|
(define (log-rotation->config rotation)
|
||||||
|
"Return a string-valued gexp representing the rottlog configuration snippet
|
||||||
|
for ROTATION."
|
||||||
|
(define post-rotate
|
||||||
|
(let ((post (log-rotation-post-rotate rotation)))
|
||||||
|
(and post
|
||||||
|
(program-file "rottlog-post-rotate.scm" post))))
|
||||||
|
|
||||||
|
#~(let ((post #$post-rotate))
|
||||||
|
(string-append (string-join '#$(log-rotation-files rotation) ",")
|
||||||
|
" {"
|
||||||
|
#$(string-join (log-rotation-options rotation)
|
||||||
|
"\n " 'prefix)
|
||||||
|
(if post
|
||||||
|
(string-append "\n postrotate\n " post
|
||||||
|
"\n endscript\n")
|
||||||
|
"")
|
||||||
|
"\n}\n")))
|
||||||
|
|
||||||
|
(define (log-rotations->/etc-entries rotations)
|
||||||
|
"Return the list of /etc entries for ROTATIONS, a list of <log-rotation>."
|
||||||
|
(define (frequency-file frequency rotations)
|
||||||
|
(computed-file (string-append "rottlog." (symbol->string frequency))
|
||||||
|
#~(call-with-output-file #$output
|
||||||
|
(lambda (port)
|
||||||
|
(for-each (lambda (str)
|
||||||
|
(display str port))
|
||||||
|
(list #$@(map log-rotation->config
|
||||||
|
rotations)))))))
|
||||||
|
|
||||||
|
(let* ((frequencies (delete-duplicates
|
||||||
|
(map log-rotation-frequency rotations)))
|
||||||
|
(table (fold (lambda (rotation table)
|
||||||
|
(vhash-consq (log-rotation-frequency rotation)
|
||||||
|
rotation table))
|
||||||
|
vlist-null
|
||||||
|
rotations)))
|
||||||
|
(map (lambda (frequency)
|
||||||
|
`(,(symbol->string frequency)
|
||||||
|
,(frequency-file frequency
|
||||||
|
(vhash-foldq* cons '() frequency table))))
|
||||||
|
frequencies)))
|
||||||
|
|
||||||
(define (default-jobs rottlog)
|
(define (default-jobs rottlog)
|
||||||
(list #~(job '(next-hour '(0)) ;midnight
|
(list #~(job '(next-hour '(0)) ;midnight
|
||||||
|
@ -91,15 +137,17 @@ (define-record-type* <rottlog-configuration>
|
||||||
(default rottlog))
|
(default rottlog))
|
||||||
(rc-file rottlog-rc-file ;file-like
|
(rc-file rottlog-rc-file ;file-like
|
||||||
(default (file-append rottlog "/etc/rc")))
|
(default (file-append rottlog "/etc/rc")))
|
||||||
(periodic-rotations rottlog-periodic-rotations ;list of (name file) tuples
|
(rotations rottlog-rotations ;list of <log-rotation>
|
||||||
(default %default-rotations))
|
(default %default-rotations))
|
||||||
(jobs rottlog-jobs ;list of <mcron-job>
|
(jobs rottlog-jobs ;list of <mcron-job>
|
||||||
(default #f)))
|
(default #f)))
|
||||||
|
|
||||||
(define (rottlog-etc config)
|
(define (rottlog-etc config)
|
||||||
`(("rottlog" ,(file-union "rottlog"
|
`(("rottlog"
|
||||||
(cons `("rc" ,(rottlog-rc-file config))
|
,(file-union "rottlog"
|
||||||
(rottlog-periodic-rotations config))))))
|
(cons `("rc" ,(rottlog-rc-file config))
|
||||||
|
(log-rotations->/etc-entries
|
||||||
|
(rottlog-rotations config)))))))
|
||||||
|
|
||||||
(define (rottlog-jobs-or-default config)
|
(define (rottlog-jobs-or-default config)
|
||||||
(or (rottlog-jobs config)
|
(or (rottlog-jobs config)
|
||||||
|
|
Loading…
Reference in a new issue