Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "PortabilityImpl.hh"
00011 #ifdef LOG4CPP_HAVE_IO_H
00012 # include <io.h>
00013 #endif
00014 #ifdef LOG4CPP_HAVE_UNISTD_H
00015 # include <unistd.h>
00016 #endif
00017
00018 #include <memory>
00019 #include <stdio.h>
00020 #include <time.h>
00021 #include <log4cpp/FileAppender.hh>
00022 #include <log4cpp/Category.hh>
00023 #include <log4cpp/FactoryParams.hh>
00024
00025 namespace log4cpp {
00026
00027 FileAppender::FileAppender(const std::string& name,
00028 const std::string& fileName,
00029 bool append,
00030 mode_t mode) :
00031 LayoutAppender(name),
00032 _fileName(fileName),
00033 #ifdef __APPLE__
00034 _flags(O_CREAT | O_APPEND | O_WRONLY),
00035 #else
00036 _flags(O_CREAT | O_APPEND | O_WRONLY | O_LARGEFILE),
00037 #endif
00038 _mode(mode) {
00039 if (!append)
00040 _flags |= O_TRUNC;
00041 _fd = ::open(_fileName.c_str(), _flags, _mode);
00042 }
00043
00044 FileAppender::FileAppender(const std::string& name, int fd) :
00045 LayoutAppender(name),
00046 _fileName(""),
00047 _fd(fd),
00048 #ifdef __APPLE__
00049 _flags(O_CREAT | O_APPEND | O_WRONLY),
00050 #else
00051 _flags(O_CREAT | O_APPEND | O_WRONLY | O_LARGEFILE),
00052 #endif
00053 _mode(00644) {
00054 }
00055
00056 FileAppender::~FileAppender() {
00057 close();
00058 }
00059
00060 void FileAppender::close() {
00061 if (_fd!=-1) {
00062 ::close(_fd);
00063 _fd=-1;
00064 }
00065 }
00066
00067 void FileAppender::setAppend(bool append) {
00068 if (append) {
00069 _flags &= ~O_TRUNC;
00070 } else {
00071 _flags |= O_TRUNC;
00072 }
00073 }
00074
00075 bool FileAppender::getAppend() const {
00076 return (_flags & O_TRUNC) == 0;
00077 }
00078
00079 void FileAppender::setMode(mode_t mode) {
00080 _mode = mode;
00081 }
00082
00083 mode_t FileAppender::getMode() const {
00084 return _mode;
00085 }
00086
00087 void FileAppender::_append(const LoggingEvent& event) {
00088 std::string message(_getLayout().format(event));
00089 if (!::write(_fd, message.data(), message.length())) {
00090
00091 }
00092 }
00093
00094 bool FileAppender::reopen() {
00095 if (_fileName != "") {
00096 int fd = ::open(_fileName.c_str(), _flags, _mode);
00097 if (fd < 0)
00098 return false;
00099 else {
00100 if (_fd != -1)
00101 ::close(_fd);
00102 _fd = fd;
00103 return true;
00104 }
00105 } else {
00106 return true;
00107 }
00108 }
00109
00110 std::auto_ptr<Appender> create_file_appender(const FactoryParams& params)
00111 {
00112 std::string name, filename;
00113 bool append = true;
00114 mode_t mode = 664;
00115
00116 params.get_for("file appender").required("name", name)("filename", filename)
00117 .optional("append", append)("mode", mode);
00118
00119 return std::auto_ptr<Appender>(new FileAppender(name, filename, append, mode));
00120 }
00121 }