/*
- * $Id$
- *
- * DEBUG: section 50 Log file handling
- * AUTHOR: Duane Wessels
- *
- * SQUID Web Proxy Cache http://www.squid-cache.org/
- * ----------------------------------------------------------
- *
- * Squid is the result of efforts by numerous individuals from
- * the Internet community; see the CONTRIBUTORS file for full
- * details. Many organizations have provided support for Squid's
- * development; see the SPONSORS file for full details. Squid is
- * Copyrighted (C) 2001 by the Regents of the University of
- * California; see the COPYRIGHT file for full details. Squid
- * incorporates software developed and/or copyrighted by other
- * sources; see the CREDITS file for full details.
- *
- * 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 2 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
*
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
*/
+/* DEBUG: section 50 Log file handling */
+
#include "squid.h"
+#include "fatal.h"
#include "fde.h"
#include "log/File.h"
#include "log/ModDaemon.h"
#include "log/ModStdio.h"
#include "log/ModSyslog.h"
#include "log/ModUdp.h"
-
-CBDATA_TYPE(Logfile);
+#include "log/TcpLogger.h"
+#include "sbuf/SBuf.h"
+
+CBDATA_CLASS_INIT(Logfile);
+
+Logfile::Logfile(const char *aPath) :
+ sequence_number(0),
+ data(NULL),
+ f_linestart(NULL),
+ f_linewrite(NULL),
+ f_lineend(NULL),
+ f_flush(NULL),
+ f_rotate(NULL),
+ f_close(NULL)
+{
+ xstrncpy(path, aPath, sizeof(path));
+ flags.fatal = 0;
+}
Logfile *
logfileOpen(const char *path, size_t bufsz, int fatal_flag)
int ret;
const char *patharg;
- debugs(50, 1, "Logfile: opening log " << path);
- CBDATA_INIT_TYPE(Logfile);
+ debugs(50, DBG_IMPORTANT, "Logfile: opening log " << path);
- Logfile *lf = cbdataAlloc(Logfile);
- xstrncpy(lf->path, path, MAXPATHLEN);
+ Logfile *lf = new Logfile(path);
patharg = path;
/* need to call the per-logfile-type code */
if (strncmp(path, "stdio:", 6) == 0) {
} else if (strncmp(path, "daemon:", 7) == 0) {
patharg = path + 7;
ret = logfile_mod_daemon_open(lf, patharg, bufsz, fatal_flag);
+ } else if (strncmp(path, "tcp:", 4) == 0) {
+ patharg = path + 4;
+ ret = Log::TcpLogger::Open(lf, patharg, bufsz, fatal_flag);
} else if (strncmp(path, "udp:", 4) == 0) {
patharg = path + 4;
ret = logfile_mod_udp_open(lf, patharg, bufsz, fatal_flag);
ret = logfile_mod_syslog_open(lf, patharg, bufsz, fatal_flag);
#endif
} else {
+ debugs(50, DBG_IMPORTANT, "WARNING: log name now starts with a module name. Use 'stdio:" << patharg << "'");
+ snprintf(lf->path, MAXPATHLEN, "stdio:%s", patharg);
ret = logfile_mod_stdio_open(lf, patharg, bufsz, fatal_flag);
}
if (!ret) {
if (fatal_flag)
- fatalf("logfileOpen: path %s: couldn't open!\n", path);
+ fatalf("logfileOpen: %s: couldn't open!\n", path);
else
- debugs(50, 1, "logfileOpen: path " << path << ": couldn't open!");
+ debugs(50, DBG_IMPORTANT, "logfileOpen: " << path << ": couldn't open!");
lf->f_close(lf);
- cbdataFree(lf);
+ delete lf;
return NULL;
}
assert(lf->data != NULL);
void
logfileClose(Logfile * lf)
{
- debugs(50, 1, "Logfile: closing log " << lf->path);
+ debugs(50, DBG_IMPORTANT, "Logfile: closing log " << lf->path);
lf->f_flush(lf);
lf->f_close(lf);
- cbdataFree(lf);
+ delete lf;
}
void
-logfileRotate(Logfile * lf)
+logfileRotate(Logfile * lf, int16_t rotateCount)
{
- debugs(50, 1, "logfileRotate: " << lf->path);
- lf->f_rotate(lf);
+ debugs(50, DBG_IMPORTANT, "logfileRotate: " << lf->path);
+ lf->f_rotate(lf, rotateCount);
}
void
-logfileWrite(Logfile * lf, char *buf, size_t len)
+logfileWrite(Logfile * lf, const char *buf, size_t len)
{
lf->f_linewrite(lf, buf, len);
}
logfilePrintf(Logfile * lf, const char *fmt,...)
{
va_list args;
- char buf[8192];
- int s;
-
va_start(args, fmt);
-
- s = vsnprintf(buf, 8192, fmt, args);
-
- if (s > 8192) {
- s = 8192;
-
- if (fmt[strlen(fmt) - 1] == '\n')
- buf[8191] = '\n';
- }
-
- logfileWrite(lf, buf, (size_t) s);
+ static SBuf sbuf;
+ sbuf.clear();
+ sbuf.vappendf(fmt, args); // Throws on overflow. TODO: handle that better
+ logfileWrite(lf, sbuf.c_str(), sbuf.length());
va_end(args);
}
logfileLineEnd(Logfile * lf)
{
lf->f_lineend(lf);
- lf->sequence_number++;
+ ++ lf->sequence_number;
}
void
{
lf->f_flush(lf);
}
+