项目日志——Log4cpp

  • 开源的C++类库Log4cpp提供了很多功能,帮助我们的应用程序更方便地记录日志。

安装与构建

  • Log4cpp官网——http://log4cpp.sourceforge.net/
wget https://nchc.dl.sourceforge.net/project/log4cpp/log4cpp1.1.x%20%28new%29/log4cpp-1.1/log4cpp-1.1.3.tar.gz
tar zxvf log4cpp-1.1.3.tar.gz
cd log4cpp
# root用户
./configure --prefix=执行路径
# 示例
# ./configure --prefix=/home/xuanxuan/share_bike/third/lib/log4cpp
make
make install

使用

  • 包含头文件
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/OstreamAppender.hh>
  • 初始化日志输出的目的地

示例1:输出到标准输出std::cout

log4cpp::Appender *appender = new log4cpp::OstreamAppender("root", &std::cout);

示例2:输出到log文件

log4cpp::Appender *appender = new log4cpp::FileAppender("root", "test.log");

输出方式如下:

log4cpp::FileAppender // 输出到文件
log4cpp::RollingFileAppender // 输出到回卷文件,即当文件到达某个大小后回卷
log4cpp::OstreamAppender // 输出到一个ostream类
log4cpp::RemoteSyslogAppender // 输出到远程syslog服务器
log4cpp::StringQueueAppender // 内存队列
log4cpp::SyslogAppender // 本地syslog
log4cpp::Win32DebugAppender // 发送到缺省系统调试器
log4cpp::NTEventLogAppender // 发送到win 事件日志

注意

实际上日志输出到终端或文件中是很慢的,可能会引起IO中断,所以我们可以先输出到内存中(StringQueueAppender),然后在输出到其它地方,这样效率较高。

  • 设置日志输出格式
log4cpp::PatternLayout *patternLayout = new log4cpp::PatternLayout();
patternLayout->setConversionPattern("%d [%p] - %m%n");
appender->setLayout(patternLayout);

日志输出格式控制如下:

log4cpp::PatternLayout Class Reference

%%%% - a single percent sign
%c - the category
%d - the date
Date format: The date format character may be followed by a date format specifier enclosed between braces. For example, %d{%H:%M:%S,%l} or %d{%d %m %Y %H:%M:%S,%l}. If no date format specifier is given then the following format is used: "Wed Jan 02 02:03:55 1980". The date format specifier admits the same syntax as the ANSI C function strftime, with 1 addition. The addition is the specifier %l for milliseconds, padded with zeros to make 3 digits.
%m - the message
%n - the platform specific line separator
%p - the priority
%r - milliseconds since this layout was created.
%R - seconds since Jan 1, 1970
%u - clock ticks since process start
%x - the NDC
  • 设置输出类别和日志优先级
log4cpp::Category &root = log4cpp::Category::getRoot();
root.setPriority(log4cpp::Priority::NOTICE);
root.addAppender(appender);

日志的级别如下:

NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG。
低于该级别的日志不会被记录。

  • 定义宏来减少代码量
#define LOG(__level) log4cpp::Category::getRoot() << log4cpp::Priority::__level << __FILE__ << " " << __LINE__ << ": "

使用:

LOG(DEBUG)<<"DEBUG.";

测试

什么是单例?

  • 程序中仅有一个的对象。

配置文件:log.conf

#定义Root category的属性
log4cpp.rootCategory=DEBUG, RootLog#定义RootLog属性
log4cpp.appender.RootLog=RollingFileAppender
log4cpp.appender.RootLog.layout=PatternLayoutlog4cpp.appender.RootLog.layout.ConversionPattern=%d{%m-%d %H:%M:%S %l} [%t][%p]%m%n
log4cpp.appender.RootLog.fileName=/var/log/share_bike.log
log4cpp.appender.RootLog.maxFileSize=268435456 #256MB
log4cpp.appender.RootLog.fileNamePattern=share_bike_%i.log
log4cpp.appender.RootLog.maxBackupIndex=256
  • 封装为一个类

Logger.h

#ifndef DISTRIBUTED_LOGGER_H_
#define DISTRIBUTED_LOGGER_H_#include <string>
#include <log4cpp/Category.hh>class Logger{
public:bool init(const std::string& log_conf_file);static Logger* instance(){//返回单例——全局唯一对象return &instance_;}log4cpp::Category* GetHandle(){return category_;}protected:static Logger instance_;log4cpp::Category* category_;
};#define LOG_INFO Logger::instance()->GetHandle()->info
#define LOG_DEBUG Logger::instance()->GetHandle()->debug
#define LOG_ERROR Logger::instance()->GetHandle()->error
#define LOG_WARN Logger::instance()->GetHandle()->warn#endif

Logger.cpp

#include "Logger.h"#include <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/PropertyConfigurator.hh>Logger Logger::instance_;bool Logger::init(const std::string& log_conf_file){try{log4cpp::PropertyConfigurator::configure(log_conf_file);}catch(log4cpp::ConfigureFailure& f){std::cerr << " load log config file " << log_conf_file.c_str() << " failed with result : " << f.what()<< std::endl;return false;}category_ = &log4cpp::Category::getRoot();return true;
}
  • 测试

main.cpp

#include "iniconfig.h" //注意路径,会在CMake中进行调整
#include "configdef.h"
#include "Logger.h"int main(int argc,char** argv){if(argc != 3){//缺少参数printf("Please input shbk <config file path> <log file config>!\n");return -1;}if(!Logger::instance()->init(std::string(argv[2]))){fprintf(stderr,"init log module failed.\n");return -2;}Iniconfig config;if(!config.loadfile(std::string(argv[1]))){//printf("load %s failed.\n",argv[1]);LOG_ERROR("load %s failed.",argv[1]);return -3;}//测试是否读取成功st_env_config conf_args = config.getconfig();LOG_INFO("[database]ip:%s\n [database]port:%d\n [database]user:%s\n [database]pwd:%s\n [database]db:%s\n [server]port:%d\n ",conf_args.db_ip.c_str(),conf_args.db_port,conf_args.db_user.c_str(),conf_args.db_pwd.c_str(),conf_args.db_name.c_str(),conf_args.svr_port);return 0;
}

**注意链接库:**下面为示例,请根据自身情况调整。

TARGET_LINK_LIBRARIES(common log4cpp)
TARGET_LINK_LIBRARIES(share_bike pthread)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} liblog4cpp.a)

执行:

./share_bike ../conf/share_bike.ini ../conf/log.conf

查看:

在log.conf中。/var/log/share_bike.log为保存路径。

log4cpp.appender.RootLog.fileName=/var/log/share_bike.log

【Log4cpp】项目日志Log4cpp的简单使用相关推荐

  1. VS项目配置log4cpp

    1.log4cpp下载与编译 首先下载log4cpp源码并解压,下载地址:Log library for C++ - Browse Files at SourceForge.net 进入msvc10目 ...

  2. Django项目日志概述

    Django项目日志概述 本文环境python3.5.2,Django版本1.10.2 Django项目中日志的实现 Django项目中使用的日志,使用了Python标准库中的logging模块进行实 ...

  3. 学习Coding-iOS开源项目日志(二)

    继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...

  4. Loki 学习总结(1)—— Loki 中小项目日志系统的不二之选

    前言 项目做正规了,日志系统是少不了的,目前大部分日志平台推荐基于 ELK 构建,不过 ELK 算是比较重了,架构太大,中小项目不太好 Hold 住,希望找一款简单一些的,如果实在找不到再上 ELK, ...

  5. 项目日志在项目管理中的应用

    1.前言 软件项目的特殊性使其开发难度越来越大,各企业.团队面临的风险也越来越多,这直接导致目前国内软件项目成功率较低.对于目前项目中存在的问题,影响比较大的主要有以下几方面: 1.计划及过程跟踪不足 ...

  6. elm_flask 项目日志 -- flask后台管理系统开发设计

    后台管理项目日志 项目初始化阶段 仓库使用 注册码云平台 创建工程仓库 创建自己的开发分支 clone/push/pull的操作 新建开发分支 能够在远程分支进行pull和push 项目搭建 搭建项目 ...

  7. xmake入门,构建项目原来可以如此简单

    为什么80%的码农都做不了架构师?>>>    前言 在开发xmake之前,我一直在使用gnumake/makefile来维护个人C/C++项目,一开始还好,然而等项目越来越庞大后, ...

  8. Silverlight学习(一) 创建Silverlight项目,构建一个简单的Silverlight Demo

          今天我将开始我的Silverlight学习之旅.首先学会如何创建Silverlight项目并构建一个Silverlight简单的Hello World Demo. 创建项目   现在Sil ...

  9. 【django】配置项目日志【5】

    一.配置项⽬⽇志 # 配置项目日志 LOGGING = {'version': 1,'disable_existing_loggers': False, # 是否禁用已经存在的日志器'formatte ...

  10. springboot开启debug日志_SpringBoot日志快速上手简单配置

    默认配置 日志级别从低到高分为: TRACE < DEBUG < INFO < WARN < ERROR < FATAL. 如果设置为 INFO ,则低于 INFO 的信 ...

最新文章

  1. 转换前台javascript传递过来的时间字符串到.net的DateTime
  2. linux终端密码星星,如何在Ubuntu终端中显示密码星号
  3. 微软一站式开发技术框架解决方案 年内展望
  4. Ubuntu 16.04编译安装OpenCV(Python)
  5. 【POJ - 2909 】Goldbach's Conjecture (哥德巴赫猜想,数论,知识点结论)
  6. day 05 多行输出与多行注释、字符串的格式化输出、预设创建者和日期
  7. php变量函数,回调函数
  8. Flex更改Image
  9. 视觉SLAM笔记(26) 状态估计问题
  10. 多域名linux面板,宝塔面板操作多个域名做301跳转
  11. 浅析java垃圾回收机制
  12. md5算出来不一样_西安美发培训学校:为什么我看到的色卡上的颜色和染出来的颜色会不一样呢?...
  13. 自动化测试平台(七):头像展示、下拉菜单及用户管理模块增删改功能实现
  14. UA MATH563 概率论的数学基础 中心极限定理1 随机变量序列的收敛
  15. centos官网下载地址
  16. 有3种水果(苹果、香蕉、橘子),每位同学只能选1种最爱吃的(共5位同学),要求编一个统计水果票数的程序,先输入水果种类,最后输出各水果得票结果。
  17. xp系统itunes无法连接服务器失败,xp系统iTunes无法连接到iTunes store的修复步骤
  18. 浪潮提出“计算+”挖大数据商机
  19. 查询用户活跃度表登录间隔30天的用户
  20. 读后感——《软件工程》——软件的本质及软件工程

热门文章

  1. adb工具构成及原理
  2. 微星主板黑苹果_11.11黑苹果主机金牌装机单(AMD篇)
  3. 写给电脑小白的电脑科普
  4. (求救大佬)蓝桥杯C语言试题 算法训练 C++ CH08 01
  5. 2022年MathorCup建模赛D题:MATLAB代码与若干问题
  6. 人工智能十大算法_【读书】人工智能和大数据:新智能的诞生/人工智能科学与技术丛书...
  7. pycharm汉化包使用后无法打开设置选项问题
  8. CC2541蓝牙低功耗芯片中文资料提供
  9. 比navicat还好用的mysql可视化工具
  10. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(一):网络基础