Linux/C++系统编程 day9

日志系统

概述

  • 记录系统的运行轨迹,在这个基础上,进行跟踪分析
    错误,审计系统运行流程。
  • 一个日志系统根据他的过程,可以分为四个模块
    • 日志来源:日志内容可以来源于任何其他系统,但对日志系统来说,这是个格式化的缓冲区
    • 系统控制:系统控制的重点在于控制日志内容在日志系统中的流转过程。比如日志输出目的地,比如日志的输出级别
    • 日志输出:日志在控制台输出是比较常见的,但如何考虑为系统的可靠性提供支持,以及大量日志内容的情况下,这个一般不予考虑的。在控制台输出的,只会是非常核心的内容或者是致命的错误,况且,在有些情况下,不一样会有控制台。我们一般在这种情况下,都倾向于将日志输出到文件
    • 日志存储:日志存储在很多小型系统往往并不需要关注,一个可靠性要求很高的系统中,对日志存储却是极为苛刻。就是在现在的数据库系统中,也必须依赖日志的存在,来还原操作

设计思路

  • 日志库的设计,一般而言要抓住最核心的一条,就是日志从产生到到达最终目的地期间的处理流程
  • 一般而言,主要将日志库分为4个部分
    • 记录器:负责产生日志记录的原始信息,比如(原始信息,日志等级,时间,记录的位置)等等信息
    • 过滤器:负责按指定的过滤条件过滤掉我们不需要的日志(比如按日志等级过滤)
    • 格式化器:负责对原始日志信息按照我们想要的格式去格式化
    • 输出器:负责将将要进行记录的日志(一般经过过滤器及格式化器的处理后)记录到日志目的地(例如:输出到文件中)

日志分类

级别分类

  • 取值越小,优先级越高

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GGOfxN83-1610412292581)(\image-20210111150353921.png)]

来源分类

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fz8UVLgz-1610412292583)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20210111150409221.png)]

Log4cpp

__FILE__   __LINE__  __ FUNCTION__
//可打印文件名,行数,函数名的宏定义
  • 使用原则

    • 不要手动释放 Category、Appender 和 Layout;
    • 同一个 Appender 不要加入多个 Category,否则它会被释放多次从而导致程序崩溃;
    • 同一个 Layout 不要附着到多个 Appender 上,否则也会被释放多次导致程序崩溃;
    • log4cpp::Category::shutdown()
      在不使用 log4cpp 时可调用 ,其功能如同
      HierarchyMaintainer 的内存清理。

第1步:设置日志格式Layout

格式1:BasicLayout
  • 时间戳+优先级+内容

  • 头文件log4cpp/BasicLayout.hh

  • BasicLayout *pbl = new BasicLayout();

格式2:SimpleLayout
  • 优先级+日志信息
  • 头文件log4cpp/SimpleLayout.hh
  • SimpleLayout *psl = new SimpleLayout();
格式3:PatternLayout
  • 使用类似printf的格式化模式

  • 头文件log4cpp/PatternLayout.hh

  • PatternLayout *ppl = new PatternLayout();

  • ppl->setConversionPattern(“%d %c [%p] %m %n”);

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fM1Z8Cm9-1610412292585)(C:\Users\Admin\AppData\Roaming\Typora\typora-user-images\image-20210111170806903.png)]

第2步:设置日志目的地Appender

方法1:OstreamAppender
  • 输出到一个ostream类

  • 头文件log4cpp/OstreamAppender.hh

  • OstreamAppender *poa = new OstreamAppender(“OstreamAppender”,&cout);

    (参数是appender的名称,流的名称)

  • poa->setLayout(第1步指针);

方法2:StringQueueAppender
  • 输出到内存中的字符串队列

  • 头文件log4cpp/StringQueueAppender.hh

  • StringQueueAppender *psqa = new StringQueueAppender(“StringQueueAppender”);

    (参数是appender的名称)

  • psqa->setLayout(第一步指针);

方法3:FileAppender
  • 输出到文件

  • 头文件log4cpp/FileAppender.hh

  • FileAppender *pfa = new FileAppender(“FileAppender”,“文件”,true,00644);

    (参数是appender的名称,日志文件名,是否继续记入,文件打开方式权限)

  • pfa->setLayout(第一步指针);

方法4:RollingFileAppender
  • 回滚输出到文件

  • 头文件log4cpp/RollingFileAppender.hh

  • RollingFileAppender *prfa = new RollingFileAppender(“RollingFileAppender”,”文件“,maxFileSize,maxBackupIndex,true,00644);

    (参数是appender的名称,日志文件名,回滚文件最大值,回滚文件所用备份文件最大个数,是否继续记入,文件打开方式权限)

  • prfa->setLayout(第一步指针);

第3步:设置格式记录器Category

  • 负责向日志中写入信息

  • 头文件log4cpp/Category.hh

  • Category &root = Category ::getRoot().getInstance(“”);

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

  • root.addAppender(第二步指针);

    (设置或添加appender)

  • root.setPriority(Priority::级别)

    (只有当日志的优先级高于category的时候才会被记录)

第4步:设置日志优先级

  • 头文件log4cpp/Priority.hh

  • root.emerg("This is an emerg message");
    //emerg和fatal优先级都是0,无法识别
    root.fatal("This is an fatal message");
    root.alert("This is an alert message");
    root.crit("This is an crit message");
    root.error("This is an error message");
    root.warn("This is an warn message");
    root.notice("This is an notice message");
    root.info("This is an info message");
    root.debug("This is an debug message");
    
    //回收
    Category::shutdown();
    
  • 每个Category都有一个优先级,该优先级可以由setPriority
    方法设置,或者从其父 Category 中继承而来

  • 每条日志也有一个优先级,当 Category 记录该条日志时,若日志优先级高于 Category 的优先级时,该日志被记录,否则被忽略

  • 数字越小优先级越高

    EMERG=0,FATAL=0,

    ALERT=100,

    CRIT=200,

    ERROR=300,

    WARN=400,

    NOTICE=500,

    INFO=600,

    DEBUG=700,

    NOTSET =800

  • Log4cpp 中 new 出来的 Category、Appender 和 Layout 都不需要手动释放,因为 Log4cpp 使用了一个内部类来管理这些对象。此类的名称是 HierarchyMaintainer,它负责管理 Category 的继承关系,在程序结束时,HierarchyMaintainer 会依次释放所有 Category,而 Category 则会依次释放拥有的有效 Appender,Appender 则会释放所有附属的 Layout。如果程序员手动释放这些对象,则会造成内存报错。

  • g++ log4test.cpp -llog4cpp -lpthread
    关系,在程序结束时,HierarchyMaintainer 会依次释放所有 Category,而 Category 则会依次释放拥有的有效 Appender,Appender 则会释放所有附属的 Layout。如果程序员手动释放这些对象,则会造成内存报错。

  • g++ log4test.cpp -llog4cpp -lpthread

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1,cccode.zip一个监控别人计算机的程序(65KB)2,cihcn.zipCIH病毒1.4版本之中文注释(25KB)3,regmonsrc.zip监控win9x下文件的读写(251KB)4,quickprt.zip增强的quickrpt(70KB)5,xxm.zip餐桌管理程序(83KB)6,dfbak.zip电费管理程序(981KB)7,pterm01b.zip终端仿真程序(63KB)8,drivevie.zip查看系统安装的驱动器(34KB)9,findprocess.zip列举所有的进程基类(107KB)10,mfctlist.zip列举操作系统中所有的进程,你能够在程序中消灭进程。程序由Visual C++ 5.0开发,工作于Windows 95(98),Windows NT 4.0(28KB)11,CServer.ZIP多线程实现客户-服务器结构的一个例子(37KB)12,splasher.zip用线程实现软件的片头(Splash Screen)(62KB)13,getinfo.zip获取系统硬件信息源代码(39KB)14,getfontinfo.zip获取系统所有字体信息源代码(51KB)15,detectos.zip获取操作系统版本信息源代码(42KB)16,gethostip.zip获得主机名和IP地址(34KB)17,shellext.zip用程序启动IE Outlook Explore(30KB)18,autolog.zipWinNT 自动登录源程序(13KB)19,cpuinfo.zip一个取得 CPU 信息的程序源码(164KB)20,apihook.zipAPI钩子APIHOOK 2.0 源代码(91KB)21,registry.zip查询修改注册表源代码(40KB)22,q1.zip程序创建两个线程,第一个线程没有消息队列,主线程尝试给第一个线程发送一个消息,我们可以看到PostThreadMessage()返回FALSE,程序创建的第二个线程有一个消息队列,主线程中的PostThreadMessage()返回TRUE,程序由Visual C++ 6.0开发,没有用到MFC(79KB)23,pstat.zip在程序需要进行较长时间工作的时候,总希望能有一个进度条告诉我们当前的进度,这个例子利用线程显示进度条值得一看 COOL(20KB)24,m4kit15.zip简单的环境继承(persistence)库(548KB)25,vxdlib11.zip自动生成虚拟设备驱动(VXD)的C++代码的一个库 COOL!(431KB)26,hklm.zipCHKLM类允许你在注册表的HKEY_LOCAL_MACHINE注册键中做写操作(10KB)27,pipe_pro.zip管道类(30KB)28,Storage.zip存储类(9KB)29,dt220.zip日期和时间的扩展类2.2版,需要安装(1149KB)30,dt221.zip日期和时间的扩展类2.2版的更新程序(22KB)31,DllIco.zip得到DLL/EXE文件中的资源定义 Cool(85KB)32,stealth.zip这个由Visual C++ 5.0开发的SDI程序演示如何让程序运行时在Window 95或Windows NT 4.0的任务条上不显示出来,程序重载了CMainFrame中的PreCreateWindow()函数 COOL(29KB)33,FontsTest.zip列举系统中的所有字体(41KB)34,memmap.zip操作内存映像文件,提供的CMemMapFile功能强大(16KB)35,cfile64.zip支持Win32 64位文件系统的一个类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值