log4cpp自带例子程序注解

log4cpp自带例子程序注解
 1 int  main( int  argc,  char **  argv)  {
 2    log4cpp::Appender* appender;
 3#ifdef LOG4CPP_HAVE_SYSLOG
 4    log4cpp::SyslogAppender* syslogAppender;
 5
 6    syslogAppender = new log4cpp::SyslogAppender("syslog""log4cpp");
 7#else
 8    log4cpp::Appender* syslogAppender;
 9
10    syslogAppender = new log4cpp::OstreamAppender("syslogdummy"&std::cout);
11#endif
12
13    if (argc < 2{
14        appender = new log4cpp::OstreamAppender("default"&std::cout);
15    }
 else {
16        appender = new log4cpp::FileAppender("default", argv[1]);
17    }

18
19    syslogAppender->setLayout(new log4cpp::BasicLayout());
20    appender->setLayout(new log4cpp::BasicLayout());
21    //(Root Category name为空,默认为所有category的父类)
22    log4cpp::Category& root = log4cpp::Category::getRoot();
23    root.addAppender(syslogAppender);
24    root.setPriority(log4cpp::Priority::ERROR);
25
26    // //sub1的父类是root    
27      log4cpp::Category& sub1 = log4cpp::Category::getInstance(std::string("sub1"));
28    sub1.addAppender(appender);
29
30    //sub2的父类是sub1
31    log4cpp::Category& sub2 = log4cpp::Category::getInstance(std::string("sub1.sub2"));
32
33    log4cpp::NDC::push(std::string("ndc1"));
34
35    //root设置了error级别,其他级别默认为800,未设置
36    std::cout << " root prio = " << root.getPriority() << std::endl;
37    std::cout << " sub1 prio = " << sub1.getPriority() << std::endl;
38    std::cout << " sub2 prio = " << sub2.getPriority() << std::endl;
39
40    root.error("root error"); //输出
41    root.warn("root warn");  //不输出
42    
43    //因为sub1未设置级别,所以采取的是父类设置的error级别,category属性_isAdditive默认为true,所以sub1打印一遍之后,root category还会打印一次(parent category都会打印一遍)
44    sub1.error("sub1 error"); 
45    sub1.warn("sub1 warn");   //不输出
46    
47    sub2.error("sub2 error"); //同sub1,最后调用的是sub1的callAppender函数,sub1 appender打印一次, root appender打印一次
48    sub2.warn("sub2 warn");
49
50    sub1.setPriority(log4cpp::Priority::INFO); //设置了sub1的打印级别
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
55    std::cout << "priority info" << std::endl;
56    
57    root.error("root error");
58    root.warn("root warn");
59    
60    sub1.error("sub1 error");
61    sub1.warn("sub1 warn");
62    sub2.error("sub2 error");
63    sub2.warn("sub2 warn");
64    sub2.error("sub2 :%d"10);
65
66    std::string a("1234");
67    sub2.error(a);
68
69    sub2.warnStream() << "streamed warn";
70
71    sub2 << log4cpp::Priority::WARN << "warn2" << " warn3" 
72             << log4cpp::eol << " warn4";
73
74    //因为前面设置了一次NDC1,所以下面每一条打印的NDC信息为:ndc i=xx          
75    {
76        for(int i = 0; i < 10000; i++{
77            char ndc2[20];
78            sprintf(ndc2, "i=%d", i);
79            log4cpp::NDC::push(ndc2);
80            sub1.info("%s%d""i = ", i);
81            if ((i % 10== 0{
82                sub1.log(log4cpp::Priority::NOTICE, "reopen log");
83                if (log4cpp::Appender::reopenAll()) {
84                    sub1.info("log reopened");
85                }
 else {
86                    sub1.warn("could not reopen log");
87                }

88            }

89#ifndef WIN32
90            sleep(1);
91#endif
92            log4cpp::NDC::pop();
93        }

94    }

95
96    return 0;
97}

98

sub1 设置为debug, sub2为error, sub1是sub2的父类,sub2 _isAdditive= true
 
sub2.error(111);  这句sub1仍然会打印(判断是否打印是sub2的级别比较的)

log4cpp::Category::getInstance如果配置中不存在的category,那么会新创建一个category,并且以(name为空"")的category作为parent category。

你可能感兴趣的:(log4cpp自带例子程序注解)