$search
00001 /* 00002 * RollingFileAppender.cpp 00003 * 00004 * See the COPYING file for the terms of usage and distribution. 00005 */ 00006 00007 #include "PortabilityImpl.hh" 00008 #ifdef LOG4CPP_HAVE_IO_H 00009 # include <io.h> 00010 #endif 00011 #ifdef LOG4CPP_HAVE_UNISTD_H 00012 # include <unistd.h> 00013 #endif 00014 00015 #include <sys/types.h> 00016 #include <sys/stat.h> 00017 #include <fcntl.h> 00018 #include <log4cpp/RollingFileAppender.hh> 00019 #include <log4cpp/Category.hh> 00020 #include <log4cpp/FactoryParams.hh> 00021 #include <memory> 00022 #include <stdio.h> 00023 00024 #ifdef LOG4CPP_HAVE_SSTREAM 00025 #include <sstream> 00026 #endif 00027 00028 namespace log4cpp { 00029 00030 RollingFileAppender::RollingFileAppender(const std::string& name, 00031 const std::string& fileName, 00032 size_t maxFileSize, 00033 unsigned int maxBackupIndex, 00034 bool append, 00035 mode_t mode) : 00036 FileAppender(name, fileName, append, mode), 00037 _maxBackupIndex(maxBackupIndex), 00038 _maxFileSize(maxFileSize) { 00039 } 00040 00041 void RollingFileAppender::setMaxBackupIndex(unsigned int maxBackups) { 00042 _maxBackupIndex = maxBackups; 00043 } 00044 00045 unsigned int RollingFileAppender::getMaxBackupIndex() const { 00046 return _maxBackupIndex; 00047 } 00048 00049 void RollingFileAppender::setMaximumFileSize(size_t maxFileSize) { 00050 _maxFileSize = maxFileSize; 00051 } 00052 00053 size_t RollingFileAppender::getMaxFileSize() const { 00054 return _maxFileSize; 00055 } 00056 00057 void RollingFileAppender::rollOver() { 00058 ::close(_fd); 00059 if (_maxBackupIndex > 0) { 00060 std::ostringstream oldName; 00061 oldName << _fileName << "." << _maxBackupIndex << std::ends; 00062 ::remove(oldName.str().c_str()); 00063 size_t n = _fileName.length() + 1; 00064 for(unsigned int i = _maxBackupIndex; i > 1; i--) { 00065 std::string newName = oldName.str(); 00066 #ifndef LOG4CPP_STLPORT_AND_BOOST_BUILD 00067 oldName.seekp(static_cast<std::ios::off_type>(n), std::ios::beg); 00068 #else 00069 // the direction parameter is broken in STLport 4.5.3, 00070 // so we don't specify it (the code works without it) 00071 oldName.seekp(n); 00072 #endif 00073 oldName << i-1 << std::ends; 00074 ::rename(oldName.str().c_str(), newName.c_str()); 00075 } 00076 ::rename(_fileName.c_str(), oldName.str().c_str()); 00077 } 00078 _fd = ::open(_fileName.c_str(), _flags, _mode); 00079 } 00080 00081 void RollingFileAppender::_append(const LoggingEvent& event) { 00082 FileAppender::_append(event); 00083 off_t offset = ::lseek(_fd, 0, SEEK_END); 00084 if (offset < 0) { 00085 // XXX we got an error, ignore for now 00086 } else { 00087 if(static_cast<size_t>(offset) >= _maxFileSize) { 00088 rollOver(); 00089 } 00090 } 00091 } 00092 00093 std::auto_ptr<Appender> create_roll_file_appender(const FactoryParams& params) 00094 { 00095 std::string name, filename; 00096 bool append = true; 00097 mode_t mode = 664; 00098 int max_file_size = 0, max_backup_index = 0; 00099 params.get_for("rool file appender").required("name", name)("filename", filename)("max_file_size", max_file_size) 00100 ("max_backup_index", max_backup_index) 00101 .optional("append", append)("mode", mode); 00102 00103 return std::auto_ptr<Appender>(new RollingFileAppender(name, filename, max_file_size, max_backup_index, append, mode)); 00104 } 00105 }