guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[shepherd] 04/04: Log to /dev/kmsg when running as root on GNU/Linux.


From: Ludovic Courtès
Subject: [shepherd] 04/04: Log to /dev/kmsg when running as root on GNU/Linux.
Date: Mon, 5 Mar 2018 11:46:24 -0500 (EST)

civodul pushed a commit to branch master
in repository shepherd.

commit 6e57aa2a3d8c4da4d03a47bc22fd291460eaafb1
Author: Danny Milosavljevic <address@hidden>
Date:   Mon Mar 5 16:02:47 2018 +0100

    Log to /dev/kmsg when running as root on GNU/Linux.
    
    * modules/shepherd/support.scm (default-logfile): Set /dev/kmsg when it
    exists and we're root.
    (default-logfile-date-format): Adjust format when using /dev/kmsg.
    * modules/shepherd.scm (main): Redirect 'current-output-port' to the
    bitbucket when LOGFILE is /dev/kmsg.
    * doc/shepherd.texi (Invoking shepherd): Document the new behavior when
    '--log-file' is omitted.
    
    Co-authored-by: Ludovic Courtès <address@hidden>
---
 doc/shepherd.texi            | 11 ++++++++---
 modules/shepherd.scm         |  6 ++++++
 modules/shepherd/support.scm | 10 ++++++++--
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/doc/shepherd.texi b/doc/shepherd.texi
index 47005d5..01d8050 100644
--- a/doc/shepherd.texi
+++ b/doc/shepherd.texi
@@ -404,9 +404,14 @@ permissions are not as expected.
 @itemx address@hidden
 @cindex logging
 @cindex log file
-Log output into @var{file}, or if @var{file} is not given,
address@hidden/var/log/shepherd.log} when running as superuser,
address@hidden/shepherd/shepherd.log} otherwise.
+Log output into @var{file}.
+
+The default behavior is to write to @file{/dev/kmsg} when running as
+superuser.  This special device is GNU/Linux-specific; when it does not
+exist, write to @file{/var/log/shepherd.log} instead.
+
+For unprivileged users, the default log file is
address@hidden/shepherd/shepherd.log}.
 
 @item address@hidden
 When @command{shepherd} is ready to accept connections, write its PID to 
@var{file} or
diff --git a/modules/shepherd.scm b/modules/shepherd.scm
index 0f21084..c869464 100644
--- a/modules/shepherd.scm
+++ b/modules/shepherd.scm
@@ -2,6 +2,7 @@
 ;; Copyright (C) 2013, 2014, 2016, 2018 Ludovic Courtès <address@hidden>
 ;; Copyright (C) 2002, 2003 Wolfgang Jährling <address@hidden>
 ;; Copyright (C) 2018 Carlo Zancanaro <address@hidden>
+;; Copyright (C) 2018 Danny Milosavljevic <address@hidden>
 ;;
 ;; This file is part of the GNU Shepherd.
 ;;
@@ -163,6 +164,11 @@
     ;; Enable logging as first action.
     (start-logging logfile)
 
+    (when (string=? logfile "/dev/kmsg")
+      ;; By default we'd write both to /dev/kmsg and to stdout.  Redirect
+      ;; stdout to the bitbucket so we don't log twice.
+      (set-current-output-port (%make-void-port "w")))
+
     ;; Send output to log and clients.
     (set-current-output-port (make-shepherd-output-port))
 
diff --git a/modules/shepherd/support.scm b/modules/shepherd/support.scm
index d4b582f..45a2030 100644
--- a/modules/shepherd/support.scm
+++ b/modules/shepherd/support.scm
@@ -3,6 +3,7 @@
 ;; Copyright (C) 2013, 2014, 2016, 2018 Ludovic Courtès <address@hidden>
 ;; Copyright (C) 2002, 2003 Wolfgang Jährling <address@hidden>
 ;; Copyright (C) 2016 Mathieu Lirzin <address@hidden>
+;; Copyright (C) 2018 Danny Milosavljevic <address@hidden>
 ;;
 ;; This file is part of the GNU Shepherd.
 ;;
@@ -22,6 +23,7 @@
 (define-module (shepherd support)
   #:use-module (shepherd config)
   #:use-module (ice-9 match)
+  #:use-module (ice-9 format)
   #:export (call/ec
             caught-error
             assert
@@ -309,12 +311,16 @@ TARGET should be a string representing a filepath + name."
 ;; Logfile.
 (define default-logfile
   (if (zero? (getuid))
-      (string-append %localstatedir "/log/shepherd.log")
+      (if (access? "/dev/kmsg" W_OK)
+          "/dev/kmsg"
+          (string-append %localstatedir "/log/shepherd.log"))
       (string-append %user-config-dir "/shepherd.log")))
 
 (define default-logfile-date-format
   ;; 'strftime' format string to prefix each entry in the log.
-  "%Y-%m-%d %H:%M:%S ")
+  (if (string=? default-logfile "/dev/kmsg")
+      (format #f "shepherd[~d]: " (getpid))
+      "%Y-%m-%d %H:%M:%S "))
 
 ;; Configuration file.
 (define (default-config-file)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]