completed logging pluginization

This commit is contained in:
roberto@oneiric64
2011-12-14 10:50:25 +01:00
parent e32185cc14
commit d3053523ab
10 changed files with 136 additions and 66 deletions
+1 -1
View File
@@ -27,7 +27,7 @@ plugins =
bin_name = uwsgi
append_version =
plugin_dir = .
embedded_plugins = python, ping, cache, nagios, rrdtool, carbon, rpc, fastrouter, http, ugreen, signal, syslog, rsyslog
embedded_plugins = python, ping, cache, nagios, rrdtool, carbon, rpc, fastrouter, http, ugreen, signal, syslog, rsyslog, logsocket
as_shared_library = false
locking = auto
-3
View File
@@ -77,9 +77,6 @@ void master_log(void) {
if (uwsgi.choosen_logger) {
uwsgi.choosen_logger->func(uwsgi.choosen_logger, log_buf, rlen);
}
else if (uwsgi.log_socket) {
sendto(uwsgi.log_socket_fd, log_buf, rlen, 0, &uwsgi.log_socket_addr->sa, uwsgi.log_socket_size);
}
else {
rlen = write(uwsgi.original_log_fd, log_buf, rlen);
}
+18 -13
View File
@@ -19,32 +19,37 @@ ssize_t uwsgi_graylog2_logger(struct uwsgi_logger *ul, char *message, size_t len
if (!ul->configured) {
if (!uwsgi.choosen_logger_arg) return -1;
if (!uwsgi.choosen_logger_arg) {
uwsgi_log_safe("invalid graylog2 syntax\n");
exit(1);
}
ul->fd = socket(AF_INET, SOCK_DGRAM, 0);
if (ul->fd < 0) return -1 ;
if (ul->fd < 0) {
uwsgi_error_safe("socket()");
exit(1);
}
uwsgi_socket_nb(ul->fd);
char *comma = strchr(uwsgi.choosen_logger_arg, ',');
if (!comma) return -1;
if (!comma) {
uwsgi_log_safe("invalid graylog2 syntax\n");
exit(1);
}
g2c.host = comma + 1;
*comma = 0;
char *colon = strchr(uwsgi.choosen_logger_arg, ':');
if (!colon) return -1;
if (!colon) {
uwsgi_log_safe("invalid graylog2 syntax\n");
exit(1);
}
memset(&ul->sin, 0, sizeof(struct sockaddr_in));
ul->sin.sin_family = AF_INET;
ul->sin.sin_port = htons(atoi(colon + 1));
ul->addr_len = socket_to_in_addr(uwsgi.choosen_logger_arg, colon, 0, &ul->addr.sa_in);
*colon = 0;
ul->sin.sin_addr.s_addr = inet_addr(uwsgi.choosen_logger_arg);
*colon = ':';
*comma = ',';
ul->configured = 1;
@@ -87,7 +92,7 @@ ssize_t uwsgi_graylog2_logger(struct uwsgi_logger *ul, char *message, size_t len
if (rlen > 0) {
if (compressBound((uLong) rlen) <= MAX_GELF) {
if (compress((Bytef *) g2c.buffer, &destLen, (Bytef *) g2c.json_buf, (uLong) rlen) == Z_OK) {
return sendto(ul->fd, g2c.buffer, destLen, 0, (const struct sockaddr *) &ul->sin, sizeof(struct sockaddr_in));
return sendto(ul->fd, g2c.buffer, destLen, 0, (const struct sockaddr *) &ul->addr, ul->addr_len);
}
}
+78
View File
@@ -0,0 +1,78 @@
#include "../../uwsgi.h"
extern struct uwsgi_server uwsgi;
ssize_t uwsgi_socket_logger(struct uwsgi_logger *ul, char *message, size_t len) {
int family = AF_UNIX;
if (!ul->configured) {
char *comma = strchr(uwsgi.choosen_logger_arg, ',');
if (comma) {
ul->data = comma+1;
*comma = 0;
}
char *colon = strchr(uwsgi.choosen_logger_arg, ':');
if (colon) {
family = AF_INET;
ul->addr_len = socket_to_in_addr(uwsgi.choosen_logger_arg, colon, 0, &ul->addr.sa_in);
}
else {
ul->addr_len = socket_to_un_addr(uwsgi.choosen_logger_arg, &ul->addr.sa_un);
}
ul->fd = socket(family, SOCK_DGRAM, 0);
if (ul->fd < 0) {
uwsgi_error_safe("socket()");
exit(1);
}
memset(&ul->msg, 0, sizeof(struct msghdr));
ul->msg.msg_name = &ul->addr;
ul->msg.msg_namelen = ul->addr_len;
if (ul->data) {
ul->msg.msg_iov = uwsgi_malloc(sizeof(struct iovec) * 2);
ul->msg.msg_iov[0].iov_base = ul->data;
ul->msg.msg_iov[0].iov_len = strlen(ul->data);
ul->msg.msg_iovlen = 2;
ul->count = 1;
}
else {
ul->msg.msg_iov = uwsgi_malloc(sizeof(struct iovec));
ul->msg.msg_iovlen = 1;
}
if (comma) {
*comma = ',' ;
}
ul->configured = 1;
}
ul->msg.msg_iov[ul->count].iov_base = message;
ul->msg.msg_iov[ul->count].iov_len = len;
return sendmsg(ul->fd, &ul->msg, 0);
}
void uwsgi_logsocket_register() {
uwsgi_register_logger("socket", uwsgi_socket_logger);
}
int uwsgi_logsocket_init() {
return 0;
}
struct uwsgi_plugin logsocket_plugin = {
.name = "logsocket",
.on_load = uwsgi_logsocket_register,
.init = uwsgi_logsocket_init
};
+6
View File
@@ -0,0 +1,6 @@
NAME='logsocket'
CFLAGS = []
LDFLAGS = []
LIBS = []
GCC_LIST = ['logsocket_plugin']
+12 -10
View File
@@ -13,10 +13,16 @@ ssize_t uwsgi_rsyslog_logger(struct uwsgi_logger *ul, char *message, size_t len)
if (!ul->configured) {
if (!uwsgi.choosen_logger_arg) return -1;
if (!uwsgi.choosen_logger_arg) {
uwsgi_log_safe("invalid rsyslog syntax\n");
exit(1);
}
ul->fd = socket(AF_INET, SOCK_DGRAM, 0);
if (ul->fd < 0) return -1 ;
if (ul->fd < 0) {
uwsgi_error_safe("socket()");
exit(1);
}
uwsgi_socket_nb(ul->fd);
@@ -26,7 +32,7 @@ ssize_t uwsgi_rsyslog_logger(struct uwsgi_logger *ul, char *message, size_t len)
*comma = 0;
}
else {
ul->data = "uwsgi";
ul->data = uwsgi_concat2(uwsgi.hostname," uwsgi");
}
@@ -36,11 +42,7 @@ ssize_t uwsgi_rsyslog_logger(struct uwsgi_logger *ul, char *message, size_t len)
*port = 0;
}
memset(&ul->sin, 0, sizeof(struct sockaddr_in));
ul->sin.sin_family = AF_INET;
ul->sin.sin_port = htons(portn);
ul->sin.sin_addr.s_addr = inet_addr(uwsgi.choosen_logger_arg);
ul->addr_len = socket_to_in_addr(uwsgi.choosen_logger_arg, NULL, portn, &ul->addr.sa_in);
if (port) *port = ':';
if (comma) *comma = ',';
@@ -54,9 +56,9 @@ ssize_t uwsgi_rsyslog_logger(struct uwsgi_logger *ul, char *message, size_t len)
// drop newline
if (message[len-1] == '\n') len--;
rlen = snprintf(buf, MAX_SYSLOG_PKT, "<29>%.*s %s %s: %.*s", 19, ctime(&current_time), uwsgi.hostname, (char *) ul->data, (int) len, message);
rlen = snprintf(buf, MAX_SYSLOG_PKT, "<29>%.*s %s: %.*s", 15, ctime(&current_time)+4, (char *) ul->data, (int) len, message);
if (rlen > 0) {
return sendto(ul->fd, buf, rlen, 0, (const struct sockaddr *) &ul->sin, sizeof(struct sockaddr_in));
return sendto(ul->fd, buf, rlen, 0, (const struct sockaddr *) &ul->addr, ul->addr_len);
}
return -1;
+10 -3
View File
@@ -460,15 +460,18 @@ socklen_t socket_to_un_addr(char *socket_name, struct sockaddr_un *sun_addr) {
return sizeof(sun_addr->sun_family)+len;
}
socklen_t socket_to_in_addr(char *socket_name, char *port, struct sockaddr_in *sin_addr) {
socklen_t socket_to_in_addr(char *socket_name, char *port, int portn, struct sockaddr_in *sin_addr) {
memset(sin_addr, 0, sizeof(struct sockaddr_in));
sin_addr->sin_family = AF_INET;
if (port) {
port[0] = 0;
*port = 0;
sin_addr->sin_port = htons(atoi(port + 1));
}
else {
sin_addr->sin_port = htons(portn);
}
if (socket_name[0] == 0) {
sin_addr->sin_addr.s_addr = INADDR_ANY;
@@ -483,6 +486,10 @@ socklen_t socket_to_in_addr(char *socket_name, char *port, struct sockaddr_in *s
}
}
if (port) {
*port = ':';
}
return sizeof(struct sockaddr_in);
}
@@ -493,7 +500,7 @@ int bind_to_tcp(char *socket_name, int listen_queue, char *tcp_port) {
struct sockaddr_in uws_addr;
int reuse = 1;
socket_to_in_addr(socket_name, tcp_port, &uws_addr);
socket_to_in_addr(socket_name, tcp_port, 0, &uws_addr);
serverfd = socket(AF_INET, SOCK_STREAM, 0);
if (serverfd < 0) {
+4 -24
View File
@@ -279,7 +279,10 @@ ssize_t uwsgi_zeromq_logger(struct uwsgi_logger *ul, char *message, size_t len)
if (!ul->configured) {
if (!uwsgi.choosen_logger_arg) return -1;
if (!uwsgi.choosen_logger_arg) {
uwsgi_log_safe("invalid zeromq syntax\n");
exit(1);
}
void *ctx = zmq_init(1);
if (ctx == NULL) {
@@ -312,29 +315,6 @@ ssize_t uwsgi_zeromq_logger(struct uwsgi_logger *ul, char *message, size_t len)
}
#endif
void log_socket(char *socket_name) {
int family = AF_UNIX;
uwsgi.log_socket_addr = uwsgi_malloc(sizeof(union uwsgi_sockaddr));
char *colon = strchr(socket_name, ':');
if (colon) {
family = AF_INET;
uwsgi.log_socket_size = socket_to_in_addr(socket_name, colon, &uwsgi.log_socket_addr->sa_in);
}
else {
uwsgi.log_socket_size = socket_to_un_addr(socket_name, &uwsgi.log_socket_addr->sa_un);
}
uwsgi.log_socket_fd = socket(family, SOCK_DGRAM, 0);
if (uwsgi.log_socket_fd < 0) {
uwsgi_error("socket()");
uwsgi_nuclear_blast();
}
}
void create_logpipe(void) {
#if defined(SOCK_SEQPACKET) && defined(__linux__)
+1 -2
View File
@@ -3200,10 +3200,9 @@ static int manage_base_opt(int i, char *optarg) {
uwsgi.log_master = 1;
return 1;
case LONG_ARGS_LOG_SOCKET:
uwsgi.log_socket = 1;
uwsgi.log_master = 1;
uwsgi.master_process = 1;
log_socket(optarg);
uwsgi.requested_logger = uwsgi_concat2("socket:", optarg);
return 1;
case LONG_ARGS_LOGGER:
uwsgi.log_master = 1;
+6 -10
View File
@@ -11,6 +11,7 @@ extern "C" {
#define UMAX64_STR "18446744073709551616"
#define uwsgi_error(x) uwsgi_log("%s: %s [%s line %d]\n", x, strerror(errno), __FILE__, __LINE__);
#define uwsgi_log_safe(x) if (uwsgi.original_log_fd != 2) dup2(uwsgi.original_log_fd, 2) ; uwsgi_log(x);
#define uwsgi_error_safe(x) if (uwsgi.original_log_fd != 2) dup2(uwsgi.original_log_fd, 2) ; uwsgi_log("%s: %s [%s line %d]\n", x, strerror(errno), __FILE__, __LINE__);
#define uwsgi_log_initial if (!uwsgi.no_initial_output) uwsgi_log
#define uwsgi_fatal_error(x) uwsgi_error(x); exit(1);
@@ -349,7 +350,10 @@ struct uwsgi_logger {
int configured;
int fd;
void *data;
struct sockaddr_in sin;
union uwsgi_sockaddr addr;
socklen_t addr_len;
int count;
struct msghdr msg;
struct uwsgi_logger *next;
};
@@ -1201,12 +1205,6 @@ struct uwsgi_server {
int original_log_fd;
int log_socket;
int log_socket_fd;
union uwsgi_sockaddr *log_socket_addr;
socklen_t log_socket_size;
// static file serving
int file_serve_mode;
int build_mime_dict;
@@ -2404,9 +2402,7 @@ void uwsgi_ignition(void);
void master_check_cluster_nodes(void);
int uwsgi_respawn_worker(int);
void log_socket(char *);
socklen_t socket_to_in_addr(char *, char *, struct sockaddr_in *);
socklen_t socket_to_in_addr(char *, char *, int, struct sockaddr_in *);
socklen_t socket_to_un_addr(char *, struct sockaddr_un *);
int uwsgi_get_shared_socket_fd_by_num(int);