g_hash_table_unref (ctx->custom_commands);
REF_RELEASE (ctx->cfg);
- rspamd_log_close (worker->srv->logger, TRUE);
+ rspamd_log_close (worker->srv->logger);
exit (EXIT_SUCCESS);
}
}
REF_RELEASE (ctx->cfg);
- rspamd_log_close (worker->srv->logger, TRUE);
+ rspamd_log_close (worker->srv->logger);
exit (EXIT_SUCCESS);
}
ev_loop (ctx->event_loop, 0);
rspamd_worker_block_signals ();
- rspamd_log_close (worker->srv->logger, TRUE);
+ rspamd_log_close (worker->srv->logger);
REF_RELEASE (ctx->cfg);
exit (EXIT_SUCCESS);
{
struct rspamd_main *rspamd_main = sigh->worker->srv;
- rspamd_log_reopen (sigh->worker->srv->logger);
+ rspamd_log_reopen (sigh->worker->srv->logger, rspamd_main->cfg, -1, -1);
msg_info_main ("logging reinitialised");
/* Get more signals */
switch (wrk->pid) {
case 0:
/* Update pid for logging */
- rspamd_log_update_pid (cf->type, rspamd_main->logger);
- /* To avoid atomic writes issue */
- rspamd_log_reopen (rspamd_main->logger);
+ rspamd_log_on_fork (cf->type, rspamd_main->cfg, rspamd_main->logger);
wrk->pid = getpid ();
/* Init PRNG after fork */
rspamd_pidfile_close (rspamd_main->pfh);
}
- /* Do silent log reopen to avoid collisions */
- rspamd_log_close (rspamd_main->logger, FALSE);
-
-
if (rspamd_main->cfg->log_silent_workers) {
- rspamd_main->cfg->log_level = G_LOG_LEVEL_MESSAGE;
- rspamd_set_logger (rspamd_main->cfg, cf->type,
- &rspamd_main->logger, rspamd_main->server_pool);
+ rspamd_log_set_log_level (rspamd_main->logger, G_LOG_LEVEL_MESSAGE);
}
- rspamd_log_open (rspamd_main->logger);
wrk->start_time = rspamd_get_calendar_ticks ();
if (cf->bind_conf) {
rspamd_socket_nonblocking (wrk->control_pipe[1]);
rspamd_socket_nonblocking (wrk->srv_pipe[1]);
rspamd_main->cfg->cur_worker = wrk;
- /* Execute worker */
+ /* Execute worker (this function should not return normally!) */
cf->worker->worker_start_func (wrk);
+ /* To distinguish from normal termination */
exit (EXIT_FAILURE);
break;
case -1:
msg_err_main ("shutting down Rspamd due to fatal error");
- rspamd_log_close (rspamd_main->logger, TRUE);
+ rspamd_log_close (rspamd_main->logger);
exit (EXIT_FAILURE);
}
{
g_assert (logger != NULL);
+ if (logger->closed) {
+ return;
+ }
+
+ logger->closed = TRUE;
+
if (logger->debug_ip) {
rspamd_map_helper_destroy_radix (logger->debug_ip);
}
nspec = rspamd_log->ops.reload (rspamd_log, cfg, rspamd_log->ops.specific,
uid, gid, &err);
+
+ if (nspec != NULL) {
+ rspamd_log->ops.specific = nspec;
+ }
+ else {
+
+ }
+
+ return nspec != NULL;
}
static void
}
rspamd_logger_t *
-rspamd_log_init (rspamd_mempool_t *pool)
+rspamd_log_open_emergency (rspamd_mempool_t *pool)
{
rspamd_logger_t *logger;
GError *err = NULL;
rspamd_logger_t *logger;
GError *err = NULL;
- g_assert (default_logger == NULL);
- g_assert (emergency_logger == NULL);
+ g_assert (emergency_logger != NULL);
if (pool) {
logger = rspamd_mempool_alloc0 (pool, sizeof (rspamd_logger_t));
g_assert (funcs != NULL);
memcpy (&logger->ops, funcs, sizeof (*funcs));
+ logger->ops.specific = logger->ops.init (logger, cfg, uid, gid, &err);
+
+ if (logger->ops.specific == NULL) {
+ rspamd_common_log_function (emergency_logger, G_LOG_LEVEL_CRITICAL,
+ "logger", NULL, G_STRFUNC,
+ "cannot open specific logger: %e", err);
+ g_error_free (err);
+
+ return NULL;
+ }
+
logger->pid = getpid ();
logger->process_type = ptype;
}
default_logger = logger;
+
+ return logger;
}
}
elt->pid = rspamd_log->pid;
- elt->ptype = rspamd_log->process_type;
+ elt->ptype = g_quark_from_string (rspamd_log->process_type);
elt->ts = rspamd_get_calendar_ticks ();
if (id) {
rspamd_logger_set_log_function (rspamd_logger_t *logger,
struct rspamd_logger_funcs *nfuncs)
{
+ /* TODO: write this */
+
+ return NULL;
}
\ No newline at end of file
if (priv->fd == -1) {
g_set_error (err, CONSOLE_LOG_QUARK, errno,
- "open_log: cannot dup console fd: %s, %s\n",
+ "open_log: cannot dup console fd: %s\n",
strerror (errno));
rspamd_log_console_dtor (logger, priv);
if (isatty (priv->fd)) {
priv->log_tty = true;
+
+ if (priv->log_color) {
+ priv->log_color = false;
+ }
}
return priv;
struct rspamd_cryptobox_keypair *keypair;
guint flags;
+ gboolean closed;
gboolean enabled;
gboolean is_debug;
gboolean no_lock;
gint rc;
gchar inbuf[4];
- rspamd_log_update_pid (w->cf->type, w->srv->logger);
+ rspamd_log_on_fork (w->cf->type, w->srv->cfg, w->srv->logger);
rc = ottery_init (w->srv->cfg->libs_ctx->ottery_cfg);
if (rc != OTTERY_ERR_NONE) {
static void
config_logger (rspamd_mempool_t *pool, gpointer ud)
{
- struct rspamd_main *rm = ud;
-
- rm->cfg->log_type = RSPAMD_LOG_CONSOLE;
- rm->cfg->log_level = G_LOG_LEVEL_CRITICAL;
-
- rspamd_set_logger (rm->cfg, g_quark_try_string ("main"), &rm->logger,
- rm->server_pool);
- if (rspamd_log_open_priv (rm->logger, rm->workers_uid, rm->workers_gid) ==
- -1) {
- fprintf (stderr, "Fatal error, cannot open logfile, exiting\n");
- exit (EXIT_FAILURE);
- }
}
static void
static void
config_logger (rspamd_mempool_t *pool, gpointer ud)
{
- struct rspamd_main *rm = ud;
- GQuark configtest_quark = g_quark_from_static_string ("configtest");
-
- rm->cfg->log_type = RSPAMD_LOG_CONSOLE;
-
- if (quiet) {
- rm->cfg->log_level = G_LOG_LEVEL_CRITICAL;
- }
- else {
- rm->cfg->log_level = G_LOG_LEVEL_WARNING;
- }
-
- rspamd_set_logger (rm->cfg, configtest_quark, &rm->logger,
- rm->server_pool);
- if (rspamd_log_open_priv (rm->logger, rm->workers_uid, rm->workers_gid) ==
- -1) {
- fprintf (stderr, "Fatal error, cannot open logfile, exiting\n");
- exit (EXIT_FAILURE);
- }
}
static void
exit (1);
}
+ /* Setup logger */
+ rspamd_main->logger = rspamd_log_open_emergency (rspamd_main->server_pool);
+
/* Setup logger */
if (verbose) {
- cfg->log_level = G_LOG_LEVEL_DEBUG;
- cfg->log_flags |= RSPAMD_LOG_FLAG_USEC|RSPAMD_LOG_FLAG_ENFORCED;
+ rspamd_log_set_log_level (rspamd_main->logger, G_LOG_LEVEL_DEBUG);
+ rspamd_log_set_log_flags (rspamd_main->logger,
+ RSPAMD_LOG_FLAG_USEC|RSPAMD_LOG_FLAG_ENFORCED|RSPAMD_LOG_FLAG_RSPAMADM);
}
else {
- cfg->log_level = G_LOG_LEVEL_MESSAGE;
+ rspamd_log_set_log_level (rspamd_main->logger, G_LOG_LEVEL_MESSAGE);
+ rspamd_log_set_log_flags (rspamd_main->logger,RSPAMD_LOG_FLAG_RSPAMADM);
}
- cfg->log_type = RSPAMD_LOG_CONSOLE;
- /* Avoid timestamps printing */
- cfg->log_flags |= RSPAMD_LOG_FLAG_RSPAMADM;
- rspamd_set_logger (cfg, process_quark, &rspamd_main->logger,
- rspamd_main->server_pool);
- (void) rspamd_log_open (rspamd_main->logger);
-
rspamd_main->event_loop = ev_default_loop (EVFLAG_SIGNALFD|EVBACKEND_ALL);
resolver = rspamd_dns_resolver_init (rspamd_main->logger,
rspamd_dns_resolver_deinit (resolver);
REF_RELEASE (rspamd_main->cfg);
rspamd_http_context_free (rspamd_main->http_ctx);
- rspamd_log_close (rspamd_main->logger, TRUE);
+ rspamd_log_close (rspamd_main->logger);
rspamd_url_deinit ();
g_ptr_array_free (all_commands, TRUE);
ev_loop_destroy (rspamd_main->event_loop);
{
struct rspamd_main *rspamd_main = ud;
- rspamd_set_logger (rspamd_main->cfg, g_quark_try_string ("main"),
- &rspamd_main->logger, rspamd_main->server_pool);
+ rspamd_main->logger = rspamd_log_open_specific (rspamd_main->server_pool,
+ rspamd_main->cfg,
+ "main",
+ rspamd_main->workers_uid,
+ rspamd_main->workers_gid);
- if (rspamd_log_open_priv (rspamd_main->logger,
- rspamd_main->workers_uid, rspamd_main->workers_gid) == -1) {
- fprintf (stderr, "Fatal error, cannot open logfile, exiting\n");
+ if (rspamd_main->logger == NULL) {
+ /*
+ * XXX:
+ * Error has been already logged (in fact,
+ * we might fall back to console logger here)
+ */
exit (EXIT_FAILURE);
}
tmp_cfg->cfg_name = cfg_file;
old_cfg = rspamd_main->cfg;
rspamd_main->cfg = tmp_cfg;
+ rspamd_logger_t *old_logger = rspamd_main->logger;
if (!load_rspamd_config (rspamd_main, tmp_cfg, TRUE, load_opts, TRUE)) {
rspamd_main->cfg = old_cfg;
- rspamd_log_close_priv (rspamd_main->logger,
- FALSE,
- rspamd_main->workers_uid,
- rspamd_main->workers_gid);
- rspamd_set_logger (rspamd_main->cfg, g_quark_try_string ("main"),
- &rspamd_main->logger, rspamd_main->server_pool);
- rspamd_log_open_priv (rspamd_main->logger,
- rspamd_main->workers_uid,
- rspamd_main->workers_gid);
+ rspamd_main->logger = old_logger;
msg_err_main ("cannot parse new config file, revert to old one");
REF_RELEASE (tmp_cfg);
return FALSE;
}
else {
+ rspamd_log_close (old_logger);
msg_info_main ("replacing config");
REF_RELEASE (old_cfg);
rspamd_main->cfg->rspamd_user = rspamd_user;
struct rspamd_main *rspamd_main = (struct rspamd_main *)w->data;
if (!rspamd_main->wanna_die) {
- rspamd_log_reopen_priv (rspamd_main->logger,
+ rspamd_log_reopen (rspamd_main->logger,
+ rspamd_main->cfg,
rspamd_main->workers_uid,
rspamd_main->workers_gid);
msg_info_main ("logging reinitialised");
/* Detach existing workers and stop their heartbeats */
g_hash_table_foreach (rspamd_main->workers, stop_srv_ev, rspamd_main);
- /* Close log to avoid FDs leak, as reread_config will re-init logging */
- rspamd_log_close_priv (rspamd_main->logger,
- FALSE,
- rspamd_main->workers_uid,
- rspamd_main->workers_gid);
-
if (reread_config (rspamd_main)) {
msg_info_main ("kill old workers");
g_hash_table_foreach (rspamd_main->workers, kill_old_workers, NULL);
type = g_quark_from_static_string ("main");
/* First set logger to console logger */
- rspamd_main->logger = rspamd_log_init (rspamd_main->server_pool);
- rspamd_set_logger (rspamd_main->cfg, type,
- &rspamd_main->logger, rspamd_main->server_pool);
- (void) rspamd_log_open (rspamd_main->logger);
+ rspamd_main->logger = rspamd_log_open_emergency (rspamd_main->server_pool);
+ g_assert (rspamd_main->logger != NULL);
+
+ if (is_debug) {
+ rspamd_log_set_log_level (rspamd_main->logger, G_LOG_LEVEL_DEBUG);
+ }
+ else {
+ rspamd_log_set_log_level (rspamd_main->logger, G_LOG_LEVEL_MESSAGE);
+ }
+
g_log_set_default_handler (rspamd_glib_log_function, rspamd_main->logger);
g_set_printerr_handler (rspamd_glib_printerr_function);
/* Init listen sockets hash */
listen_sockets = g_hash_table_new (g_direct_hash, g_direct_equal);
-
- rspamd_log_close_priv (rspamd_main->logger, FALSE,
- rspamd_main->workers_uid, rspamd_main->workers_gid);
-
sqlite3_initialize ();
/* Load config */
/* Force debug log */
if (is_debug) {
- rspamd_main->cfg->log_level = G_LOG_LEVEL_DEBUG;
+ rspamd_log_set_log_level (rspamd_main->logger, G_LOG_LEVEL_DEBUG);
}
/* Create rolling history */
msg_info_main ("terminating...");
REF_RELEASE (rspamd_main->cfg);
- rspamd_log_close (rspamd_main->logger, TRUE);
+ rspamd_log_close (rspamd_main->logger);
g_hash_table_unref (rspamd_main->spairs);
g_hash_table_unref (rspamd_main->workers);
rspamd_mempool_delete (rspamd_main->server_pool);
}
REF_RELEASE (ctx->cfg);
- rspamd_log_close (worker->srv->logger, TRUE);
+ rspamd_log_close (worker->srv->logger);
exit (EXIT_SUCCESS);
}
rspamd_stat_close ();
REF_RELEASE (ctx->cfg);
- rspamd_log_close (worker->srv->logger, TRUE);
+ rspamd_log_close (worker->srv->logger);
exit (EXIT_SUCCESS);
}