diff options
Diffstat (limited to 'common/core/Logger_file.cxx')
-rw-r--r-- | common/core/Logger_file.cxx | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/common/core/Logger_file.cxx b/common/core/Logger_file.cxx new file mode 100644 index 00000000..b8c72270 --- /dev/null +++ b/common/core/Logger_file.cxx @@ -0,0 +1,123 @@ +/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. + * + * This 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 software 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 software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +// -=- Logger_file.cxx - Logger instance for a file + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <limits.h> +#include <stdlib.h> +#include <string.h> + +#include <core/Logger_file.h> + +using namespace core; + +Logger_File::Logger_File(const char* loggerName) + : Logger(loggerName), indent(13), width(79), m_file(nullptr), + m_lastLogTime(0) +{ + m_filename[0] = '\0'; +} + +Logger_File::~Logger_File() +{ + closeFile(); +} + +void Logger_File::write(int /*level*/, const char *logname, const char *message) +{ + if (!m_file) { + if (m_filename[0] == '\0') + return; + char bakFilename[PATH_MAX]; + if (snprintf(bakFilename, sizeof(bakFilename), + "%s.bak", m_filename) >= (int)sizeof(bakFilename)) { + remove(m_filename); + } else { + remove(bakFilename); + rename(m_filename, bakFilename); + } + m_file = fopen(m_filename, "w+"); + if (!m_file) return; + } + + time_t current = time(nullptr); + if (current != m_lastLogTime) { + m_lastLogTime = current; + fprintf(m_file, "\n%s", ctime(&m_lastLogTime)); + } + + fprintf(m_file," %s:", logname); + int column = strlen(logname) + 2; + if (column < indent) { + fprintf(m_file,"%*s",indent-column,""); + column = indent; + } + while (true) { + const char* s = strchr(message, ' '); + int wordLen; + if (s) wordLen = s-message; + else wordLen = strlen(message); + + if (column + wordLen + 1 > width) { + fprintf(m_file,"\n%*s",indent,""); + column = indent; + } + fprintf(m_file," %.*s",wordLen,message); + column += wordLen + 1; + message += wordLen + 1; + if (!s) break; + } + fprintf(m_file,"\n"); + fflush(m_file); +} + +void Logger_File::setFilename(const char* filename) +{ + closeFile(); + m_filename[0] = '\0'; + if (strlen(filename) >= sizeof(m_filename)) + return; + strcpy(m_filename, filename); +} + +void Logger_File::setFile(FILE* file) +{ + closeFile(); + m_file = file; +} + +void Logger_File::closeFile() +{ + if (m_file) { + fclose(m_file); + m_file = nullptr; + } +} + +static Logger_File logger("file"); + +bool core::initFileLogger(const char* filename) +{ + logger.setFilename(filename); + logger.registerLogger(); + return true; +} |