サンプル7 testmain.cpp

 いろいろなAppenderを使ったサンプルです。カテゴリも複数使用しています。 恐らく、最も最初に見ることとなるサンプルでしょう。

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

testmain.cpp

  1. #include <stdio.h>
  2. #include "log4cpp/Portability.hh"
  3. #ifdef LOG4CPP_HAVE_UNISTD_H
  4. #include <unistd.h>
  5. #endif
  6. #include <iostream>
  7. #include "log4cpp/Category.hh"
  8. #include "log4cpp/Appender.hh"
  9. #include "log4cpp/FileAppender.hh"
  10. #include "log4cpp/OstreamAppender.hh"
  11. #ifdef LOG4CPP_HAVE_SYSLOG
  12. #include "log4cpp/SyslogAppender.hh"
  13. #endif
  14. #include "log4cpp/Layout.hh"
  15. #include "log4cpp/BasicLayout.hh"
  16. #include "log4cpp/Priority.hh"
  17. #include "log4cpp/NDC.hh"
  18. int main(int argc, char** argv) {
  19. log4cpp::Appender* appender;
  20. #ifdef LOG4CPP_HAVE_SYSLOG
  21. log4cpp::SyslogAppender* syslogAppender;
  22. syslogAppender = new log4cpp::SyslogAppender("syslog", "log4cpp");
  23. #else
  24. log4cpp::Appender* syslogAppender;
  25. syslogAppender = new log4cpp::OstreamAppender("syslogdummy", &std::cout);
  26. #endif
  27. if (argc < 2) {
  28. appender = new log4cpp::OstreamAppender("default", &std::cout);
  29. } else {
  30. appender = new log4cpp::FileAppender("default", argv[1]);
  31. }
  32. syslogAppender->setLayout(new log4cpp::BasicLayout());
  33. appender->setLayout(new log4cpp::BasicLayout());
  34. log4cpp::Category& root = log4cpp::Category::getRoot();
  35. root.addAppender(syslogAppender);
  36. root.setPriority(log4cpp::Priority::ERROR);
  37. log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
  38. sub1.addAppender(appender);
  39. log4cpp::Category& sub2 = log4cpp::Category::getInstance(std::string("sub1.sub2"));
  40. log4cpp::NDC::push(std::string("ndc1"));
  41. std::cout << " root prio = " << root.getPriority() << std::endl;
  42. std::cout << " sub1 prio = " << sub1.getPriority() << std::endl;
  43. std::cout << " sub2 prio = " << sub2.getPriority() << std::endl;
  44. root.error("root error");
  45. root.warn("root warn");
  46. sub1.error("sub1 error");
  47. sub1.warn("sub1 warn");
  48. sub2.error("sub2 error");
  49. sub2.warn("sub2 warn");
  50. sub1.setPriority(log4cpp::Priority::INFO);
  51. std::cout << " root prio = " << root.getPriority() << std::endl;
  52. std::cout << " sub1 prio = " << sub1.getPriority() << std::endl;
  53. std::cout << " sub2 prio = " << sub2.getPriority() << std::endl;
  54. std::cout << "priority info" << std::endl;
  55. root.error("root error");
  56. root.warn("root warn");
  57. sub1.error("sub1 error");
  58. sub1.warn("sub1 warn");
  59. sub2.error("sub2 error");
  60. sub2.warn("sub2 warn");
  61. sub2.warnStream() << "streamed warn";
  62. sub2 << log4cpp::Priority::WARN << "warn2" << " warn3"
  63. << log4cpp::eol << " warn4";
  64. {
  65. for(int i = 0; i < 10000; i++) {
  66. char ndc2[20];
  67. sprintf(ndc2, "i=%d", i);
  68. log4cpp::NDC::push(ndc2);
  69. sub1.info("%s%d", "i = ", i);
  70. if ((i % 10) == 0) {
  71. sub1.log(log4cpp::Priority::NOTICE, "reopen log");
  72. if (log4cpp::Appender::reopenAll()) {
  73. sub1.info("log reopened");
  74. } else {
  75. sub1.warn("could not reopen log");
  76. }
  77. }
  78. #ifndef WIN32
  79. sleep(1);
  80. #endif
  81. log4cpp::NDC::pop();
  82. }
  83. }
  84. return 0;
  85. }

実行結果例

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

 root prio = 300
 sub1 prio = 800
 sub2 prio = 800
1336867395 ERROR sub1 ndc1: sub1 error
1336867395 ERROR sub1.sub2 ndc1: sub2 error
 root prio = 300
 sub1 prio = 600
 sub2 prio = 800
priority info
1336867395 ERROR sub1 ndc1: sub1 error
1336867395 WARN sub1 ndc1: sub1 warn
1336867395 ERROR sub1.sub2 ndc1: sub2 error
1336867395 WARN sub1.sub2 ndc1: sub2 warn
1336867395 WARN sub1.sub2 ndc1: streamed warn
1336867395 WARN sub1.sub2 ndc1: warn2 warn3
1336867395 WARN sub1.sub2 ndc1:  warn4
1336867395 INFO sub1 ndc1 i=0: i = 0
1336867395 NOTICE sub1 ndc1 i=0: reopen log
1336867395 INFO sub1 ndc1 i=0: log reopened
1336867396 INFO sub1 ndc1 i=1: i = 1
1336867397 INFO sub1 ndc1 i=2: i = 2
1336867398 INFO sub1 ndc1 i=3: i = 3
1336867399 INFO sub1 ndc1 i=4: i = 4
1336867400 INFO sub1 ndc1 i=5: i = 5
1336867401 INFO sub1 ndc1 i=6: i = 6
1336867402 INFO sub1 ndc1 i=7: i = 7
1336867403 INFO sub1 ndc1 i=8: i = 8
1336867404 INFO sub1 ndc1 i=9: i = 9
1336867405 INFO sub1 ndc1 i=10: i = 10
1336867405 NOTICE sub1 ndc1 i=10: reopen log
1336867405 INFO sub1 ndc1 i=10: log reopened
1336867406 INFO sub1 ndc1 i=11: i = 11
1336867407 INFO sub1 ndc1 i=12: i = 12
1336867408 INFO sub1 ndc1 i=13: i = 13
1336867409 INFO sub1 ndc1 i=14: i = 14
1336867410 INFO sub1 ndc1 i=15: i = 15
1336867411 INFO sub1 ndc1 i=16: i = 16
1336867412 INFO sub1 ndc1 i=17: i = 17
1336867413 INFO sub1 ndc1 i=18: i = 18
1336867414 INFO sub1 ndc1 i=19: i = 19
1336867415 INFO sub1 ndc1 i=20: i = 20
1336867415 NOTICE sub1 ndc1 i=20: reopen log
1336867415 INFO sub1 ndc1 i=20: log reopened
1336867416 INFO sub1 ndc1 i=21: i = 21
1336867417 INFO sub1 ndc1 i=22: i = 22
1336867418 INFO sub1 ndc1 i=23: i = 23
1336867419 INFO sub1 ndc1 i=24: i = 24
1336867420 INFO sub1 ndc1 i=25: i = 25
1336867421 INFO sub1 ndc1 i=26: i = 26
1336867422 INFO sub1 ndc1 i=27: i = 27
1336867423 INFO sub1 ndc1 i=28: i = 28
1336867424 INFO sub1 ndc1 i=29: i = 29
1336867425 INFO sub1 ndc1 i=30: i = 30
1336867425 NOTICE sub1 ndc1 i=30: reopen log
1336867425 INFO sub1 ndc1 i=30: log reopened
1336867426 INFO sub1 ndc1 i=31: i = 31
1336867427 INFO sub1 ndc1 i=32: i = 32
1336867428 INFO sub1 ndc1 i=33: i = 33
1336867429 INFO sub1 ndc1 i=34: i = 34

※以下省略