Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
AppenderFile.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "AppenderFile.h"
7#include "Common.h"
8
9#if PLATFORM == PLATFORM_WINDOWS
10# include <Windows.h>
11#endif
12
13AppenderFile::AppenderFile(uint8 id, std::string const& name, LogLevel level, const char* _filename, const char* _logDir, const char* _mode, AppenderFlags _flags, uint64 fileSize) :
15 logfile(NULL),
16 filename(_filename),
17 logDir(_logDir),
18 mode(_mode),
20 fileSize(0)
21{
22 dynamicName = std::string::npos != filename.find("%s");
24
25 logfile = !dynamicName ? OpenFile(_filename, _mode, mode == "w" && backup) : NULL;
26}
27
32
33void AppenderFile::_write(LogMessage const& message)
34{
35 bool exceedMaxSize = maxFileSize > 0 && (fileSize.load() + message.Size()) > maxFileSize;
36
37 if (dynamicName)
38 {
39 char namebuf[SKYFIRE_PATH_MAX];
40 snprintf(namebuf, SKYFIRE_PATH_MAX, filename.c_str(), message.param1.c_str());
41 logfile = OpenFile(namebuf, mode, backup || exceedMaxSize);
42 }
43 else if (exceedMaxSize)
44 logfile = OpenFile(filename, "w", true);
45
46 if (!logfile)
47 return;
48
49 fprintf(logfile, "%s%s", message.prefix.c_str(), message.text.c_str());
50 fflush(logfile);
51 fileSize += uint64(message.Size());
52
53 if (dynamicName)
54 CloseFile();
55}
56
57FILE* AppenderFile::OpenFile(std::string const& filename, std::string const& mode, bool backup)
58{
59 std::string fullName(logDir + filename);
60 if (backup)
61 {
62 CloseFile();
63 std::string newName(fullName);
64 newName.push_back('.');
65 newName.append(LogMessage::getTimeStr(time(NULL)));
66 rename(fullName.c_str(), newName.c_str()); // no error handling... if we couldn't make a backup, just ignore
67 }
68
69 if (FILE* ret = fopen(fullName.c_str(), mode.c_str()))
70 {
71 fileSize = ftell(ret);
72 return ret;
73 }
74
75 return NULL;
76}
77
79{
80 if (logfile)
81 {
82 fclose(logfile);
83 logfile = NULL;
84 }
85}
AppenderType
Definition Appender.h:29
AppenderFlags
Definition Appender.h:37
@ APPENDER_FLAGS_MAKE_FILE_BACKUP
Definition Appender.h:43
LogLevel
Definition Appender.h:16
std::uint8_t uint8
Definition Define.h:79
#define SKYFIRE_PATH_MAX
Definition Define.h:35
std::uint64_t uint64
Definition Define.h:76
std::string mode
FILE * OpenFile(std::string const &_name, std::string const &_mode, bool _backup)
void _write(LogMessage const &message)
AppenderFile(uint8 _id, std::string const &_name, LogLevel level, const char *filename, const char *logDir, const char *mode, AppenderFlags flags, uint64 maxSize)
std::atomic< uint64 > fileSize
std::string filename
uint64 maxFileSize
std::string logDir
std::string name
Definition Appender.h:89
uint8 id
Definition Appender.h:88
LogLevel level
Definition Appender.h:91
Appender(uint8 _id, std::string const &name, AppenderType type=AppenderType::APPENDER_NONE, LogLevel level=LogLevel::LOG_LEVEL_DISABLED, AppenderFlags flags=APPENDER_FLAGS_NONE)
Definition Appender.cpp:24
static std::string getTimeStr(time_t time)
Definition Appender.cpp:10
std::string text
Definition Appender.h:57
uint32 Size() const
@ Returns size of the log message content in bytes
Definition Appender.h:63
std::string param1
Definition Appender.h:59
std::string prefix
Definition Appender.h:58