GeNN  4.0.0
GPU enhanced Neuronal Networks (GeNN)
RollingFileAppender.h
Go to the documentation of this file.
1 #pragma once
4 #include <plog/Util.h>
5 #include <algorithm>
6 
7 namespace plog
8 {
9  template<class Formatter, class Converter = UTF8Converter>
11  {
12  public:
13  RollingFileAppender(const util::nchar* fileName, size_t maxFileSize = 0, int maxFiles = 0)
14  : m_fileSize()
15  , m_maxFileSize((std::max)(static_cast<off_t>(maxFileSize), static_cast<off_t>(1000))) // set a lower limit for the maxFileSize
16  , m_maxFiles(maxFiles)
17  , m_firstWrite(true)
18  {
19  util::splitFileName(fileName, m_fileNameNoExt, m_fileExt);
20  }
21 
22 #ifdef _WIN32
23  RollingFileAppender(const char* fileName, size_t maxFileSize = 0, int maxFiles = 0)
24  : m_fileSize()
25  , m_maxFileSize((std::max)(static_cast<off_t>(maxFileSize), static_cast<off_t>(1000))) // set a lower limit for the maxFileSize
26  , m_maxFiles(maxFiles)
27  , m_firstWrite(true)
28  {
29  util::splitFileName(util::toWide(fileName).c_str(), m_fileNameNoExt, m_fileExt);
30  }
31 #endif
32 
33  virtual void write(const Record& record)
34  {
35  util::MutexLock lock(m_mutex);
36 
37  if (m_firstWrite)
38  {
39  openLogFile();
40  m_firstWrite = false;
41  }
42  else if (m_maxFiles > 0 && m_fileSize > m_maxFileSize && -1 != m_fileSize)
43  {
44  rollLogFiles();
45  }
46 
47  int bytesWritten = m_file.write(Converter::convert(Formatter::format(record)));
48 
49  if (bytesWritten > 0)
50  {
51  m_fileSize += bytesWritten;
52  }
53  }
54 
55  void rollLogFiles()
56  {
57  m_file.close();
58 
59  util::nstring lastFileName = buildFileName(m_maxFiles - 1);
60  util::File::unlink(lastFileName.c_str());
61 
62  for (int fileNumber = m_maxFiles - 2; fileNumber >= 0; --fileNumber)
63  {
64  util::nstring currentFileName = buildFileName(fileNumber);
65  util::nstring nextFileName = buildFileName(fileNumber + 1);
66 
67  util::File::rename(currentFileName.c_str(), nextFileName.c_str());
68  }
69 
70  openLogFile();
71  m_firstWrite = false;
72  }
73 
74  private:
75  void openLogFile()
76  {
77  util::nstring fileName = buildFileName();
78  m_fileSize = m_file.open(fileName.c_str());
79 
80  if (0 == m_fileSize)
81  {
82  int bytesWritten = m_file.write(Converter::header(Formatter::header()));
83 
84  if (bytesWritten > 0)
85  {
86  m_fileSize += bytesWritten;
87  }
88  }
89  }
90 
91  util::nstring buildFileName(int fileNumber = 0)
92  {
94  ss << m_fileNameNoExt;
95 
96  if (fileNumber > 0)
97  {
98  ss << '.' << fileNumber;
99  }
100 
101  if (!m_fileExt.empty())
102  {
103  ss << '.' << m_fileExt;
104  }
105 
106  return ss.str();
107  }
108 
109  private:
110  util::Mutex m_mutex;
111  util::File m_file;
112  off_t m_fileSize;
113  const off_t m_maxFileSize;
114  const int m_maxFiles;
115  util::nstring m_fileExt;
116  util::nstring m_fileNameNoExt;
117  bool m_firstWrite;
118  };
119 }
Definition: AndroidAppender.h:5
Definition: Util.h:247
void close()
Definition: Util.h:300
void splitFileName(const nchar *fileName, nstring &fileNameNoExt, nstring &fileExt)
Definition: Util.h:219
Definition: RollingFileAppender.h:10
static int rename(const nchar *oldFilename, const nchar *newFilename)
Definition: Util.h:322
STL namespace.
char nchar
Definition: Util.h:59
Definition: Util.h:335
std::ostringstream nostringstream
Definition: Util.h:57
int write(const void *buf, size_t count)
Definition: Util.h:276
static int unlink(const nchar *fileName)
Definition: Util.h:313
std::string nstring
Definition: Util.h:56
off_t open(const nchar *fileName)
Definition: Util.h:264
Definition: Util.h:396
RollingFileAppender(const util::nchar *fileName, size_t maxFileSize=0, int maxFiles=0)
Definition: RollingFileAppender.h:13
Definition: Record.h:102
void rollLogFiles()
Definition: RollingFileAppender.h:55
Definition: IAppender.h:6
virtual void write(const Record &record)
Definition: RollingFileAppender.h:33