civodul pushed a commit to branch devel
in repository shepherd.

commit 8883bee0aec49108775eee49c690897a2f253222
Author: Ludovic Courtès <l...@gnu.org>
AuthorDate: Tue Aug 6 23:21:50 2024 +0200

    logger: Change ‘file’ to ‘files’ (plural).
    
    * modules/shepherd/logger.scm (%service-file-logger): Change 'file
    request to 'files and adjust reply accordingly.  Add argument to
    'rotate and handle it.
    (service-builtin-logger, service-system-logger): Likewise.
    (logger-file): Rename to…
    (logger-files): … this, and send 'files request (plural).
    (rotate-log-file): Add ‘file’ parameter and pass it to LOGGER.
    * modules/shepherd/scripts/herd.scm (<live-service>)[log-file]: Rename to…
    [log-files]: … this.
    (sexp->live-service): Adjust accordingly.
    (display-service-status): Likewise.
    * modules/shepherd/service.scm (service-log-file): Rename to…
    (service-log-files): … this.
    (service->sexp): Change ‘log-file’ to ‘log-files’.
    * modules/shepherd/service/log-rotation.scm (rotate-logs): Iterate over
    the ‘logger-files’ list.
    (log-rotation-service): Likewise.
    * tests/status-sexp.sh: Change ‘log-file’ to ‘log-files’.
---
 modules/shepherd/logger.scm               | 84 +++++++++++++++++--------------
 modules/shepherd/scripts/herd.scm         | 18 ++++---
 modules/shepherd/service.scm              | 12 +++--
 modules/shepherd/service/log-rotation.scm | 32 ++++++------
 tests/status-sexp.sh                      |  8 +--
 5 files changed, 83 insertions(+), 71 deletions(-)

diff --git a/modules/shepherd/logger.scm b/modules/shepherd/logger.scm
index a8f9886..9937507 100644
--- a/modules/shepherd/logger.scm
+++ b/modules/shepherd/logger.scm
@@ -38,7 +38,7 @@
             spawn-service-system-logger
 
             logger-recent-messages
-            logger-file
+            logger-files
             rotate-log-file
 
             open-log-file))
@@ -157,30 +157,38 @@ not exist."
               (('recent-messages reply)
                (put-message reply (ring-buffer->list messages))
                (loop messages service))
-              (('file reply)
-               (put-message reply file)
+              (('files reply)
+               (put-message reply (list file))
                (loop messages service))
-              (('rotate rotated-file reply)
-               (local-output (l10n "Rotating '~a' to '~a'.")
-                             file rotated-file)
-               (newline output)
-               (log-line (l10n "Rotating log.") output)
-               (close-port output)
-               (let ((output (catch 'system-error
-                               (lambda ()
-                                 (rename-file file rotated-file)
-                                 (open-log-file file))
-                               (lambda args
-                                 args))))
-                 (put-message reply (port? output))
-                 (if (port? output)
-                     (log output messages service)
-                     (begin
-                       (local-output
-                        (l10n "Failed to rotate '~a' to '~a': ~a.")
-                        file rotated-file
-                        (strerror (system-error-errno output)))
-                       (loop messages service)))))
+              (('rotate requested-file rotated-file reply)
+               (if (string=? requested-file file)
+                   (begin
+                     (local-output (l10n "Rotating '~a' to '~a'.")
+                                   file rotated-file)
+                     (newline output)
+                     (log-line (l10n "Rotating log.") output)
+                     (close-port output)
+                     (let ((output (catch 'system-error
+                                     (lambda ()
+                                       (rename-file file rotated-file)
+                                       (open-log-file file))
+                                     (lambda args
+                                       args))))
+                       (put-message reply (port? output))
+                       (if (port? output)
+                           (log output messages service)
+                           (begin
+                             (local-output
+                              (l10n "Failed to rotate '~a' to '~a': ~a.")
+                              file rotated-file
+                              (strerror (system-error-errno output)))
+                             (loop messages service)))))
+                   (begin
+                     (local-output (l10n "Ignoring request to \
+rotate '~a' (log file is '~a').")
+                                   requested-file file)
+                     (put-message reply #f)
+                     (loop messages service))))
               (line
                (let ((now (log-line line output)))
                  (loop (ring-buffer-insert (cons now line)
@@ -260,10 +268,10 @@ to @var{history-size} lines in memory."
         (('recent-messages reply)
          (put-message reply (ring-buffer->list messages))
          (loop pid messages service))
-        (('file reply)
-         (put-message reply #f)                   ;not logged to a file
+        (('files reply)
+         (put-message reply '())                  ;not logged to a file
          (loop pid messages service))
-        (('rotate _ reply)                        ;nothing to rotate
+        (('rotate _ _ reply)                      ;nothing to rotate
          (put-message reply #f)
          (loop pid messages service))
         (line
@@ -336,10 +344,10 @@ it's logging for @var{service}."
         (('recent-messages reply)
          (put-message reply (ring-buffer->list messages))
          (loop messages service))
-        (('file reply)
-         (put-message reply #f)                   ;not logged to a file
+        (('files reply)
+         (put-message reply '())                  ;not logged to a file
          (loop messages service))
-        (('rotate _ reply)                        ;nothing to rotate
+        (('rotate _ _ reply)                      ;nothing to rotate
          (put-message reply #f)
          (loop messages service))
         (line
@@ -379,14 +387,14 @@ reply."
   ;; Return the list of timestamp/string for recently logged messages.
   (logger-control-message 'recent-messages))
 
-(define logger-file
-  ;; Return the file name the log is written to or #f if there is none.
-  (logger-control-message 'file))
+(define logger-files
+  ;; Return the file names the log is written to, possibly the empty list.
+  (logger-control-message 'files))
 
-(define (rotate-log-file logger rotated-file)
-  "Ask @var{logger} to atomically rename its log file to @var{rotated-file}
-and re-open its log file with the same name as before.  Return @code{#f} on
-failure--e.g., ENOSPC or @var{logger} is not file-backed."
+(define (rotate-log-file logger file rotated-file)
+  "Ask @var{logger} to atomically rename its log file @var{file} to
+@var{rotated-file} and to re-open it with the same name as before.  Return
+@code{#f} on failure--e.g., ENOSPC or @var{logger} is not file-backed."
   (let ((reply (make-channel)))
-    (put-message logger `(rotate ,rotated-file ,reply))
+    (put-message logger `(rotate ,file ,rotated-file ,reply))
     (get-message reply)))
diff --git a/modules/shepherd/scripts/herd.scm 
b/modules/shepherd/scripts/herd.scm
index f9fbf58..a2c9253 100644
--- a/modules/shepherd/scripts/herd.scm
+++ b/modules/shepherd/scripts/herd.scm
@@ -47,7 +47,7 @@
                 enabled? status running
                 status-changes last-respawns startup-failures
                 exit-statuses
-                recent-messages log-file
+                recent-messages log-files
                 pending-replacement?)
   live-service?
   (provision        live-service-provision)       ;list of symbols
@@ -64,7 +64,7 @@
   (startup-failures live-service-startup-failures) ;list of integers
   (exit-statuses    live-service-process-exit-statuses) ;integers/timestamps
   (recent-messages  live-service-recent-messages)  ;list of strings
-  (log-file         live-service-log-file)         ;#f | string
+  (log-files        live-service-log-files)        ;list of strings
   (pending-replacement? live-service-pending-replacement?))     ;Boolean
 
 (define (live-service-canonical-name service)
@@ -118,7 +118,7 @@ into a @code{live-service} record."
      (alist-let* properties (provides requires status running respawn? enabled?
                              status-changes last-respawns startup-failures
                              exit-statuses
-                             recent-messages log-file
+                             recent-messages log-files
                              one-shot? transient? pending-replacement?)
        (live-service provides requires one-shot?
                      transient? respawn?
@@ -131,7 +131,7 @@ into a @code{live-service} record."
                      (or startup-failures '())
                      (or exit-statuses '())
                      (or recent-messages '())
-                     log-file
+                     (or log-files '())
                      pending-replacement?)))))
 
 (define (highlight-if-long-transient-status service)
@@ -514,9 +514,13 @@ to upgrade).~%"))))
        (format #t (highlight/error (l10n "  Failed to start at ~a.~%"))
                (time->string time)))
       (_ #t)))
-  (when (live-service-log-file service)
-    (format #t (l10n "  Log file: ~a.~%")
-            (live-service-log-file service)))
+  (match (live-service-log-files service)
+    (() #t)
+    (files
+     (format #t (l10n "  Log file:~{ ~a~}.~%"
+                      "  Log files:~{ ~a~}.~%"
+                      (length files))
+             (live-service-log-files service))))
 
   (when show-recent-messages?
     (match (live-service-running-value service)
diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm
index bc8852d..fb42d97 100644
--- a/modules/shepherd/service.scm
+++ b/modules/shepherd/service.scm
@@ -83,7 +83,7 @@
             service-replacement
             service-logger
             service-recent-messages
-            service-log-file
+            service-log-files
             service-action-list
 
             lookup-service-action
@@ -826,9 +826,11 @@ channel and wait for its reply."
   (or (and=> (service-logger service) logger-recent-messages)
       '()))
 
-(define (service-log-file service)
-  "Return file where @var{service} logs messages, #f if there is none."
-  (and=> (service-logger service) logger-file))
+(define (service-log-files service)
+  "Return the files where @var{service} logs messages, the empty list of there
+are none."
+  (or (and=> (service-logger service) logger-files)
+      '()))
 
 (define (enable-service service)
   "Enable @var{service}."
@@ -1165,7 +1167,7 @@ clients."
             (respawn-delay ,(service-respawn-delay service))
             (exit-statuses ,(service-process-exit-statuses service))
             (recent-messages ,(service-recent-messages service))
-            (log-file ,(service-log-file service))
+            (log-files ,(service-log-files service))
             (pending-replacement? ,(->bool (service-replacement service)))))
 
 
diff --git a/modules/shepherd/service/log-rotation.scm 
b/modules/shepherd/service/log-rotation.scm
index 66721ad..64eb1cd 100644
--- a/modules/shepherd/service/log-rotation.scm
+++ b/modules/shepherd/service/log-rotation.scm
@@ -25,6 +25,7 @@
                                          timer-trigger-action)
   #:autoload   (shepherd service) (service
                                    service-logger
+                                   service-log-files
                                    service-canonical-name
                                    for-each-service
                                    action)
@@ -162,15 +163,14 @@ previously-archived log files.  Compress the log file of 
@var{logger}
 according to @var{method}.  Call @var{rotate} with the old a new file name for
 each rotation.  If the size of the log file is below
 @var{rotation-size-threshold}, do not rotate it."
-  (match (logger-file logger)
-    (#f #f)
-    (file
-     (rotate-file file
-                  #:rotate rotate
-                  #:rotate-current (lambda (file next)
-                                     (rotate-log-file logger next))
-                  #:compression compression
-                  #:rotation-size-threshold rotation-size-threshold))))
+  (for-each (lambda (file)
+              (rotate-file file
+                           #:rotate rotate
+                           #:rotate-current (lambda (file next)
+                                              (rotate-log-file logger file 
next))
+                           #:compression compression
+                           #:rotation-size-threshold rotation-size-threshold))
+            (logger-files logger)))
 
 (define* (rotate-service-logs #:optional (rotate rename-file)
                               #:key
@@ -268,14 +268,12 @@ only if the service that mounts the file system that 
hosts log files is up."
     (action 'files
             (lambda _
               (for-each-service (lambda (service)
-                                  (match (service-logger service)
-                                    (#f #f)
-                                    (logger
-                                     (let ((file (logger-file logger)))
-                                       (when file
-                                         (format #t "~a\t~a~%"
-                                                 file (service-canonical-name
-                                                       service))))))))
+                                  (define name
+                                    (service-canonical-name service))
+                                  (for-each (lambda (file)
+                                              (format #t "~a\t~a~%"
+                                                      file name))
+                                            (service-log-files service))))
               (for-each (lambda (file)
                           ;; TRANSLATORS: "External" here refers to "external
                           ;; log files".
diff --git a/tests/status-sexp.sh b/tests/status-sexp.sh
index 9e8d4e3..d62ab56 100644
--- a/tests/status-sexp.sh
+++ b/tests/status-sexp.sh
@@ -93,7 +93,7 @@ root_service_sexp="
       (respawn-delay 0.1)
       (exit-statuses ())
       (recent-messages ())
-      (log-file \"$PWD/$log\")
+      (log-files (\"$PWD/$log\"))
       (pending-replacement? #f))"
 
 # Define a helper procedure that resets timestamps in the 'status-changes'
@@ -150,7 +150,7 @@ $define_canonicalize
                (respawn-limit (5 . 7)) (respawn-delay 1)
                (exit-statuses ())
               (recent-messages ())
-              (log-file #f)
+              (log-files ())
               (pending-replacement? #f))
              (service (version 0)
                (provides (bar)) (requires (foo))
@@ -164,7 +164,7 @@ $define_canonicalize
                (respawn-limit (5 . 7)) (respawn-delay 1)
                (exit-statuses ())
                (recent-messages ())
-              (log-file #f)
+              (log-files ())
               (pending-replacement? #f)))))))
 "
 
@@ -196,7 +196,7 @@ $define_canonicalize
                (respawn-limit (5 . 7)) (respawn-delay 1)
                (exit-statuses ())
               (recent-messages ())
-              (log-file #f)
+              (log-files ())
               (pending-replacement? #f))))))
 "
 

Reply via email to