00001 /* 00002 * Funambol is a mobile platform developed by Funambol, Inc. 00003 * Copyright (C) 2003 - 2007 Funambol, Inc. 00004 * 00005 * This program is free software; you can redistribute it and/or modify it under 00006 * the terms of the GNU Affero General Public License version 3 as published by 00007 * the Free Software Foundation with the addition of the following permission 00008 * added to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED 00009 * WORK IN WHICH THE COPYRIGHT IS OWNED BY FUNAMBOL, FUNAMBOL DISCLAIMS THE 00010 * WARRANTY OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. 00011 * 00012 * This program is distributed in the hope that it will be useful, but WITHOUT 00013 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00014 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 00015 * details. 00016 * 00017 * You should have received a copy of the GNU Affero General Public License 00018 * along with this program; if not, see http://www.gnu.org/licenses or write to 00019 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 00020 * MA 02110-1301 USA. 00021 * 00022 * You can contact Funambol, Inc. headquarters at 643 Bair Island Road, Suite 00023 * 305, Redwood City, CA 94063, USA, or at email address info@funambol.com. 00024 * 00025 * The interactive user interfaces in modified source and object code versions 00026 * of this program must display Appropriate Legal Notices, as required under 00027 * Section 5 of the GNU Affero General Public License version 3. 00028 * 00029 * In accordance with Section 7(b) of the GNU Affero General Public License 00030 * version 3, these Appropriate Legal Notices must retain the display of the 00031 * "Powered by Funambol" logo. If the display of the logo is not reasonably 00032 * feasible for technical reasons, the Appropriate Legal Notices must display 00033 * the words "Powered by Funambol". 00034 */ 00035 00036 #ifndef INCL_POSIX_LOG 00037 # define INCL_POSIX_LOG 00038 /** @cond DEV */ 00039 00040 #include <base/fscapi.h> 00041 #include <base/Log.h> 00042 #include "base/util/StringBuffer.h" 00043 00044 #include <stdio.h> 00045 #include <time.h> 00046 #include "base/globalsdef.h" 00047 00048 BEGIN_NAMESPACE 00049 00050 /** 00051 * extended API, can only be used if it is certain that 00052 * Log::instance() returns a POSIXLog 00053 */ 00054 class POSIXLog : public Log { 00055 public: 00056 00057 POSIXLog(); 00058 ~POSIXLog(); 00059 00060 /** 00061 * Opens the specified file for logging of messages. 00062 * 00063 * By default the LOG instance of the Log class will 00064 * create the file specified via its set methods 00065 * as soon as the first message needs to be printed or 00066 * when explicitly asking for a reset. 00067 * 00068 * By calling this function instead one gets more detailed 00069 * control over logging and avoids the (currently) insecurely 00070 * implemented handling of file name strings in the Log class. 00071 * 00072 * @param path directory where file is to be created, can be NULL 00073 * @param name file name relative to path or "-" when asking for 00074 * logging to stdout 00075 * @param redirectStderr if true, then file descriptor 2 (stderr) 00076 * will also be redirected into the log file; 00077 * the original stderr is preserved and will be 00078 * restored when turning this redirection off 00079 */ 00080 virtual void setLogFile(const char *path, const char* name, bool redirectStderr = false); 00081 00082 /** 00083 * returns active log file or NULL if none set (e.g. if logging to stdout directly) 00084 */ 00085 virtual FILE *getLogFile() { return logFile; } 00086 00087 /** 00088 * if a client developer wants to ignore the prefix, he can 00089 * derive his own Log implementation from POSIXLog, override this 00090 * call and then install his implementation via Log::setLogger() 00091 */ 00092 virtual void setPrefix(const char *prefix) { this->prefix = prefix ? prefix : ""; } 00093 virtual const StringBuffer &getPrefix() const { return prefix; } 00094 00095 virtual void setLogPath(const char* configLogPath); 00096 virtual void setLogName(const char* configLogName); 00097 virtual void error(const char* msg, ...); 00098 virtual void info(const char* msg, ...); 00099 virtual void developer(const char* msg, ...); 00100 virtual void debug(const char* msg, ...); 00101 virtual void reset(const char* title = NULL); 00102 virtual size_t getLogSize(); 00103 00104 protected: 00105 /** 00106 * Prints a single line to the current log file. 00107 * Can be overridden by derived class to also print 00108 * in a different way. 00109 * 00110 * @param firstLine true if this is the first line of a new message 00111 * @param time unformatted time stamp for line 00112 * @param fullTime a time string including date and GMT offset 00113 * @param shortTime a time string including just the local time of day in 00114 * the preferred time format according to the current locale 00115 * @param utcTime a time string including just the UTC time of day in "hh:mm:ss UTC" format 00116 * @param level the severity of the report 00117 * @param levelPrefix a string representing the severity (may differ from level, e.g. for Log::developer()) 00118 * @param line the actual message string 00119 */ 00120 virtual void printLine(bool firstLine, 00121 time_t time, 00122 const char *fullTime, 00123 const char *shortTime, 00124 const char *utcTime, 00125 LogLevel level, 00126 const char *levelPrefix, 00127 const char *line); 00128 00129 private: 00130 FILE* logFile; 00131 bool logFileStdout; 00132 StringBuffer logName; 00133 StringBuffer logPath; 00134 bool logRedirectStderr; 00135 00136 /** a copy of stderr before it was redirected */ 00137 int fderr; 00138 00139 /** 00140 * additional prefix for each line 00141 */ 00142 StringBuffer prefix; 00143 00144 void printMessage(LogLevel level, const char* levelPrefix, const char* msg, va_list argList); 00145 }; 00146 00147 #define POSIX_LOG ((POSIXLog &)Log::instance()) 00148 00149 00150 END_NAMESPACE 00151 00152 /** @endcond */ 00153 #endif