* file logging backend
*/
-struct file_log_state {
- const char *app_name;
- int fd;
- char buffer[1024];
-};
-
-static void file_log(void *private_data, int level, const char *msg)
-{
- struct file_log_state *state = talloc_get_type_abort(
- private_data, struct file_log_state);
- struct timeval tv;
- struct timeval_buf tvbuf;
- int ret;
-
- if (state->fd == STDERR_FILENO) {
- ret = snprintf(state->buffer, sizeof(state->buffer),
- "%s[%u]: %s\n",
- state->app_name, (unsigned)getpid(), msg);
- } else {
- GetTimeOfDay(&tv);
- timeval_str_buf(&tv, false, true, &tvbuf);
-
- ret = snprintf(state->buffer, sizeof(state->buffer),
- "%s %s[%u]: %s\n", tvbuf.buf,
- state->app_name, (unsigned)getpid(), msg);
- }
- if (ret < 0) {
- return;
- }
-
- state->buffer[sizeof(state->buffer)-1] = '\0';
-
- sys_write_v(state->fd, state->buffer, strlen(state->buffer));
-}
-
-static int file_log_state_destructor(struct file_log_state *state)
-{
- if (state->fd != -1 && state->fd != STDERR_FILENO) {
- close(state->fd);
- state->fd = -1;
- }
- return 0;
-}
-
static bool file_log_validate(const char *option)
{
char *t, *dir;
return true;
}
-static int file_log_setup(TALLOC_CTX *mem_ctx, const char *option,
+static int file_log_setup(TALLOC_CTX *mem_ctx,
+ const char *option,
const char *app_name)
{
- struct file_log_state *state;
-
- state = talloc_zero(mem_ctx, struct file_log_state);
- if (state == NULL) {
- return ENOMEM;
- }
-
- state->app_name = app_name;
+ struct debug_settings settings = {
+ .debug_syslog_format = true,
+ .debug_hires_timestamp = true,
+ };
+ const char *t = NULL;
if (option == NULL || strcmp(option, "-") == 0) {
- int ret;
-
- state->fd = STDERR_FILENO;
- ret = dup2(STDERR_FILENO, STDOUT_FILENO);
- if (ret == -1) {
- int save_errno = errno;
- talloc_free(state);
- return save_errno;
- }
-
- } else {
- state->fd = open(option, O_WRONLY|O_APPEND|O_CREAT, 0644);
- if (state->fd == -1) {
- int save_errno = errno;
- talloc_free(state);
- return save_errno;
- }
-
- if (! set_close_on_exec(state->fd)) {
- int save_errno = errno;
- talloc_free(state);
- return save_errno;
+ /*
+ * Logging to stderr is the default and has already
+ * been done in logging init
+ */
+ return 0;
+ }
+
+ /*
+ * Support logging of fake hostname in local daemons. This
+ * hostname is basename(getenv(CTDB_BASE)).
+ */
+ t = getenv("CTDB_TEST_MODE");
+ if (t != NULL) {
+ t = getenv("CTDB_BASE");
+ if (t != NULL) {
+ const char *p = strrchr(t, '/');
+ if (p != NULL) {
+ p++;
+ if (p[0] == '\0') {
+ p = "unknown";
+ }
+ } else {
+ p = t;
+ }
+
+ debug_set_hostname(p);
}
}
- talloc_set_destructor(state, file_log_state_destructor);
- debug_set_callback(state, file_log);
+ debug_set_settings(&settings, "file", 0, false);
+ debug_set_logfile(option);
+ setup_logging(app_name, DEBUG_FILE);
return 0;
}
{
_pid="[0-9][0-9]*"
sed -e "s|pid=${_pid}|pid=PID|" \
- -e "s|PID ${_pid}|PID PID|" \
- -e "s|\[${_pid}\]|[PID]|"
+ -e "s|PID ${_pid}|PID PID|"
}
ok <<EOF
-test1[PID]: daemon started, pid=PID
-test1[PID]: startup failed, ret=1
-test1[PID]: daemon started, pid=PID
-test1[PID]: startup failed, ret=2
-test1[PID]: daemon started, pid=PID
-test1[PID]: startup completed successfully
-test1[PID]: listening on $sockpath
-test1[PID]: Shutting down
+daemon started, pid=PID
+startup failed, ret=1
+daemon started, pid=PID
+startup failed, ret=2
+daemon started, pid=PID
+startup completed successfully
+listening on $sockpath
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 1
ok <<EOF
-test2[PID]: daemon started, pid=PID
-test2[PID]: startup completed successfully
-test2[PID]: listening on $sockpath
-test2[PID]: Received signal $(sigcode SIGHUP)
-test2[PID]: reconfigure failed, ret=1
-test2[PID]: Received signal $(sigcode SIGUSR1)
-test2[PID]: reconfigure completed successfully
-test2[PID]: Received signal $(sigcode SIGTERM)
-test2[PID]: Shutting down
-test2[PID]: daemon started, pid=PID
-test2[PID]: startup completed successfully
-test2[PID]: listening on $sockpath
-test2[PID]: Received signal $(sigcode SIGUSR1)
-test2[PID]: reconfigure failed, ret=2
-test2[PID]: Received signal $(sigcode SIGHUP)
-test2[PID]: reconfigure completed successfully
-test2[PID]: Received signal $(sigcode SIGTERM)
-test2[PID]: Shutting down
+daemon started, pid=PID
+startup completed successfully
+listening on $sockpath
+Received signal $(sigcode SIGHUP)
+reconfigure failed, ret=1
+Received signal $(sigcode SIGUSR1)
+reconfigure completed successfully
+Received signal $(sigcode SIGTERM)
+Shutting down
+daemon started, pid=PID
+startup completed successfully
+listening on $sockpath
+Received signal $(sigcode SIGUSR1)
+reconfigure failed, ret=2
+Received signal $(sigcode SIGHUP)
+reconfigure completed successfully
+Received signal $(sigcode SIGTERM)
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 2
ok <<EOF
-test3[PID]: daemon started, pid=PID
-test3[PID]: listening on $sockpath
-test3[PID]: PID PID gone away, exiting
-test3[PID]: Shutting down
+daemon started, pid=PID
+listening on $sockpath
+PID PID gone away, exiting
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 3
ok <<EOF
-test4[PID]: daemon started, pid=PID
-test4[PID]: Shutting down
+daemon started, pid=PID
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 4
ok <<EOF
-test5[PID]: daemon started, pid=PID
-test5[PID]: listening on $sockpath
-test5[PID]: Received signal $(sigcode SIGTERM)
-test5[PID]: Shutting down
+daemon started, pid=PID
+listening on $sockpath
+Received signal $(sigcode SIGTERM)
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 5
ok <<EOF
-test6[PID]: daemon started, pid=PID
-test6[PID]: listening on $sockpath
-test6[PID]: Shutting down
+daemon started, pid=PID
+listening on $sockpath
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 6
ok <<EOF
-test7[PID]: daemon started, pid=PID
-test7[PID]: startup completed successfully
-test7[PID]: Received signal $(sigcode SIGTERM)
-test7[PID]: Shutting down
+daemon started, pid=PID
+startup completed successfully
+Received signal $(sigcode SIGTERM)
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 7
ok <<EOF
-test8[PID]: daemon started, pid=PID
-test8[PID]: startup completed successfully
-test8[PID]: Received signal $(sigcode SIGTERM)
-test8[PID]: Shutting down
-test8[PID]: daemon started, pid=PID
-test8[PID]: startup completed successfully
-test8[PID]: Received signal $(sigcode SIGTERM)
-test8[PID]: Shutting down
+daemon started, pid=PID
+startup completed successfully
+Received signal $(sigcode SIGTERM)
+Shutting down
+daemon started, pid=PID
+startup completed successfully
+Received signal $(sigcode SIGTERM)
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 8
ok <<EOF
-test9[PID]: daemon started, pid=PID
-test9[PID]: startup completed successfully
-test9[PID]: Received signal $(sigcode SIGTERM)
-test9[PID]: Shutting down
-test9[PID]: daemon started, pid=PID
-test9[PID]: startup completed successfully
-test9[PID]: Received signal $(sigcode SIGTERM)
-test9[PID]: Shutting down
+daemon started, pid=PID
+startup completed successfully
+Received signal $(sigcode SIGTERM)
+Shutting down
+daemon started, pid=PID
+startup completed successfully
+Received signal $(sigcode SIGTERM)
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 9
ok <<EOF
-test10[PID]: daemon started, pid=PID
-test10[PID]: listening on $sockpath
-test10[PID]: daemon started, pid=PID
-test10[PID]: listening on $sockpath
-test10[PID]: Received signal $(sigcode SIGTERM)
-test10[PID]: Shutting down
+daemon started, pid=PID
+listening on $sockpath
+daemon started, pid=PID
+listening on $sockpath
+Received signal $(sigcode SIGTERM)
+Shutting down
EOF
unit_test sock_daemon_test "$pidfile" "$sockpath" 10