From: "Ludovic Courtès" <ludo@gnu.org>
To: 74860@debbugs.gnu.org
Cc: "Ludovic Courtès" <ludo@gnu.org>,
"Ludovic Courtès" <ludo@gnu.org>,
"Maxim Cournoyer" <maxim.cournoyer@gmail.com>
Subject: [bug#74860] [PATCH 02/10] services: Add ‘log-rotation-service-type’.
Date: Fri, 13 Dec 2024 23:58:22 +0100 [thread overview]
Message-ID: <97dd04a5fbb49bcacc4b7d61749f64c8c6fae9d5.1734129908.git.ludo@gnu.org> (raw)
In-Reply-To: <cover.1734129908.git.ludo@gnu.org>
* gnu/services/admin.scm (%default-log-rotation-calendar-event): New
variable.
(<log-rotation-configuration>): New record type.
(log-rotation-shepherd-services): New procedure.
(log-rotation-service-type): New variable.
Change-Id: I4400035f3b6065ec147ac932110b690120d739c2
---
doc/guix.texi | 73 +++++++++++++++++++++++++++++++-
gnu/services/admin.scm | 95 ++++++++++++++++++++++++++++++++++++++----
2 files changed, 159 insertions(+), 9 deletions(-)
diff --git a/doc/guix.texi b/doc/guix.texi
index a2915de954..89a85961ac 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -20766,8 +20766,77 @@ Log Rotation
Log files such as those found in @file{/var/log} tend to grow endlessly,
so it's a good idea to @dfn{rotate} them once in a while---i.e., archive
their contents in separate files, possibly compressed. The @code{(gnu
-services admin)} module provides an interface to GNU@tie{}Rot[t]log, a
-log rotation tool (@pxref{Top,,, rottlog, GNU Rot[t]log Manual}).
+services admin)} module provides an interface to the log rotation
+service provided by the Shepherd (@pxref{Log Rotation,,, shepherd, The
+GNU Shepherd Manual}).
+
+This log rotation service is made available through
+@code{log-rotation-service-type}, which takes a
+@code{log-rotation-configuration} record has its value. By default,
+this provides @code{log-rotation}, a Shepherd ``timed service'' that
+runs periodically---once a week by default. It automatically knows
+about the log files produced by Shepherd services and can be taught
+about external log files. You can inspect the service and see when it's
+going to run the usual way:
+
+@example
+$ sudo herd status log-rotation
+Status of log-rotation:
+ It is running since Mon 09 Dec 2024 03:27:47 PM CET (2 days ago).
+ @dots{}
+
+Upcoming timer alarms:
+ Sun 15 Dec 2024 10:00:00 PM CET (in 4 days)
+ Sun 22 Dec 2024 10:00:00 PM CET (in 11 days)
+ Sun 29 Dec 2024 10:00:00 PM CET (in 18 days)
+@end example
+
+You can also list files subject to rotation with @command{herd files
+log-rotation} and trigger rotation manually with @command{herd trigger
+log-rotation}.
+
+@defvar log-rotation-service-type
+This is the type of the log rotation service. Its associated value must
+be a @code{log-rotation-configuration} record, as discussed below.
+@end defvar
+
+@deftp {Data Type} log-rotation-configuration
+This data type represents the configuration of the log rotation service.
+Its defaults should be good for most use cases.
+
+@table @asis
+@item @code{calendar-event} (default: every Sunday at 10PM)
+This is a gexp containing the @dfn{calendar event} when log rotation
+occurs. @xref{Timers,,, shepherd, The GNU Shepherd Manual}, for more
+information on calendar events.
+
+@item @code{external-log-files} (default: @code{'()})
+This is a list of file names, external log files that should also be
+rotated.
+
+@item @code{compression} (default: @code{'gzip})
+This is the compression method used for rotated log files, one of
+@code{'none}, @code{'gzip}, and @code{'zstd}.
+
+@item @code{expiry} (default: @code{#~(%default-log-expiry)})
+Age in seconds after which a log file is deleted.
+
+@item @code{size-threshold} @
+ (default: @code{#~(%default-rotation-size-threshold)})
+Size in bytes below which a log file is @emph{not} rotated.
+
+@item @code{provision} (default: @code{'(log-rotation)})
+@itemx @code{requirement} (default: @code{'(user-processes)})
+These are the name(s) and dependencies of the log rotation Shepherd
+service.
+@end table
+@end deftp
+
+@subheading Rottlog
+
+An alternative log rotation service relying on GNU@tie{}Rot[t]log, a log
+rotation tool (@pxref{Top,,, rottlog, GNU Rot[t]log Manual}), is also
+provided.
This service is part of @code{%base-services}, and thus enabled by
default, with the default settings, for commonly encountered log files.
diff --git a/gnu/services/admin.scm b/gnu/services/admin.scm
index 24ff659a01..5e1c197d78 100644
--- a/gnu/services/admin.scm
+++ b/gnu/services/admin.scm
@@ -1,6 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
-;;; Copyright © 2016-2023 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016-2024 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2020 Brice Waegeneire <brice@waegenei.re>
;;; Copyright © 2023 Giacomo Leidi <goodoldpaul@autistici.org>
;;;
@@ -39,7 +39,18 @@ (define-module (gnu services admin)
#:use-module (srfi srfi-1)
#:use-module (ice-9 match)
#:use-module (ice-9 vlist)
- #:export (%default-rotations
+ #:export (log-rotation-configuration
+ log-rotation-configuration?
+ log-rotation-configuration-provision
+ log-rotation-configuration-requirement
+ log-rotation-configuration-calendar-event
+ log-rotation-configuration-external-log-files
+ log-rotation-configuration-compression
+ log-rotation-configuration-expiry
+ log-rotation-configuration-size-threshold
+ log-rotation-service-type
+
+ %default-rotations
%rotated-files
log-rotation
@@ -97,14 +108,84 @@ (define-module (gnu services admin)
;;; Commentary:
;;;
-;;; This module implements configuration of rottlog by writing
-;;; /etc/rottlog/{rc,hourly|daily|weekly}. Example usage
-;;;
-;;; (mcron-service)
-;;; (service rottlog-service-type)
+;;; This module provides basic system administration tools: log rotation,
+;;; unattended upgrades, etc.
;;;
;;; Code:
+\f
+;;;
+;;; Shepherd's log rotation service.
+;;;
+
+(define %default-log-rotation-calendar-event
+ ;; Default calendar event when log rotation is triggered.
+ #~(calendar-event #:minutes '(0)
+ #:hours '(22)
+ #:days-of-week '(sunday)))
+
+(define-record-type* <log-rotation-configuration>
+ log-rotation-configuration make-log-rotation-configuration
+ log-rotation-configuration?
+ (provision log-rotation-configuration-provision (default '(log-rotation)))
+ (requirement log-rotation-configuration-requirement
+ (default (if for-home? '() '(user-processes))))
+ (calendar-event log-rotation-configuration-calendar-event
+ (default %default-log-rotation-calendar-event))
+ (external-log-files log-rotation-configuration-external-log-files
+ (default '()))
+ (compression log-rotation-configuration-compression (default 'gzip))
+ (expiry log-rotation-configuration-expiry
+ (default #~(%default-log-expiry)))
+ (size-threshold log-rotation-configuration-size-threshold
+ (default #~(%default-rotation-size-threshold))))
+
+(define (log-rotation-shepherd-services config)
+ (list (shepherd-service
+ (provision (log-rotation-configuration-provision config))
+ (requirement (log-rotation-configuration-requirement config))
+ (modules '((shepherd service timer) ;for 'calendar-event'
+ (shepherd service log-rotation)))
+ (free-form #~(log-rotation-service
+ #$(log-rotation-configuration-calendar-event config)
+ #:provision
+ '#$(log-rotation-configuration-provision config)
+ #:requirement
+ '#$(log-rotation-configuration-requirement config)
+ #:external-log-files
+ '#$(log-rotation-configuration-external-log-files
+ config)
+ #:compression
+ '#$(log-rotation-configuration-compression config)
+ #:expiry
+ #$(log-rotation-configuration-expiry config)
+ #:rotation-size-threshold
+ #$(log-rotation-configuration-size-threshold
+ config))))))
+
+(define log-rotation-service-type
+ (service-type
+ (name 'log-rotation)
+ (description
+ "Periodically rotate log files using the Shepherd's log rotation service.
+Run @command{herd status log-rotation} to view its status, @command{herd files
+log-rotation} to list files subject to log rotation.")
+ (extensions (list (service-extension shepherd-root-service-type
+ log-rotation-shepherd-services)))
+ (compose concatenate)
+ (extend (lambda (config log-files)
+ (log-rotation-configuration
+ (inherit config)
+ (external-log-files
+ (append (log-rotation-configuration-external-log-files config)
+ log-files)))))
+ (default-value (log-rotation-configuration))))
+
+\f
+;;;
+;;; Rottlog + mcron.
+;;;
+
(define-record-type* <log-rotation> log-rotation make-log-rotation
log-rotation?
(files log-rotation-files) ;list of strings
--
2.46.0
next prev parent reply other threads:[~2024-12-13 23:02 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-13 22:55 [bug#74860] [PATCH 00/10] Using the Shepherd's log rotation service Ludovic Courtès
2024-12-13 22:58 ` [bug#74860] [PATCH 01/10] gnu: shepherd@1.0: Add dependency on gzip and zstd Ludovic Courtès
2024-12-13 22:58 ` Ludovic Courtès [this message]
2024-12-13 22:58 ` [bug#74860] [PATCH 03/10] services: log-cleanup: Rewrite as a Shepherd timer Ludovic Courtès
2024-12-13 22:58 ` [bug#74860] [PATCH 04/10] services: unattended-upgrade: " Ludovic Courtès
2024-12-13 22:58 ` [bug#74860] [PATCH 05/10] services: Switch from mcron + Rottlog to Shepherd’s log rotation Ludovic Courtès
2024-12-13 22:58 ` [bug#74860] [PATCH 06/10] services: rottlog: Deprecate Ludovic Courtès
2024-12-13 22:58 ` [bug#74860] [PATCH 07/10] DRAFT news: Add entry for ‘rottlog-service-type’ deprecation Ludovic Courtès
2024-12-13 22:58 ` [bug#74860] [PATCH 08/10] home: services: Add log rotation service Ludovic Courtès
2024-12-13 22:58 ` [bug#74860] [PATCH 09/10] home: Define ‘%base-home-services’ Ludovic Courtès
2024-12-13 22:58 ` [bug#74860] [PATCH 10/10] home: Add log rotation to ‘%base-home-services’ Ludovic Courtès
2024-12-13 23:20 ` [bug#74860] [PATCH 00/10] Using the Shepherd's log rotation service Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=97dd04a5fbb49bcacc4b7d61749f64c8c6fae9d5.1734129908.git.ludo@gnu.org \
--to=ludo@gnu.org \
--cc=74860@debbugs.gnu.org \
--cc=maxim.cournoyer@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/guix.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.