Merge branch 'lw/daemon-log-destination'

The log from "git daemon" can be redirected with a new option; one
relevant use case is to send the log to standard error (instead of
syslog) when running it from inetd.

* lw/daemon-log-destination:
  daemon: add --log-destination=(stderr|syslog|none)
This commit is contained in:
Junio C Hamano 2018-02-21 12:45:04 -08:00
commit c2bd43d66d
2 changed files with 64 additions and 10 deletions

View File

@ -20,6 +20,7 @@ SYNOPSIS
[--inetd | [--inetd |
[--listen=<host_or_ipaddr>] [--port=<n>] [--listen=<host_or_ipaddr>] [--port=<n>]
[--user=<user> [--group=<group>]]] [--user=<user> [--group=<group>]]]
[--log-destination=(stderr|syslog|none)]
[<directory>...] [<directory>...]
DESCRIPTION DESCRIPTION
@ -80,7 +81,8 @@ OPTIONS
do not have the 'git-daemon-export-ok' file. do not have the 'git-daemon-export-ok' file.
--inetd:: --inetd::
Have the server run as an inetd service. Implies --syslog. Have the server run as an inetd service. Implies --syslog (may be
overridden with `--log-destination=`).
Incompatible with --detach, --port, --listen, --user and --group Incompatible with --detach, --port, --listen, --user and --group
options. options.
@ -110,8 +112,28 @@ OPTIONS
zero for no limit. zero for no limit.
--syslog:: --syslog::
Log to syslog instead of stderr. Note that this option does not imply Short for `--log-destination=syslog`.
--verbose, thus by default only error conditions will be logged.
--log-destination=<destination>::
Send log messages to the specified destination.
Note that this option does not imply --verbose,
thus by default only error conditions will be logged.
The <destination> must be one of:
+
--
stderr::
Write to standard error.
Note that if `--detach` is specified,
the process disconnects from the real standard error,
making this destination effectively equivalent to `none`.
syslog::
Write to syslog, using the `git-daemon` identifier.
none::
Disable all logging.
--
+
The default destination is `syslog` if `--inetd` or `--detach` is specified,
otherwise `stderr`.
--user-path:: --user-path::
--user-path=<path>:: --user-path=<path>::

View File

@ -9,7 +9,12 @@
#define initgroups(x, y) (0) /* nothing */ #define initgroups(x, y) (0) /* nothing */
#endif #endif
static int log_syslog; static enum log_destination {
LOG_DESTINATION_UNSET = -1,
LOG_DESTINATION_NONE = 0,
LOG_DESTINATION_STDERR = 1,
LOG_DESTINATION_SYSLOG = 2,
} log_destination = LOG_DESTINATION_UNSET;
static int verbose; static int verbose;
static int reuseaddr; static int reuseaddr;
static int informative_errors; static int informative_errors;
@ -25,6 +30,7 @@ static const char daemon_usage[] =
" [--access-hook=<path>]\n" " [--access-hook=<path>]\n"
" [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>]\n" " [--inetd | [--listen=<host_or_ipaddr>] [--port=<n>]\n"
" [--detach] [--user=<user> [--group=<group>]]\n" " [--detach] [--user=<user> [--group=<group>]]\n"
" [--log-destination=(stderr|syslog|none)]\n"
" [<directory>...]"; " [<directory>...]";
/* List of acceptable pathname prefixes */ /* List of acceptable pathname prefixes */
@ -74,11 +80,14 @@ static const char *get_ip_address(struct hostinfo *hi)
static void logreport(int priority, const char *err, va_list params) static void logreport(int priority, const char *err, va_list params)
{ {
if (log_syslog) { switch (log_destination) {
case LOG_DESTINATION_SYSLOG: {
char buf[1024]; char buf[1024];
vsnprintf(buf, sizeof(buf), err, params); vsnprintf(buf, sizeof(buf), err, params);
syslog(priority, "%s", buf); syslog(priority, "%s", buf);
} else { break;
}
case LOG_DESTINATION_STDERR:
/* /*
* Since stderr is set to buffered mode, the * Since stderr is set to buffered mode, the
* logging of different processes will not overlap * logging of different processes will not overlap
@ -88,6 +97,11 @@ static void logreport(int priority, const char *err, va_list params)
vfprintf(stderr, err, params); vfprintf(stderr, err, params);
fputc('\n', stderr); fputc('\n', stderr);
fflush(stderr); fflush(stderr);
break;
case LOG_DESTINATION_NONE:
break;
case LOG_DESTINATION_UNSET:
BUG("log destination not initialized correctly");
} }
} }
@ -1286,7 +1300,6 @@ int cmd_main(int argc, const char **argv)
} }
if (!strcmp(arg, "--inetd")) { if (!strcmp(arg, "--inetd")) {
inetd_mode = 1; inetd_mode = 1;
log_syslog = 1;
continue; continue;
} }
if (!strcmp(arg, "--verbose")) { if (!strcmp(arg, "--verbose")) {
@ -1294,9 +1307,22 @@ int cmd_main(int argc, const char **argv)
continue; continue;
} }
if (!strcmp(arg, "--syslog")) { if (!strcmp(arg, "--syslog")) {
log_syslog = 1; log_destination = LOG_DESTINATION_SYSLOG;
continue; continue;
} }
if (skip_prefix(arg, "--log-destination=", &v)) {
if (!strcmp(v, "syslog")) {
log_destination = LOG_DESTINATION_SYSLOG;
continue;
} else if (!strcmp(v, "stderr")) {
log_destination = LOG_DESTINATION_STDERR;
continue;
} else if (!strcmp(v, "none")) {
log_destination = LOG_DESTINATION_NONE;
continue;
} else
die("unknown log destination '%s'", v);
}
if (!strcmp(arg, "--export-all")) { if (!strcmp(arg, "--export-all")) {
export_all_trees = 1; export_all_trees = 1;
continue; continue;
@ -1353,7 +1379,6 @@ int cmd_main(int argc, const char **argv)
} }
if (!strcmp(arg, "--detach")) { if (!strcmp(arg, "--detach")) {
detach = 1; detach = 1;
log_syslog = 1;
continue; continue;
} }
if (skip_prefix(arg, "--user=", &v)) { if (skip_prefix(arg, "--user=", &v)) {
@ -1399,7 +1424,14 @@ int cmd_main(int argc, const char **argv)
usage(daemon_usage); usage(daemon_usage);
} }
if (log_syslog) { if (log_destination == LOG_DESTINATION_UNSET) {
if (inetd_mode || detach)
log_destination = LOG_DESTINATION_SYSLOG;
else
log_destination = LOG_DESTINATION_STDERR;
}
if (log_destination == LOG_DESTINATION_SYSLOG) {
openlog("git-daemon", LOG_PID, LOG_DAEMON); openlog("git-daemon", LOG_PID, LOG_DAEMON);
set_die_routine(daemon_die); set_die_routine(daemon_die);
} else } else