📄 log.c
字号:
/*
* Boa, an http server
* Copyright (C) 1995 Paul Phillips <paulp@go2net.com>
* Some changes Copyright (C) 1996 Larry Doolittle <ldoolitt@boa.org>
* Some changes Copyright (C) 1999 Jon Nelson <jnelson@boa.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
/* $Id: log.c,v 1.36.2.3 2002/07/26 03:04:48 jnelson Exp $*/
#include "boa.h"
FILE *access_log;
char *error_log_name;
char *access_log_name;
char *cgi_log_name;
int cgi_log_fd;
FILE *fopen_gen_fd(char *spec, const char *mode);
FILE *fopen_gen_fd(char *spec, const char *mode)
{
int fd;
if (!spec || *spec == '\0')
return NULL;
fd = open_gen_fd(spec);
if (fd == -1)
return NULL;
return fdopen(fd, mode);
}
/*
* Name: open_logs
*
* Description: Opens access log, error log, and if specified, cgi log
* Ties stderr to error log, except during cgi execution, at which
* time cgi log is the stderr for cgis.
*
* Access log is line buffered, error log is not buffered.
*
*/
void open_logs(void)
{
int error_log;
/* if error_log_name is set, dup2 stderr to it */
/* otherwise, leave stderr alone */
/* we don't want to tie stderr to /dev/null */
if (error_log_name) {
/* open the log file */
if (!(error_log = open_gen_fd(error_log_name))) {
DIE("unable to open error log");
}
/* redirect stderr to error_log */
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
close(error_log);
}
/* set the close-on-exec to true */
if (fcntl(STDERR_FILENO, F_SETFD, 1) == -1) {
DIE("unable to fcntl the error log");
}
if (access_log_name) {
/* Used the "a" flag with fopen, but fopen_gen_fd builds that in
* implicitly when used as a file, and "a" is incompatible with
* pipes and network sockets. */
if (!(access_log = fopen_gen_fd(access_log_name, "w"))) {
int errno_save = errno;
fprintf(stderr, "Cannot open %s for logging: ",
access_log_name);
errno = errno_save;
perror("logfile open");
exit(errno);
}
/* line buffer the access log */
#ifdef SETVBUF_REVERSED
setvbuf(access_log, _IOLBF, (char *) NULL, 0);
#else
setvbuf(access_log, (char *) NULL, _IOLBF, 0);
#endif
} else
access_log = NULL;
if (cgi_log_name) {
cgi_log_fd = open_gen_fd(cgi_log_name);
if (cgi_log_fd == -1) {
WARN("open cgi_log");
free(cgi_log_name);
cgi_log_name = NULL;
cgi_log_fd = 0;
} else {
if (fcntl(cgi_log_fd, F_SETFD, 1) == -1) {
WARN("unable to set close-on-exec flag for cgi_log");
close(cgi_log_fd);
cgi_log_fd = 0;
free(cgi_log_name);
cgi_log_name = NULL;
}
}
}
}
/*
* Name: close_access_log
*
* Description: closes access_log file
*/
void close_access_log(void)
{
if (access_log)
fclose(access_log);
}
/*
* Name: log_access
*
* Description: Writes log data to access_log.
*/
void log_access(request * req)
{
if (access_log) {
if (virtualhost)
fprintf(access_log, "%s ", req->local_ip_addr);
fprintf(access_log, "%s - - %s\"%s\" %d %ld \"%s\" \"%s\"\n",
req->remote_ip_addr,
get_commonlog_time(),
req->logline,
req->response_status,
req->filepos,
(req->header_referer ? req->header_referer : "-"),
(req->header_user_agent ? req->header_user_agent : "-"));
}
}
/*
* Name: log_error_doc
*
* Description: Logs the current time and transaction identification
* to the stderr (the error log):
* should always be followed by an fprintf to stderr
*
* This function used to be implemented with a big fprintf, but not
* all fprintf's are reliable in the face of null string pointers
* (SunOS, in particular). As long as I had to add the checks for
* null pointers, I changed from fprintf to fputs.
*
* Example output:
[08/Nov/1997:01:05:03 -0600] request from 192.228.331.232 "GET /~joeblow/dir/ HTTP/1.0" ("/usr/user1/joeblow/public_html/dir/"): write: Broken pipe
*/
void log_error_doc(request * req)
{
int errno_save = errno;
fprintf(stderr, "%srequest from %s \"%s\" (\"%s\"): ",
get_commonlog_time(),
req->remote_ip_addr,
(req->logline != NULL ?
req->logline : "(null)"),
(req->pathname != NULL ? req->pathname : "(null)"));
errno = errno_save;
}
/*
* Name: boa_perror
*
* Description: logs an error to user and error file both
*
*/
void boa_perror(request * req, char *message)
{
log_error_doc(req);
perror(message); /* don't need to save errno because log_error_doc does */
send_r_error(req);
}
/*
* Name: log_error_time
*
* Description: Logs the current time to the stderr (the error log):
* should always be followed by an fprintf to stderr
*/
void log_error_time()
{
int errno_save = errno;
fputs(get_commonlog_time(), stderr);
errno = errno_save;
}
/*
* Name: log_error_mesg
*
* Description: performs a log_error_time, writes the file and lineno
* to stderr (saving errno), and then a perror with message
*
*/
void log_error_mesg(char *file, int line, char *mesg)
{
int errno_save = errno;
fprintf(stderr, "%s%s:%d - ", get_commonlog_time(), file, line);
errno = errno_save;
perror(mesg);
errno = errno_save;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -