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