dovecot-2.0: Logging via log service: Added support for changing...
dovecot at dovecot.org
dovecot at dovecot.org
Wed Sep 9 02:30:13 EEST 2009
details: http://hg.dovecot.org/dovecot-2.0/rev/d7bbe0964b0d
changeset: 9911:d7bbe0964b0d
user: Timo Sirainen <tss at iki.fi>
date: Tue Sep 08 19:29:54 2009 -0400
description:
Logging via log service: Added support for changing process's log prefix.
diffstat:
2 files changed, 47 insertions(+), 28 deletions(-)
src/lib/failures.c | 22 +++++++++++++------
src/log/log-connection.c | 53 +++++++++++++++++++++++++++-------------------
diffs (172 lines):
diff -r 5f61efdc9f35 -r d7bbe0964b0d src/lib/failures.c
--- a/src/lib/failures.c Tue Sep 08 18:45:27 2009 -0400
+++ b/src/lib/failures.c Tue Sep 08 19:29:54 2009 -0400
@@ -406,10 +406,24 @@ void i_set_failure_file(const char *path
i_set_info_handler(NULL);
}
+static void i_failure_send_option(const char *key, const char *value)
+{
+ const char *str;
+
+ if (error_handler != i_internal_error_handler)
+ return;
+
+ str = t_strdup_printf("\001%c%s %s=%s\n", LOG_TYPE_OPTION+1,
+ my_pid, key, value);
+ (void)write_full(2, str, strlen(str));
+}
+
void i_set_failure_prefix(const char *prefix)
{
i_free(log_prefix);
log_prefix = i_strdup(prefix);
+
+ i_failure_send_option("prefix", prefix);
}
static int internal_send_split(string_t *full_str, unsigned int prefix_len)
@@ -556,13 +570,7 @@ void i_set_failure_timestamp_format(cons
void i_set_failure_ip(const struct ip_addr *ip)
{
- const char *str;
-
- if (error_handler == i_internal_error_handler) {
- str = t_strdup_printf("\001%c%s ip=%s\n",
- LOG_TYPE_OPTION, my_pid, net_ip2addr(ip));
- (void)write_full(2, str, strlen(str));
- }
+ i_failure_send_option("ip", net_ip2addr(ip));
}
void i_set_failure_exit_callback(void (*callback)(int *status))
diff -r 5f61efdc9f35 -r d7bbe0964b0d src/log/log-connection.c
--- a/src/log/log-connection.c Tue Sep 08 18:45:27 2009 -0400
+++ b/src/log/log-connection.c Tue Sep 08 19:29:54 2009 -0400
@@ -17,6 +17,7 @@
struct log_client {
struct ip_addr ip;
+ char *prefix;
unsigned int fatal_logged:1;
};
@@ -27,7 +28,8 @@ struct log_connection {
int listen_fd;
struct io *io;
- char *prefix;
+ char *default_prefix;
+ /* pid -> struct log_client* */
struct hash_table *clients;
unsigned int master:1;
@@ -49,20 +51,27 @@ static struct log_client *log_client_get
return client;
}
-static void log_parse_ip(struct log_connection *log,
- const struct failure_line *failure)
-{
- struct log_client *client;
-
- client = log_client_get(log, failure->pid);
- (void)net_addr2ip(failure->text + 3, &client->ip);
+static void log_client_free(struct log_connection *log,
+ struct log_client *client, pid_t pid)
+{
+ hash_table_remove(log->clients, POINTER_CAST(pid));
+
+ i_free(client->prefix);
+ i_free(client);
}
static void log_parse_option(struct log_connection *log,
const struct failure_line *failure)
{
+ struct log_client *client;
+
+ client = log_client_get(log, failure->pid);
if (strncmp(failure->text, "ip=", 3) == 0)
- log_parse_ip(log, failure);
+ (void)net_addr2ip(failure->text + 3, &client->ip);
+ else if (strncmp(failure->text, "prefix=", 7) == 0) {
+ i_free(client->prefix);
+ client->prefix = i_strdup(failure->text + 7);
+ }
}
static void log_parse_master_line(const char *line)
@@ -98,17 +107,14 @@ static void log_parse_master_line(const
it's not an error. */
return;
}
- hash_table_remove(log->clients, POINTER_CAST(pid));
- i_free(client);
+ log_client_free(log, client, pid);
} else if (strncmp(line, "DEFAULT-FATAL ", 14) == 0) {
/* If the client has logged a fatal/panic, don't log this
message. */
if (client == NULL || !client->fatal_logged)
i_error("%s", line + 14);
- else {
- hash_table_remove(log->clients, POINTER_CAST(pid));
- i_free(client);
- }
+ else
+ log_client_free(log, client, pid);
} else {
i_error("Received unknown command from master: %s", line);
}
@@ -117,7 +123,8 @@ static void log_it(struct log_connection
static void log_it(struct log_connection *log, const char *line)
{
struct failure_line failure;
- struct log_client *client;
+ struct log_client *client = NULL;
+ const char *prefix;
if (log->master) {
log_parse_master_line(line);
@@ -135,11 +142,15 @@ static void log_it(struct log_connection
log_parse_option(log, &failure);
return;
default:
+ client = hash_table_lookup(log->clients,
+ POINTER_CAST(failure.pid));
break;
}
i_assert(failure.log_type < LOG_TYPE_COUNT);
- i_set_failure_prefix(log->prefix);
+ prefix = client != NULL && client->prefix != NULL ?
+ client->prefix : log->default_prefix;
+ i_set_failure_prefix(prefix);
i_log_type(failure.log_type, "%s", failure.text);
i_set_failure_prefix("log: ");
}
@@ -157,11 +168,11 @@ static bool log_connection_handshake(str
return FALSE;
if (handshake.prefix_len <= size - sizeof(handshake)) {
- log->prefix = i_strndup(*data + sizeof(handshake),
- handshake.prefix_len);
+ log->default_prefix = i_strndup(*data + sizeof(handshake),
+ handshake.prefix_len);
*data += sizeof(handshake) + handshake.prefix_len;
}
- if (strcmp(log->prefix, MASTER_LOG_PREFIX_NAME) == 0) {
+ if (strcmp(log->default_prefix, MASTER_LOG_PREFIX_NAME) == 0) {
if (log->listen_fd != MASTER_LISTEN_FD_FIRST) {
i_error("Received master prefix in handshake "
"from non-master fd %d", log->fd);
@@ -239,7 +250,7 @@ void log_connection_destroy(struct log_c
io_remove(&log->io);
if (close(log->fd) < 0)
i_error("close(log connection fd) failed: %m");
- i_free(log->prefix);
+ i_free(log->default_prefix);
i_free(log);
master_service_client_connection_destroyed(master_service);
More information about the dovecot-cvs
mailing list