Skip to content

Commit

Permalink
[Rework] More logger refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
vstakhov committed Feb 10, 2020
1 parent 4de514b commit 7630467
Show file tree
Hide file tree
Showing 8 changed files with 290 additions and 386 deletions.
505 changes: 189 additions & 316 deletions src/libutil/logger.c

Large diffs are not rendered by default.

67 changes: 40 additions & 27 deletions src/libutil/logger.h
Expand Up @@ -33,6 +33,10 @@ typedef void * (*rspamd_log_init_func) (rspamd_logger_t *logger,
struct rspamd_config *cfg,
uid_t uid, gid_t gid,
GError **err);
typedef bool (*rspamd_log_on_fork_func) (rspamd_logger_t *logger,
struct rspamd_config *cfg,
gpointer arg,
GError **err);
typedef void* (*rspamd_log_reload_func) (rspamd_logger_t *logger,
struct rspamd_config *cfg,
gpointer arg,
Expand All @@ -46,59 +50,74 @@ struct rspamd_logger_funcs {
rspamd_log_reload_func reload;
rspamd_log_dtor_func dtor;
rspamd_log_func_t log;
rspamd_log_on_fork_func on_fork;
gpointer specific;
};

#define RSPAMD_LOGBUF_SIZE 8192

/**
* Init logger
* Opens a new (initial) logger with console type
* This logger is also used as an emergency logger
* @return new rspamd logger object
*/
void rspamd_set_logger (struct rspamd_config *cfg,
GQuark ptype,
rspamd_logger_t **plogger,
rspamd_mempool_t *pool);
rspamd_logger_t * rspamd_log_open_emergency (rspamd_mempool_t *pool);

/**
* Open log file or initialize other structures
* Open specific (configured logging)
* @param pool
* @param config
* @param uid
* @param gid
* @return
*/
bool rspamd_log_open (rspamd_logger_t *logger);
rspamd_logger_t * rspamd_log_open_specific (rspamd_mempool_t *pool,
struct rspamd_config *config,
const gchar *ptype,
uid_t uid, gid_t gid);

/**
* Close log file or destroy other structures
* Set log level (from GLogLevelFlags)
* @param logger
* @param level
*/
bool rspamd_log_close (rspamd_logger_t *logger, gboolean termination);

void rspamd_log_set_log_level (rspamd_logger_t *logger, gint level);
/**
* Close and open log again
* Set log flags (from enum rspamd_log_flags)
* @param logger
* @param flags
*/
bool rspamd_log_reopen (rspamd_logger_t *logger);
void rspamd_log_set_log_flags (rspamd_logger_t *logger, gint flags);

/**
* Open log file or initialize other structures for privileged processes
* Close log file or destroy other structures
*/
bool rspamd_log_open_priv (rspamd_logger_t *logger, uid_t uid, gid_t gid);
void rspamd_log_close (rspamd_logger_t *logger);


/**
* Close log file or destroy other structures for privileged processes
*/
void rspamd_log_close_priv (rspamd_logger_t *logger, gboolean termination, uid_t uid, gid_t gid);

rspamd_logger_t * rspamd_log_default_logger (void);
rspamd_logger_t * rspamd_log_emergency_logger (void);

/**
* Close and open log again for privileged processes
*/
bool rspamd_log_reopen_priv (rspamd_logger_t *logger, uid_t uid, gid_t gid);
bool rspamd_log_reopen (rspamd_logger_t *logger, struct rspamd_config *cfg,
uid_t uid, gid_t gid);

/**
* Set log pid
*/
void rspamd_log_update_pid (GQuark ptype, rspamd_logger_t *logger);
void rspamd_log_on_fork (GQuark ptype, struct rspamd_config *cfg,
rspamd_logger_t *logger);

/**
* Log function that is compatible for glib messages
*/
void rspamd_glib_log_function (const gchar *log_domain,
GLogLevelFlags log_level, const gchar *message, gpointer arg);
GLogLevelFlags log_level,
const gchar *message,
gpointer arg);

/**
* Log function for printing glib assertions
Expand Down Expand Up @@ -207,12 +226,6 @@ const guint64 *rspamd_log_counters (rspamd_logger_t *logger);
*/
ucl_object_t *rspamd_log_errorbuf_export (const rspamd_logger_t *logger);

/**
* Returns the current logger object
* @return
*/
rspamd_logger_t *rspamd_logger_get_singleton (void);

/**
* Sets new logger functions and initialise logging if needed
* @param logger
Expand Down
4 changes: 2 additions & 2 deletions src/libutil/logger_console.c
Expand Up @@ -63,7 +63,7 @@ rspamd_log_console_init (rspamd_logger_t *logger, struct rspamd_config *cfg,

priv = g_malloc0 (sizeof (*priv));
priv->log_color = (logger->flags & RSPAMD_LOG_FLAG_COLOR);
priv->log_rspamadm (logger->flags & RSPAMD_LOG_FLAG_RSPAMADM);
priv->log_rspamadm = (logger->flags & RSPAMD_LOG_FLAG_RSPAMADM);

if (priv->log_rspamadm) {
priv->fd = dup (STDOUT_FILENO);
Expand All @@ -78,7 +78,7 @@ rspamd_log_console_init (rspamd_logger_t *logger, struct rspamd_config *cfg,
g_set_error (err, CONSOLE_LOG_QUARK, errno,
"open_log: cannot dup console fd: %s, %s\n",
strerror (errno));
rspamd_log_console_dtor (priv);
rspamd_log_console_dtor (logger, priv);

return NULL;
}
Expand Down
80 changes: 45 additions & 35 deletions src/libutil/logger_file.c
Expand Up @@ -261,44 +261,42 @@ rspamd_log_reset_repeated (rspamd_logger_t *rspamd_log,
gchar tmpbuf[256];
gssize r;

if (rspamd_log->opened) {
if (priv->repeats > REPEATS_MIN) {
r = rspamd_snprintf (tmpbuf,
sizeof (tmpbuf),
"Last message repeated %ud times",
priv->repeats - REPEATS_MIN);
priv->repeats = 0;

if (priv->saved_message) {
rspamd_log_file_log (priv->saved_module,
priv->saved_id,
priv->saved_function,
priv->saved_loglevel | RSPAMD_LOG_FORCED,
priv->saved_message,
priv->saved_mlen,
rspamd_log,
priv);

g_free (priv->saved_message);
g_free (priv->saved_function);
g_free (priv->saved_module);
g_free (priv->saved_id);
priv->saved_message = NULL;
priv->saved_function = NULL;
priv->saved_module = NULL;
priv->saved_id = NULL;
}

/* It is safe to use temporary buffer here as it is not static */
rspamd_log_file_log (NULL, NULL,
G_STRFUNC,
if (priv->repeats > REPEATS_MIN) {
r = rspamd_snprintf (tmpbuf,
sizeof (tmpbuf),
"Last message repeated %ud times",
priv->repeats - REPEATS_MIN);
priv->repeats = 0;

if (priv->saved_message) {
rspamd_log_file_log (priv->saved_module,
priv->saved_id,
priv->saved_function,
priv->saved_loglevel | RSPAMD_LOG_FORCED,
tmpbuf,
r,
priv->saved_message,
priv->saved_mlen,
rspamd_log,
priv);
rspamd_log_flush (rspamd_log, priv);

g_free (priv->saved_message);
g_free (priv->saved_function);
g_free (priv->saved_module);
g_free (priv->saved_id);
priv->saved_message = NULL;
priv->saved_function = NULL;
priv->saved_module = NULL;
priv->saved_id = NULL;
}

/* It is safe to use temporary buffer here as it is not static */
rspamd_log_file_log (NULL, NULL,
G_STRFUNC,
priv->saved_loglevel | RSPAMD_LOG_FORCED,
tmpbuf,
r,
rspamd_log,
priv);
rspamd_log_flush (rspamd_log, priv);
}
}

Expand Down Expand Up @@ -340,7 +338,7 @@ rspamd_log_file_init (rspamd_logger_t *logger, struct rspamd_config *cfg,
{
struct rspamd_file_logger_priv *priv;

if (!cfg->cfg_name) {
if (!cfg || !cfg->cfg_name) {
g_set_error (err, FILE_LOG_QUARK, EINVAL,
"no log file specified");
return NULL;
Expand Down Expand Up @@ -585,3 +583,15 @@ rspamd_log_file_reload (rspamd_logger_t *logger, struct rspamd_config *cfg,

return npriv;
}

bool
rspamd_log_file_on_fork (rspamd_logger_t *logger, struct rspamd_config *cfg,
gpointer arg, GError **err)
{
struct rspamd_file_logger_priv *priv = (struct rspamd_file_logger_priv *)arg;

rspamd_log_reset_repeated (logger, priv);
rspamd_log_flush (logger, priv);

return true;
}
7 changes: 6 additions & 1 deletion src/libutil/logger_private.h
Expand Up @@ -70,12 +70,12 @@ struct rspamd_logger_s {
gboolean enabled;
gboolean is_debug;
gboolean no_lock;
gboolean opened;

pid_t pid;
const gchar *process_type;
struct rspamd_radix_map_helper *debug_ip;
rspamd_mempool_mutex_t *mtx;
rspamd_mempool_t *pool;
guint64 log_cnt[4];
};

Expand All @@ -98,12 +98,15 @@ bool rspamd_log_file_log (const gchar *module, const gchar *id,
gsize mlen,
rspamd_logger_t *rspamd_log,
gpointer arg);
bool rspamd_log_file_on_fork (rspamd_logger_t *logger, struct rspamd_config *cfg,
gpointer arg, GError **err);

const static struct rspamd_logger_funcs file_log_funcs = {
.init = rspamd_log_file_init,
.dtor = rspamd_log_file_dtor,
.reload = rspamd_log_file_reload,
.log = rspamd_log_file_log,
.on_fork = rspamd_log_file_on_fork,
};

/*
Expand All @@ -127,6 +130,7 @@ const static struct rspamd_logger_funcs syslog_log_funcs = {
.dtor = rspamd_log_syslog_dtor,
.reload = rspamd_log_syslog_reload,
.log = rspamd_log_syslog_log,
.on_fork = NULL,
};

/*
Expand All @@ -150,6 +154,7 @@ const static struct rspamd_logger_funcs console_log_funcs = {
.dtor = rspamd_log_console_dtor,
.reload = rspamd_log_console_reload,
.log = rspamd_log_console_log,
.on_fork = NULL,
};

#endif
6 changes: 6 additions & 0 deletions src/libutil/logger_syslog.c
Expand Up @@ -34,6 +34,12 @@ rspamd_log_syslog_init (rspamd_logger_t *logger, struct rspamd_config *cfg,
{
struct rspamd_syslog_logger_priv *priv;

if (!cfg) {
g_set_error (err, SYSLOG_LOG_QUARK, EINVAL,
"no log config specified");
return NULL;
}

priv = g_malloc0 (sizeof (*priv));

priv->log_facility = cfg->log_facility;
Expand Down
2 changes: 1 addition & 1 deletion src/lua/lua_config.c
Expand Up @@ -4299,7 +4299,7 @@ lua_config_init_subsystem (lua_State *L)
struct ev_loop *ev_base = lua_check_ev_base (L, 3);

if (ev_base) {
cfg->dns_resolver = rspamd_dns_resolver_init (rspamd_logger_get_singleton (),
cfg->dns_resolver = rspamd_dns_resolver_init (rspamd_log_default_logger (),
ev_base,
cfg);
}
Expand Down
5 changes: 1 addition & 4 deletions src/rspamd.c
Expand Up @@ -1237,7 +1237,7 @@ main (gint argc, gchar **argv, gchar **env)
type = g_quark_from_static_string ("main");

/* First set logger to console logger */
rspamd_main->cfg->log_type = RSPAMD_LOG_CONSOLE;
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);
Expand Down Expand Up @@ -1338,9 +1338,6 @@ main (gint argc, gchar **argv, gchar **env)
/* Set title */
setproctitle ("main process");

/* Flush log */
rspamd_log_flush (rspamd_main->logger);

/* Open control socket if needed */
control_fd = -1;
if (rspamd_main->cfg->control_socket_path) {
Expand Down

0 comments on commit 7630467

Please sign in to comment.