1 // testDLL.cpp
2
3 #include <stdio.h>
4 #include <iostream>
5 #include <log4cpp/Category.hh>
6 #include <log4cpp/Appender.hh>
7 #include <log4cpp/OstreamAppender.hh>
8 #include <log4cpp/Layout.hh>
9 #include <log4cpp/BasicLayout.hh>
10 #include <log4cpp/Priority.hh>
11 #include <log4cpp/NDC.hh>
12
13
testLogva(log4cpp::Category & category,log4cpp::Priority::Value priority,const char * stringFormat,...)14 void testLogva(log4cpp::Category& category,
15 log4cpp::Priority::Value priority,
16 const char* stringFormat,
17 ...)
18 {
19 va_list va;
20 va_start(va, stringFormat);
21 category.logva(priority, stringFormat, va);
22 va_end(va);
23 } /* end testLogva */
24
testGetAppender(log4cpp::Category & category,log4cpp::Appender * appender,log4cpp::Appender * appender2,log4cpp::Appender & appender3)25 void testGetAppender(log4cpp::Category& category,
26 log4cpp::Appender* appender,
27 log4cpp::Appender* appender2,
28 log4cpp::Appender& appender3)
29 {
30 // test getAppender() - should return one of the three appenders
31 log4cpp::Appender *tmpAppender = category.getAppender();
32 if ((tmpAppender == appender) ||
33 (tmpAppender == appender2) ||
34 (tmpAppender == &appender3))
35 {
36 std::cout << "tmpAppender == appender or appender2 or appender3" << std::endl;
37 }
38 else
39 {
40 std::cout << "tmpAppender != appender or appender2 or appender3" << std::endl;
41 } /* end if-else */
42
43 // test getAppender(const std::string& name) const
44 tmpAppender = category.getAppender("appender2");
45 if (tmpAppender == appender2)
46 {
47 std::cout << "tmpAppender == appender2" << std::endl;
48 }
49 else
50 {
51 std::cout << "tmpAppender != appender2" << std::endl;
52 } /* end if-else */
53
54 tmpAppender = category.getAppender("appender3");
55 if (tmpAppender == &appender3)
56 {
57 std::cout << "tmpAppender == appender3" << std::endl;
58 }
59 else
60 {
61 std::cout << "tmpAppender != appender3" << std::endl;
62 } /* end if-else */
63
64 } /* end testGetAppender() */
65
testMultiAppenders()66 void testMultiAppenders()
67 {
68 log4cpp::Appender* appender =
69 new log4cpp::OstreamAppender("appender", &std::cout);
70
71 log4cpp::Appender* appender2 =
72 new log4cpp::OstreamAppender("appender2", &std::cout);
73
74 log4cpp::OstreamAppender appender3("appender3", &std::cout);
75
76 log4cpp::Layout* layout = new log4cpp::BasicLayout();
77 log4cpp::Layout* layout2 = new log4cpp::BasicLayout();
78 log4cpp::Layout* layout3 = new log4cpp::BasicLayout();
79
80 appender->setLayout(layout);
81 appender2->setLayout(layout2);
82 appender3.setLayout(layout3);
83
84 // add three appenders to root category
85 log4cpp::Category& root = log4cpp::Category::getRoot();
86 root.setPriority(log4cpp::Priority::ERROR);
87
88 // clear root's initial appender
89 root.removeAllAppenders();
90
91 root.addAppender(appender);
92 root.addAppender(appender2);
93 root.addAppender(appender3);
94
95 // dump a message - should see three on the screen
96 std::cout << "You should see three lines of \"root error #1\"" << std::endl;
97 root.error("root error #1");
98 std::cout << "Did you?" << std::endl;
99
100 // get getAppender() changes on category with appenders
101 std::cout << "You should see messages that tmpAppender == other appenders" << std::endl;
102 testGetAppender(root, appender, appender2, appender3);
103 std::cout << "Did you?" << std::endl;
104
105 // add appender by reference to sub1 category
106 log4cpp::Category& sub1 =
107 log4cpp::Category::getInstance(std::string("sub1"));
108 sub1.addAppender(appender3);
109
110 // clear all appenders
111 root.removeAllAppenders();
112 sub1.removeAllAppenders();
113
114 // dump a message - should not see it on the screen
115 std::cout << "You should not see any lines of \"root error #2\"" << std::endl;
116 root.error("root error #2");
117 std::cout << "Did you?" << std::endl;
118
119 // get getAppender() changes on category with no appenders
120 std::cout << "You should see messages that tmpAppender != other appenders" << std::endl;
121 testGetAppender(root, appender, appender2, appender3);
122 std::cout << "Did you?" << std::endl;
123
124
125 // add three appenders to root category
126 appender = new log4cpp::OstreamAppender("appender", &std::cout);
127 appender2 = new log4cpp::OstreamAppender("appender2", &std::cout);
128 root.addAppender(appender);
129 root.addAppender(appender2);
130 root.addAppender(appender3);
131
132 // test removing valid and invalid
133 root.removeAppender(appender);
134 root.removeAppender(appender2);
135 root.removeAppender(&appender3);
136
137 } /* end testMultiAppenders() */
138
139
main(int argc,char ** argv)140 int main(int argc, char** argv) {
141
142 testMultiAppenders();
143
144 log4cpp::Appender* appender =
145 new log4cpp::OstreamAppender("default", &std::cout);
146
147 log4cpp::Appender* appender2 =
148 new log4cpp::OstreamAppender("default2", &std::cout);
149
150 log4cpp::Layout* layout = new log4cpp::BasicLayout();
151 log4cpp::Layout* layout2 = new log4cpp::BasicLayout();
152
153 appender->setLayout(layout);
154 appender2->setLayout(layout2);
155
156 log4cpp::Category& root = log4cpp::Category::getRoot();
157 root.addAppender(appender);
158 root.setPriority(log4cpp::Priority::ERROR);
159
160 log4cpp::Category& sub1 =
161 log4cpp::Category::getInstance(std::string("sub1"));
162 sub1.addAppender(appender2);
163 sub1.setAdditivity(false);
164
165 log4cpp::Category& sub2 =
166 log4cpp::Category::getInstance(std::string("sub1.sub2"));
167
168 std::cout << " root priority = " << root.getPriority() << std::endl;
169 std::cout << " sub1 priority = " << sub1.getPriority() << std::endl;
170 std::cout << " sub2 priority = " << sub2.getPriority() << std::endl;
171
172 root.error("root error");
173 root.warn("root warn");
174 sub1.error("sub1 error");
175 sub1.warn("sub1 warn");
176 sub2.error("sub2 error");
177 sub2.warn("sub2 warn");
178
179 testLogva(root, log4cpp::Priority::EMERG, "This contains %d %s", 2, "variable arguments");
180 testLogva(root, log4cpp::Priority::ALERT, "This contains %d %s", 2, "variable arguments");
181 testLogva(root, log4cpp::Priority::CRIT, "This contains %d %s", 2, "variable arguments");
182 testLogva(root, log4cpp::Priority::ERROR, "This contains %d %s", 2, "variable arguments");
183 testLogva(root, log4cpp::Priority::WARN, "This contains %d %s", 2, "variable arguments");
184 testLogva(root, log4cpp::Priority::INFO, "This contains %d %s", 2, "variable arguments");
185 testLogva(root, log4cpp::Priority::NOTICE, "This contains %d %s", 2, "variable arguments");
186 testLogva(root, log4cpp::Priority::DEBUG, "This contains %d %s", 2, "variable arguments");
187
188 sub1.setPriority(log4cpp::Priority::INFO);
189 std::cout << " root priority = " << root.getPriority() << std::endl;
190 std::cout << " sub1 priority = " << sub1.getPriority() << std::endl;
191 std::cout << " sub2 priority = " << sub2.getPriority() << std::endl;
192
193 std::cout << "priority info" << std::endl;
194 root.error("root error");
195 root.warn("root warn");
196 sub1.error("sub1 error");
197 sub1.warn("sub1 warn");
198 sub2.error("sub2 error");
199 sub2.warn("sub2 warn");
200 sub2.error("%s %s %d", "test", "vform", 123);
201 sub2.warnStream() << "streamed warn";
202
203 sub2 << log4cpp::Priority::WARN << "warn2.." << "..warn3..value=" << 0
204 << log4cpp::eol << "..warn4";
205
206 for (int i = 0; i < 10; i++) {
207 char nm[10];
208 sprintf(nm, "subs%d", i);
209 log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string(nm));
210 log4cpp::Appender* appender2 =
211 new log4cpp::OstreamAppender("default2", &std::cout);
212 sub1.addAppender(appender2);
213 sub1.setAdditivity(false);
214 }
215
216 std::vector<log4cpp::Category*>* allCats;
217 std::vector<log4cpp::Category*>::const_iterator iter;
218 allCats = log4cpp::Category::getCurrentCategories();
219 // remove all appenders from all categories
220 for (iter = allCats->begin(); iter != allCats->end(); iter++) {
221 (*iter)->removeAllAppenders();
222 }
223
224 log4cpp::Category::shutdown();
225
226 return 0;
227 }
228