サンプル2 testCategory.cpp

 log4cpp::Categoryの使い方です。 1つのカテゴリに複数のアペンダーを設定したり、1つも設定されていないときにどうなるか?など。

関連ファイル
  • testCategory.cpp
ファイルの中身

testCategory.cpp

  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. void testLogva(log4cpp::Category& category,
  11. log4cpp::Priority::Value priority,
  12. const char* stringFormat,
  13. ...)
  14. {
  15. va_list va;
  16. va_start(va, stringFormat);
  17. category.logva(priority, stringFormat, va);
  18. va_end(va);
  19. } /* end testLogva */
  20. void testGetAppender(log4cpp::Category& category,
  21. log4cpp::Appender* appender,
  22. log4cpp::Appender* appender2,
  23. log4cpp::Appender& appender3)
  24. {
  25. // test getAppender() - should return one of the three appenders
  26. log4cpp::Appender *tmpAppender = category.getAppender();
  27. if ((tmpAppender == appender) ||
  28. (tmpAppender == appender2) ||
  29. (tmpAppender == &appender3))
  30. {
  31. std::cout << "tmpAppender == appender or appender2 or appender3" << std::endl;
  32. }
  33. else
  34. {
  35. std::cout << "tmpAppender != appender or appender2 or appender3" << std::endl;
  36. } /* end if-else */
  37. // test getAppender(const std::string& name) const
  38. tmpAppender = category.getAppender("appender2");
  39. if (tmpAppender == appender2)
  40. {
  41. std::cout << "tmpAppender == appender2" << std::endl;
  42. }
  43. else
  44. {
  45. std::cout << "tmpAppender != appender2" << std::endl;
  46. } /* end if-else */
  47. tmpAppender = category.getAppender("appender3");
  48. if (tmpAppender == &appender3)
  49. {
  50. std::cout << "tmpAppender == appender3" << std::endl;
  51. }
  52. else
  53. {
  54. std::cout << "tmpAppender != appender3" << std::endl;
  55. } /* end if-else */
  56. } /* end testGetAppender() */
  57. void testMultiAppenders()
  58. {
  59. log4cpp::Appender* appender =
  60. new log4cpp::OstreamAppender("appender", &std::cout);
  61. log4cpp::Appender* appender2 =
  62. new log4cpp::OstreamAppender("appender2", &std::cout);
  63. log4cpp::OstreamAppender appender3("appender3", &std::cout);
  64. log4cpp::Layout* layout = new log4cpp::BasicLayout();
  65. log4cpp::Layout* layout2 = new log4cpp::BasicLayout();
  66. log4cpp::Layout* layout3 = new log4cpp::BasicLayout();
  67. appender->setLayout(layout);
  68. appender2->setLayout(layout2);
  69. appender3.setLayout(layout3);
  70. // add three appenders to root category
  71. log4cpp::Category& root = log4cpp::Category::getRoot();
  72. root.setPriority(log4cpp::Priority::ERROR);
  73. // clear root's initial appender
  74. root.removeAllAppenders();
  75. root.addAppender(appender);
  76. root.addAppender(appender2);
  77. root.addAppender(appender3);
  78. // dump a message - should see three on the screen
  79. std::cout << "You should see three lines of \"root error #1\"" << std::endl;
  80. root.error("root error #1");
  81. std::cout << "Did you?" << std::endl;
  82. // get getAppender() changes on category with appenders
  83. std::cout << "You should see messages that tmpAppender == other appenders" << std::endl;
  84. testGetAppender(root, appender, appender2, appender3);
  85. std::cout << "Did you?" << std::endl;
  86. // add appender by reference to sub1 category
  87. log4cpp::Category& sub1 =
  88. log4cpp::Category::getInstance(std::string("sub1"));
  89. sub1.addAppender(appender3);
  90. // clear all appenders
  91. root.removeAllAppenders();
  92. sub1.removeAllAppenders();
  93. // dump a message - should not see it on the screen
  94. std::cout << "You should not see any lines of \"root error #2\"" << std::endl;
  95. root.error("root error #2");
  96. std::cout << "Did you?" << std::endl;
  97. // get getAppender() changes on category with no appenders
  98. std::cout << "You should see messages that tmpAppender != other appenders" << std::endl;
  99. testGetAppender(root, appender, appender2, appender3);
  100. std::cout << "Did you?" << std::endl;
  101. // add three appenders to root category
  102. appender = new log4cpp::OstreamAppender("appender", &std::cout);
  103. appender2 = new log4cpp::OstreamAppender("appender2", &std::cout);
  104. root.addAppender(appender);
  105. root.addAppender(appender2);
  106. root.addAppender(appender3);
  107. // test removing valid and invalid
  108. root.removeAppender(appender);
  109. root.removeAppender(appender2);
  110. root.removeAppender(&appender3);
  111. } /* end testMultiAppenders() */
  112. int main(int argc, char** argv) {
  113. testMultiAppenders();
  114. log4cpp::Appender* appender =
  115. new log4cpp::OstreamAppender("default", &std::cout);
  116. log4cpp::Appender* appender2 =
  117. new log4cpp::OstreamAppender("default2", &std::cout);
  118. log4cpp::Layout* layout = new log4cpp::BasicLayout();
  119. log4cpp::Layout* layout2 = new log4cpp::BasicLayout();
  120. appender->setLayout(layout);
  121. appender2->setLayout(layout2);
  122. log4cpp::Category& root = log4cpp::Category::getRoot();
  123. root.addAppender(appender);
  124. root.setPriority(log4cpp::Priority::ERROR);
  125. log4cpp::Category& sub1 =
  126. log4cpp::Category::getInstance(std::string("sub1"));
  127. sub1.addAppender(appender2);
  128. sub1.setAdditivity(false);
  129. log4cpp::Category& sub2 =
  130. log4cpp::Category::getInstance(std::string("sub1.sub2"));
  131. std::cout << " root priority = " << root.getPriority() << std::endl;
  132. std::cout << " sub1 priority = " << sub1.getPriority() << std::endl;
  133. std::cout << " sub2 priority = " << sub2.getPriority() << std::endl;
  134. root.error("root error");
  135. root.warn("root warn");
  136. sub1.error("sub1 error");
  137. sub1.warn("sub1 warn");
  138. sub2.error("sub2 error");
  139. sub2.warn("sub2 warn");
  140. testLogva(root, log4cpp::Priority::EMERG, "This contains %d %s", 2, "variable arguments");
  141. testLogva(root, log4cpp::Priority::ALERT, "This contains %d %s", 2, "variable arguments");
  142. testLogva(root, log4cpp::Priority::CRIT, "This contains %d %s", 2, "variable arguments");
  143. testLogva(root, log4cpp::Priority::ERROR, "This contains %d %s", 2, "variable arguments");
  144. testLogva(root, log4cpp::Priority::WARN, "This contains %d %s", 2, "variable arguments");
  145. testLogva(root, log4cpp::Priority::INFO, "This contains %d %s", 2, "variable arguments");
  146. testLogva(root, log4cpp::Priority::NOTICE, "This contains %d %s", 2, "variable arguments");
  147. testLogva(root, log4cpp::Priority::DEBUG, "This contains %d %s", 2, "variable arguments");
  148. sub1.setPriority(log4cpp::Priority::INFO);
  149. std::cout << " root priority = " << root.getPriority() << std::endl;
  150. std::cout << " sub1 priority = " << sub1.getPriority() << std::endl;
  151. std::cout << " sub2 priority = " << sub2.getPriority() << std::endl;
  152. std::cout << "priority info" << std::endl;
  153. root.error("root error");
  154. root.warn("root warn");
  155. sub1.error("sub1 error");
  156. sub1.warn("sub1 warn");
  157. sub2.error("sub2 error");
  158. sub2.warn("sub2 warn");
  159. sub2.error("%s %s %d", "test", "vform", 123);
  160. sub2.warnStream() << "streamed warn";
  161. sub2 << log4cpp::Priority::WARN << "warn2.." << "..warn3..value=" << 0
  162. << log4cpp::eol << "..warn4";
  163. log4cpp::Category::shutdown();
  164. return 0;
  165. }

実行結果例

 testCategory.cppをビルドし、実行した結果です。なお、実行環境はLinux(Ubuntu 11.0)です。

stdout(標準出力):

You should see three lines of "root error #1"
1336819058 ERROR  : root error #1
1336819058 ERROR  : root error #1
1336819058 ERROR  : root error #1
Did you?
You should see messages that tmpAppender == other appenders
tmpAppender == appender or appender2 or appender3
tmpAppender == appender2
tmpAppender == appender3
Did you?
You should not see any lines of  "root error #2"
Did you?
You should see messages that tmpAppender != other appenders
tmpAppender != appender or appender2 or appender3
tmpAppender != appender2
tmpAppender != appender3
Did you?
 root priority = 300
 sub1 priority = 800
 sub2 priority = 800
1336819058 ERROR  : root error
1336819058 ERROR sub1 : sub1 error
1336819058 ERROR sub1.sub2 : sub2 error
1336819058 FATAL  : This contains 2 variable arguments
1336819058 ALERT  : This contains 2 variable arguments
1336819058 CRIT  : This contains 2 variable arguments
1336819058 ERROR  : This contains 2 variable arguments
 root priority = 300
 sub1 priority = 600
 sub2 priority = 800
priority info
1336819058 ERROR  : root error
1336819058 ERROR sub1 : sub1 error
1336819058 WARN sub1 : sub1 warn
1336819058 ERROR sub1.sub2 : sub2 error
1336819058 WARN sub1.sub2 : sub2 warn
1336819058 ERROR sub1.sub2 : test vform 123
1336819058 WARN sub1.sub2 : streamed warn
1336819058 WARN sub1.sub2 : warn2....warn3..value=0
1336819058 WARN sub1.sub2 : ..warn4