-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathlogger.cpp
128 lines (104 loc) · 3.29 KB
/
logger.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "settings.h"
#include <ctime>
#include <cstdio>
#include <cstdarg>
#include <stdexcept>
#include <log4cxx/patternlayout.h>
#include "fastcgi2/config.h"
#include "fastcgi2/logger.h"
#include "fastcgi2/component_factory.h"
#include "fastcgi2/request.h"
#include "fastcgi2/stream.h"
#include "logger.h"
#ifdef HAVE_DMALLOC_H
#include <dmalloc.h>
#endif
#if defined(HAVE_VA_COPY)
#define VA_COPY(a,b) va_copy((a), (b))
#elif defined(HAVE_NONSTANDARD_VA_COPY)
#define VA_COPY(a,b) __va_copy((a), (b))
#endif
FCGIDAEMON_REGISTER_FACTORIES_BEGIN()
FCGIDAEMON_ADD_DEFAULT_FACTORY("logger", fastcgi::DefaultLogger)
FCGIDAEMON_REGISTER_FACTORIES_END()
namespace fastcgi
{
DefaultLogger::DefaultLogger(ComponentContext *context)
: Component(context), logger_(log4cxx::Logger::getRootLogger())
{
const Config *config = context->getConfig();
const std::string componentXPath = context->getComponentXPath();
std::string layoutPattern = config->asString(componentXPath + "/pattern", "DEFAULT");
log4cxx::LayoutPtr layout(new log4cxx::PatternLayout(
"DEFAULT" == layoutPattern ? log4cxx::PatternLayout::TTCC_CONVERSION_PATTERN : layoutPattern));
logger_ = log4cxx::Logger::getLogger(config->asString(componentXPath + "/ident"));
const std::string logFileName = config->asString(componentXPath + "/file");
appender_ = log4cxx::helpers::ObjectPtrT<log4cxx::RollingFileAppender>(new log4cxx::RollingFileAppender(layout, logFileName));
appender_->setMaxFileSize("2000MB");
logger_->addAppender(appender_);
setLevel(stringToLevel(config->asString(componentXPath + "/level")));
}
DefaultLogger::~DefaultLogger() {
}
void
DefaultLogger::onLoad() {
}
void
DefaultLogger::onUnload() {
}
void
DefaultLogger::handleRequest(Request *request, HandlerContext *handlerContext) {
request->setContentType("text/plain");
const std::string &action = request->getArg("action");
if ("setlevel" == action) {
const std::string &l = request->getArg("level");
setLevel(stringToLevel(l));
RequestStream(request) << "level " << l << "successfully set" << std::endl;
}
else if ("rollover" == action) {
rollOver();
RequestStream(request) << "rollover successful" << std::endl;
}
else {
RequestStream(request) << "bad action" << std::endl;
}
}
void
DefaultLogger::rollOver() {
appender_->rollOver();
}
void
DefaultLogger::setLevelInternal(const Level level) {
logger_->setLevel(toLog4cxxLevel(level));
}
void
DefaultLogger::log(const Level level, const char *format, va_list args) {
log4cxx::LevelPtr log4cxxLevel = toLog4cxxLevel(level);
if (logger_->isEnabledFor(log4cxxLevel)) {
va_list tmpargs;
VA_COPY(tmpargs, args);
size_t size = vsnprintf(NULL, 0, format, tmpargs);
va_end(tmpargs);
if (size > 0) {
std::vector<char> data(size + 1);
vsnprintf(&data[0], size + 1, format, args);
logger_->log(log4cxxLevel, std::string(data.begin(), data.begin() + size));
}
}
}
log4cxx::LevelPtr
DefaultLogger::toLog4cxxLevel(const Level level) {
switch (level) {
case INFO:
return log4cxx::Level::INFO;
case DEBUG:
return log4cxx::Level::DEBUG;
case ERROR:
return log4cxx::Level::ERROR;
case EMERGENCY:
return log4cxx::Level::FATAL;
default:
throw std::logic_error("toLog4cxxLevel: unknown log level");
}
}
} // namespace fastcgi