|
|
|
@ -32,8 +32,12 @@
|
|
|
|
|
/**
|
|
|
|
|
* open the errorlog
|
|
|
|
|
*
|
|
|
|
|
* we have 3 possibilities:
|
|
|
|
|
* - stderr (default)
|
|
|
|
|
* - syslog
|
|
|
|
|
* - logfile
|
|
|
|
|
*
|
|
|
|
|
* if the open failed, report to the user and die
|
|
|
|
|
* if no filename is given, use syslog instead
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
@ -41,10 +45,18 @@ int log_error_open(server *srv) {
|
|
|
|
|
int fd;
|
|
|
|
|
int close_stderr = 1;
|
|
|
|
|
|
|
|
|
|
if (srv->srvconf.error_logfile->used) {
|
|
|
|
|
const char *logfile = srv->srvconf.error_logfile->ptr;
|
|
|
|
|
#ifdef HAVE_SYSLOG_H
|
|
|
|
|
/* perhaps someone wants to use syslog() */
|
|
|
|
|
openlog("lighttpd", LOG_CONS | LOG_PID, LOG_DAEMON);
|
|
|
|
|
#endif
|
|
|
|
|
srv->errorlog_mode = ERRORLOG_STDERR;
|
|
|
|
|
|
|
|
|
|
if (srv->srvconf.errorlog_use_syslog) {
|
|
|
|
|
srv->errorlog_mode = ERRORLOG_SYSLOG;
|
|
|
|
|
} else if (!buffer_is_empty(srv->srvconf.errorlog_file)) {
|
|
|
|
|
const char *logfile = srv->srvconf.errorlog_file->ptr;
|
|
|
|
|
|
|
|
|
|
if (-1 == (srv->log_error_fd = open(logfile, O_APPEND | O_WRONLY | O_CREAT | O_LARGEFILE, 0644))) {
|
|
|
|
|
if (-1 == (srv->errorlog_fd = open(logfile, O_APPEND | O_WRONLY | O_CREAT | O_LARGEFILE, 0644))) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "SSSS",
|
|
|
|
|
"opening errorlog '", logfile,
|
|
|
|
|
"' failed: ", strerror(errno));
|
|
|
|
@ -53,15 +65,9 @@ int log_error_open(server *srv) {
|
|
|
|
|
}
|
|
|
|
|
#ifdef FD_CLOEXEC
|
|
|
|
|
/* close fd on exec (cgi) */
|
|
|
|
|
fcntl(srv->log_error_fd, F_SETFD, FD_CLOEXEC);
|
|
|
|
|
#endif
|
|
|
|
|
} else {
|
|
|
|
|
srv->log_error_fd = -1;
|
|
|
|
|
#ifdef HAVE_SYSLOG_H
|
|
|
|
|
/* syslog-mode */
|
|
|
|
|
srv->log_using_syslog = 1;
|
|
|
|
|
openlog("lighttpd", LOG_CONS, LOG_LOCAL0);
|
|
|
|
|
fcntl(srv->errorlog_fd, F_SETFD, FD_CLOEXEC);
|
|
|
|
|
#endif
|
|
|
|
|
srv->errorlog_mode = ERRORLOG_FILE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "server started");
|
|
|
|
@ -70,7 +76,8 @@ int log_error_open(server *srv) {
|
|
|
|
|
/* don't close stderr for debugging purposes if run in valgrind */
|
|
|
|
|
if (RUNNING_ON_VALGRIND) close_stderr = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (srv->errorlog_mode == ERRORLOG_STDERR) close_stderr = 0;
|
|
|
|
|
|
|
|
|
|
/* move stderr to /dev/null */
|
|
|
|
|
if (close_stderr &&
|
|
|
|
|
-1 != (fd = open("/dev/null", O_WRONLY))) {
|
|
|
|
@ -92,8 +99,8 @@ int log_error_open(server *srv) {
|
|
|
|
|
int log_error_cycle(server *srv) {
|
|
|
|
|
/* only cycle if we are not in syslog-mode */
|
|
|
|
|
|
|
|
|
|
if (0 == srv->log_using_syslog) {
|
|
|
|
|
const char *logfile = srv->srvconf.error_logfile->ptr;
|
|
|
|
|
if (srv->errorlog_mode == ERRORLOG_FILE) {
|
|
|
|
|
const char *logfile = srv->srvconf.errorlog_file->ptr;
|
|
|
|
|
/* already check of opening time */
|
|
|
|
|
|
|
|
|
|
int new_fd;
|
|
|
|
@ -105,18 +112,15 @@ int log_error_cycle(server *srv) {
|
|
|
|
|
"' failed: ", strerror(errno),
|
|
|
|
|
", falling back to syslog()");
|
|
|
|
|
|
|
|
|
|
close(srv->log_error_fd);
|
|
|
|
|
srv->log_error_fd = -1;
|
|
|
|
|
close(srv->errorlog_fd);
|
|
|
|
|
srv->errorlog_fd = -1;
|
|
|
|
|
#ifdef HAVE_SYSLOG_H
|
|
|
|
|
/* fall back to syslog() */
|
|
|
|
|
srv->log_using_syslog = 1;
|
|
|
|
|
|
|
|
|
|
openlog("lighttpd", LOG_CONS, LOG_LOCAL0);
|
|
|
|
|
srv->errorlog_mode = ERRORLOG_SYSLOG;
|
|
|
|
|
#endif
|
|
|
|
|
} else {
|
|
|
|
|
/* ok, new log is open, close the old one */
|
|
|
|
|
close(srv->log_error_fd);
|
|
|
|
|
srv->log_error_fd = new_fd;
|
|
|
|
|
close(srv->errorlog_fd);
|
|
|
|
|
srv->errorlog_fd = new_fd;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -128,12 +132,17 @@ int log_error_cycle(server *srv) {
|
|
|
|
|
int log_error_close(server *srv) {
|
|
|
|
|
log_error_write(srv, __FILE__, __LINE__, "s", "server stopped");
|
|
|
|
|
|
|
|
|
|
if (srv->log_error_fd >= 0) {
|
|
|
|
|
close(srv->log_error_fd);
|
|
|
|
|
} else if(srv->log_using_syslog) {
|
|
|
|
|
switch(srv->errorlog_mode) {
|
|
|
|
|
case ERRORLOG_FILE:
|
|
|
|
|
close(srv->errorlog_fd);
|
|
|
|
|
break;
|
|
|
|
|
case ERRORLOG_SYSLOG:
|
|
|
|
|
#ifdef HAVE_SYSLOG_H
|
|
|
|
|
closelog();
|
|
|
|
|
#endif
|
|
|
|
|
break;
|
|
|
|
|
case ERRORLOG_STDERR:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
@ -142,7 +151,9 @@ int log_error_close(server *srv) {
|
|
|
|
|
int log_error_write(server *srv, const char *filename, unsigned int line, const char *fmt, ...) {
|
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
|
|
if (srv->log_using_syslog == 0) {
|
|
|
|
|
switch(srv->errorlog_mode) {
|
|
|
|
|
case ERRORLOG_FILE:
|
|
|
|
|
case ERRORLOG_STDERR:
|
|
|
|
|
/* cache the generated timestamp */
|
|
|
|
|
if (srv->cur_ts != srv->last_generated_debug_ts) {
|
|
|
|
|
buffer_prepare_copy(srv->ts_debug_str, 255);
|
|
|
|
@ -152,15 +163,19 @@ int log_error_write(server *srv, const char *filename, unsigned int line, const
|
|
|
|
|
srv->last_generated_debug_ts = srv->cur_ts;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
buffer_copy_string_buffer(srv->error_log, srv->ts_debug_str);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, ": (");
|
|
|
|
|
} else {
|
|
|
|
|
BUFFER_COPY_STRING_CONST(srv->error_log, "(");
|
|
|
|
|
buffer_copy_string_buffer(srv->errorlog_buf, srv->ts_debug_str);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, ": (");
|
|
|
|
|
break;
|
|
|
|
|
case ERRORLOG_SYSLOG:
|
|
|
|
|
/* syslog is generating its own timestamps */
|
|
|
|
|
BUFFER_COPY_STRING_CONST(srv->errorlog_buf, "(");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
buffer_append_string(srv->error_log, filename);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, ".");
|
|
|
|
|
buffer_append_long(srv->error_log, line);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, ") ");
|
|
|
|
|
|
|
|
|
|
buffer_append_string(srv->errorlog_buf, filename);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, ".");
|
|
|
|
|
buffer_append_long(srv->errorlog_buf, line);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, ") ");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(va_start(ap, fmt); *fmt; fmt++) {
|
|
|
|
@ -172,41 +187,41 @@ int log_error_write(server *srv, const char *filename, unsigned int line, const
|
|
|
|
|
switch(*fmt) {
|
|
|
|
|
case 's': /* string */
|
|
|
|
|
s = va_arg(ap, char *);
|
|
|
|
|
buffer_append_string(srv->error_log, s);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, " ");
|
|
|
|
|
buffer_append_string(srv->errorlog_buf, s);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
|
|
|
|
|
break;
|
|
|
|
|
case 'b': /* buffer */
|
|
|
|
|
b = va_arg(ap, buffer *);
|
|
|
|
|
buffer_append_string_buffer(srv->error_log, b);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, " ");
|
|
|
|
|
buffer_append_string_buffer(srv->errorlog_buf, b);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
|
|
|
|
|
break;
|
|
|
|
|
case 'd': /* int */
|
|
|
|
|
d = va_arg(ap, int);
|
|
|
|
|
buffer_append_long(srv->error_log, d);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, " ");
|
|
|
|
|
buffer_append_long(srv->errorlog_buf, d);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
|
|
|
|
|
break;
|
|
|
|
|
case 'o': /* off_t */
|
|
|
|
|
o = va_arg(ap, off_t);
|
|
|
|
|
buffer_append_off_t(srv->error_log, o);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, " ");
|
|
|
|
|
buffer_append_off_t(srv->errorlog_buf, o);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
|
|
|
|
|
break;
|
|
|
|
|
case 'x': /* int (hex) */
|
|
|
|
|
d = va_arg(ap, int);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, "0x");
|
|
|
|
|
buffer_append_hex(srv->error_log, d);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, " ");
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, "0x");
|
|
|
|
|
buffer_append_hex(srv->errorlog_buf, d);
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, " ");
|
|
|
|
|
break;
|
|
|
|
|
case 'S': /* string */
|
|
|
|
|
s = va_arg(ap, char *);
|
|
|
|
|
buffer_append_string(srv->error_log, s);
|
|
|
|
|
buffer_append_string(srv->errorlog_buf, s);
|
|
|
|
|
break;
|
|
|
|
|
case 'B': /* buffer */
|
|
|
|
|
b = va_arg(ap, buffer *);
|
|
|
|
|
buffer_append_string_buffer(srv->error_log, b);
|
|
|
|
|
buffer_append_string_buffer(srv->errorlog_buf, b);
|
|
|
|
|
break;
|
|
|
|
|
case 'D': /* int */
|
|
|
|
|
d = va_arg(ap, int);
|
|
|
|
|
buffer_append_long(srv->error_log, d);
|
|
|
|
|
buffer_append_long(srv->errorlog_buf, d);
|
|
|
|
|
break;
|
|
|
|
|
case '(':
|
|
|
|
|
case ')':
|
|
|
|
@ -214,23 +229,24 @@ int log_error_write(server *srv, const char *filename, unsigned int line, const
|
|
|
|
|
case '>':
|
|
|
|
|
case ',':
|
|
|
|
|
case ' ':
|
|
|
|
|
buffer_append_string_len(srv->error_log, fmt, 1);
|
|
|
|
|
buffer_append_string_len(srv->errorlog_buf, fmt, 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->error_log, "\n");
|
|
|
|
|
|
|
|
|
|
if (srv->log_error_fd >= 0) {
|
|
|
|
|
write(srv->log_error_fd, srv->error_log->ptr, srv->error_log->used - 1);
|
|
|
|
|
} else if (srv->log_using_syslog == 0) {
|
|
|
|
|
/* only available at startup time */
|
|
|
|
|
write(STDERR_FILENO, srv->error_log->ptr, srv->error_log->used - 1);
|
|
|
|
|
} else {
|
|
|
|
|
#ifdef HAVE_SYSLOG_H
|
|
|
|
|
syslog(LOG_ERR, "%s", srv->error_log->ptr);
|
|
|
|
|
#endif
|
|
|
|
|
switch(srv->errorlog_mode) {
|
|
|
|
|
case ERRORLOG_FILE:
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, "\n");
|
|
|
|
|
write(srv->errorlog_fd, srv->errorlog_buf->ptr, srv->errorlog_buf->used - 1);
|
|
|
|
|
break;
|
|
|
|
|
case ERRORLOG_STDERR:
|
|
|
|
|
BUFFER_APPEND_STRING_CONST(srv->errorlog_buf, "\n");
|
|
|
|
|
write(STDERR_FILENO, srv->errorlog_buf->ptr, srv->errorlog_buf->used - 1);
|
|
|
|
|
break;
|
|
|
|
|
case ERRORLOG_SYSLOG:
|
|
|
|
|
syslog(LOG_ERR, "%s", srv->errorlog_buf->ptr);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|