日志单例log4cpp简述

1、log4test.cpp

  • 自动对齐  gg=G
  •  编译使用log4cpp库的CPP文件时,要加上库文件,如下示例    g++ log4test.cpp -llog4cpp -lpthread
  • log4cpp学习

log4app使用单例模式。

  • Appender可以定位日志输出信息 ,如console,或保存到文件中
  • Category可以有不同的输出种类,Root是根输出,可以创建子输出,分别对应到不同的输出位置。
  • Layout是输出格式,其子类PatternLayout可以自定义
  • PatternLayout使用setConversionPattern函数来设置日志的输出格式
%c category;
%d 日期;日期可以进一步的设置格式,用花括号包围,例如%d{%H:%M:%S,%l} 或者 %d{%d %m %Y %H:%M:%S,%l}。如果不设置具体日期格式,则如下默认格式被使用“Wed Jan 02 02:03:55 1980”。日期的格式符号与ANSI C函数strftime中的一致。但增加了一个格式符号%l,表示毫秒,占三个十进制位。
%m 消息;
%n 换行符,会根据平台的不同而不同,但对于用户透明;
%p 优先级;
%r 自从layout被创建后的毫秒数;
%R 从1970年1月1日0时开始到目前为止的秒数;
%u 进程开始到目前为止的时钟周期数;
%x NDC。

  • NDC是nested DiagnosticContext的缩写,意思是“嵌套的诊断上下文”。
  • NDC是一种用来区分不同源代码中交替出现的日志的手段。当一个服务端程序同时记录好几个并行客户时,输出的日志会混杂在一起难以区分。但如果不同上下文的日志入口拥有一个特定的标识,则可以解决这个问题。NDC就是在这种情况下发挥作用。
  • 注意NDC是以线程为基础的,每个线程拥有一个NDC,每个NDC的操作仅对执行该操作的线程有效。

 log4cpp之Appender    ----> 定位输出:

常用appender有:
  • log4cpp::FileAppender // 输出到文件
  • log4cpp::RollingFileAppender // 输出到回卷文件,即当文件到达某个大小后回卷
  • log4cpp::OstreamAppender // 输出到一个ostream类
  • log4cpp::StringQueueAppender // 内存队列
依次讲解:
  • OstreamAppender
  • 创建一个OstreamAppender的具体方法如下:
log4cpp::OstreamAppender* osAppender = new log4cpp::OstreamAppender("osAppender", &cout);
  第一个参数指定OstreamAppender的名称,第二个参数指定它关联的流的指针。
  • StringQueueAppender
StringQueueAppender用于记录多线程程序或者实时程序的日志比较方便,--->后面再学习。
StringQueueAppender的功能是将日志记录到一个字符串队列中,该字符串队列使用了STL中的两个容器,即字符串容器std::string和队列容器std::queue,具体如下:
std::queue<std::string> _queue;
  • FileAppender和RollingFileAppender

FileAppender和RollingFileAppender是log4cpp中最常用的两个Appender,其功能是将日志写入文件中。它们之间唯一的区别就是前者会一直在文件中记录日志(直到操作系统承受不了为止),而后者会在文件长度到达指定值时循环记录日志,文件长度不会超过指定值(默认的指定值是10M byte)。

FileAppender的创建函数如下:

FileAppender(const std::string& name, const std::string& fileName,
  bool append = true, mode_t mode = 00644);

一般仅使用前两个参数,即“名称”和“日志文件名”。第三个参数指示是否在日志文件后继续记入日志,还是清空原日志文件再记录。第四个参数说明文件的打开方式。

RollingFileAppender的创建函数如下:

RollingFileAppender(const std::string& name,
  const std::string& fileName,
  size_t maxFileSize = 10*1024*1024,
  unsigned int maxBackupIndex = 1,
  bool append = true,
  mode_t mode = 00644);

两个参数:maxFileSize指出了回滚文件的最大值;maxBackupIndex指出了回滚文件所用的备份文件的最大个数

 log4cpp之Category

Log4cpp有一个实例化好的Category,即根Category。使用log4cpp::Category::getRoot()可以得到根Category。在大多数情况下,一个应用程序只需要一个日志种类(Category),但是有时也会用到多个Category,此时可以使用根Category的getInstance方法来得到子Category。不同的子Category用于不同的场合。

优先级说明:
  • category 类真正完成记录日志功能,两个主要组成部分是appenders和priority(优先级)。
  • 优先级控制哪类日志信息可以被这个category记录,当前优先级分为:NOTSET, DEBUG, INFO, NOTICE, WARN, ERROR, CRIT, ALERT 或 FATAL/EMERG 。
  • 每个日志信息有个优先级,每个category有个优先级,当消息的优先级大于等于category的优先级时,这个消息才会被category记录,否则被忽略。
  • 优先级的关系如下。category类和appender的关系是,多个appender附在category上,这样一个日志消息可以同时输出到多个设备上。

默认notset优先级最低。注意下面这些相当于都是实例Category的一些信息输出成员函数方法,可以通过 操作符访问 
eg: Category category_one.info("ni hao!");

NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG

  • category被组织成一个树,子category创建时优先级缺省NOTSET,category缺省会继承父category的appender。
  • 而如果不希望这种appender的继承关系,log4cpp允许使用additivity 标签,为false时新的appender取代category的appender列表。

系统中默认的优先级等级如下:
  typedefenum {
          EMERG = 0,
          FATAL = 0,
          ALERT = 100,
          CRIT = 200,
          ERROR = 300,
          WARN = 400,
          NOTICE =500,
          INFO = 600,
          DEBUG = 700,
          NOTSET =800
}PriorityLevel;
  注意:取值越小,优先级越高。

手动使用log4cpp的基本步骤如下:

  • 实例化一个layout 对象;
  • 初始化一个appender 对象;
  • 把layout对象附着在appender对象上;
  • 调用log4cpp::Category::getInstance("name"). 实例化一个category对象;
  • 把appender对象附到category上(根据additivity的值取代其他appender或者附加在其他appender后)。
  • 设置category的优先级;

deom one:
//构造函数Mylog::Mylog(): category_ref_(log4cpp::Category::getRoot())
{
     //自定义输出格式
     log4cpp::PatternLayout *pattern_one = new log4cpp::PatternLayout; pattern_one->setConversionPattern("%d: %p %c %x:%m%n");
     log4cpp::PatternLayout *pattern_two = new log4cpp::PatternLayout; pattern_two->setConversionPattern("%d: %p %c %x:%m%n");

//获取屏幕输出
     log4cpp::OstreamAppender *os_appender = new log4cpp::OstreamAppender("osAppender",&std::cout);
     os_appender->setLayout(pattern_one);     

     //获取文件日志输出 ( 日志文件名:mylog.txt )
     log4cpp::FileAppender *file_appender = new log4cpp::FileAppender("fileAppender","mylog.txt");
     file_appender->setLayout(pattern_two); category_ref_.setPriority(log4cpp::Priority::DEBUG);

category_ref_.addAppender(os_appender); category_ref_.addAppender(file_appender); category_ref_.info("Mylog created!"); }


deom two:
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
        
        
#include 
        
        
          #include 
         
           #include 
          
            #include 
           
             using std::cout; using std::endl; using std::ostringstream; using std::string; using namespace log4cpp; int main(void) { PatternLayout * ptnLyout1 = new PatternLayout(); ptnLyout1->setConversionPattern("%d: [%p] :%m%n"); PatternLayout * ptnLyout2 = new PatternLayout(); ptnLyout2->setConversionPattern("%d: [%p] :%m%n"); FileAppender * fileAppender = new FileAppender("fileAppender", "wd.log"); fileAppender->setLayout(ptnLyout1); RollingFileAppender * rollingFileAppender = new RollingFileAppender("rollingFileAppender", "rollwd.log", 5 * 1024, 2); rollingFileAppender->setLayout(ptnLyout2); Category & root = Category::getRoot().getInstance("root"); root.addAppender(fileAppender); root.addAppender(rollingFileAppender); root.setPriority(Priority::DEBUG); for(size_t idx = 0; idx != 200; ++idx) { string errormsg; ostringstream oss; oss << idx << ":Root Error Message"; root.error(oss.str()); } Category::shutdown(); return 0; } 
            
           
          
        
       
       
      
      
     
     
    
    

  • 服务器程序,会一直运行,需要对程序的运行状态进行记录,日志系统。
  • Category自己有一个优先级,每条日志也有一个优先级,只有日志优先级高于或相等Category的优先级时,日志才会被记录。
  • 每个Category可以对应多个Appender。
  • 一个Appender对应一个Layout
  • 设计:
    • 1 G的空间来存储日志
    • 16个日志文件,每个日志文件大小是 64 M, 当快要接近阈值时,回卷文件可能将最早的时间给覆盖掉,写新的日志。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smilejiasmile

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值