对像我这样的小白来讲,大段的理论和解释风格比较精简的实例学习起来很难入门。一个简单并且解释很详细的例子反而更容易上手。
通过阅读几篇博客,自己找了一个小例子,并对其做了详细解释:
1properties文件
1.1文件部分
文件:log.properties

log4cplus.rootLogger=ERROR, R 注释(1)

log4cplus.appender.R=log4cplus::DailyRollingFileAppender 注释(2)
log4cplus.appender.R.File=./log/error.log 注释(3)
log4cplus.appender.R.Schedule=HOURLY 注释(4)
log4cplus.appender.R.Append=true 注释(5)
log4cplus.appender.R.layout=log4cplus::PatternLayout 注释(7)
log4cplus.appender.R.layout.ConversionPattern=[%D{%Y-%m-%d %H:%M:%S,%Q}] [%t] %-5p - %m%n[%p] 注释(7)

log4cplus.logger.test=TRACE, RR 注释(1)

log4cplus.appender.RR=log4cplus::DailyRollingFileAppender
log4cplus.appender.RR.File=./log/test.log
log4cplus.appender.RR.MaxBackupIndex=192    #8 * 24 注释(6)
log4cplus.appender.RR.Schedule=HOURLY
log4cplus.appender.RR.Append=true
log4cplus.appender.RR.layout=log4cplus::PatternLayout
log4cplus.appender.RR.layout.ConversionPattern=%p %D{%Y-%m-%d %H:%M:%S.%q}:%t %F:%L "%m"%n

1.2 注释部分
(1)配置Logger对象
RootLogger配置格式:log4cplus.rootLogger= [LogLevel],appenderName,appenderName,…..,如此处LogLevel为ERROR,appenderName为R。
appenderName格式:log4cplus.logger.logger_name= [LogLevel|INHERITED],appenderName,…..

Logger对象:在log4cplus中logger对象具有层次结构,所有logger都通过一个层次化的结构来组织的,有一个Root级别的logger,用户可以定义自己的logger对象如test,也可以定义其子对象如test.subtest。

优先级(LogLevel):
log4cplus优先级由低到高:
    NOT_SET_LOG_LEVEL :接受缺省的LogLevel,如果有父logger则继承它的LogLevel
    ALL_LOG_LEVEL :开放所有log信息输出
    TRACE_LOG_LEVEL :开放trace信息输出(即ALL_LOG_LEVEL)
    DEBUG_LOG_LEVEL :开放debug信息输出
    INFO_LOG_LEVEL  :开放info信息输出
    WARN_LOG_LEVEL  :开放warning信息输出
    ERROR_LOG_LEVEL :开放error信息输出
    FATAL_LOG_LEVEL :开放fatal信息输出
OFF_LOG_LEVEL :关闭所有log信息输出
在配置文件中,logger名称之后的第一个参数可以控制日志输出级别,如在debug环境中,输出各种debug信息,而在线上环境中,则只需要输出info和各类错误信息。具体级别与上文优先级对应:•TRACE •DEBUG •INFO •WARN •ERROR •FATAL
上述各种级别中,从上往下,重要性依次递增。而在配置文件中的级别会屏蔽掉比它重要性更低的日志输出。
(2)appender配置,此处配置的是appender输出位置。Appender输出位置类型有:控制台输出(ConsoleAppender),文件输出(FileAppender / RollingFileAppender / DailyRollingFileAppender )。
此处使用的DailyRollingFileAppender根据频度来决定是否转储的文件转储方式,具体参数请参考《Log4cplus使用指南》P20。文末附此书下载链接。
(3)设置存储文件路径和名称
(4)设置存储频度,DailyRollingFileAppender 类可以根据你预先设定的频度来决定是否转储,当超过该频度,后续 log 信息会另存到新文件中。此处设定的频度HOURLY是每小时。所有的频度类型包括:MONTHLY(每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每两天)、HOURLY(每时)、MINUTELY(每分)。
(5)缓冲刷新标识,如果为 true 表示每向文件写一条记录就刷新一次缓存,否则直到 FileAppender 被关闭或文件缓存已满才更新文件。一般要设置true,这样类似程序崩溃的情况发生后,程序终止时刻之前的所有记录都会被正常保存。
(6)设置最大记录文件数,当记录文件数超过MaxBackupIndex+1(此处为193)时,会删除最早生成的文件,保证整个文件数目等于MaxBackupIndex+1。后面的注释#8*24意在说明此处设置实质上是记录八天以内的日志。
(7)(8)layout是控制日志输出格式的,此处设置日志打印格式。格式包括三种类型:
SimpleLayout 是一种简单格式的布局器,在输出的原始信息之前加上LogLevel和一个"-",若不设置格式则默认为该格式输出;TTCCLayout 其格式由时间,线程ID,Logger和NDC 组成; PatternLayout 是一种有词法分析功能的模式布局器,类似正则表达式。以“%”作为开头的特殊预定义标识符,将产生特殊的格式信息。具体的格式信息请参考《Log4cplus使用指南》P15。

2 .cpp文件
test.cpp

#include <cstdlib>
#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/stringhelper.h>

using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;

int main()
{

PropertyConfigurator::doConfigure(LOG4CPLUS_TEXT("log.properties"));
        Logger logger = Logger::getRoot();
        // trace
        LOG4CPLUS_TRACE(logger, "trace and get the fingerprint: " << "rand integer: " << rand ());
        // debug
        LOG4CPLUS_DEBUG(logger, "this is debug log: " << "rand integer: "<< rand ());
        // info
        LOG4CPLUS_INFO(logger, "the information centry...." << "[ 1 + 1 = " << 1 + 1 << "]");
        // warn
        LOG4CPLUS_WARN(logger, "Writing warning messages to log....");
        // error
        LOG4CPLUS_ERROR(logger, "ooooooh, there is an error....");
        //fatal
        LOG4CPLUS_FATAL(logger, "oh, my god! the fatal error occur!!!!!!!!!");
        //
        Logger loggerTest  = log4cplus::Logger::getInstance(_T("test"));
        LOG4CPLUS_TRACE(loggerTest,"anther logger,trace");
        LOG4CPLUS_ERROR(loggerTest,"anther logger,error ");
        return 0;

}

3 遇到的问题

3.1 “LOG4CPLUS_WARN”: 找不到标识符 、   无法解析的外部符号(链接错误,很多文字)

解决方法记录在另一篇博客:http://blog.csdn.net/zhaojunwuiris/article/details/79064970

3.2 原例子CPP文件中并不是rand()函数,而是random(),使用时遇到问题,已修改例子。

3.3 原例子CPP文件中 Logger loggerTest  = log4cplus::Logger::getInstance(_T("test"));为

Logger loggerTest  = log4cplus::Logger::getInstance("test");

此处因为我的log4cplus库文件以及例子均使用的Unicode字符集,需将"test"转换为宽字符,已改动。至于为什么要改,如果想探究,可以参考这篇文章:file:///C:/Users/Administrator/Desktop/实现UNICODE和ANSII双编程的方法.mht

本文使用的例子来自博客:https://www.cnblogs.com/james1207/p/3328996.html

另附《Log4cplus使用指南》下载链接:
https://pan.baidu.com/s/1rajyw7E

Log4cplus配置文件的使用(学习笔记)相关推荐

  1. MAVEN配置文件Setting.xml学习笔记

    题记:对于maven一直是"拿来主义",但是遇到问题就有点傻逼了,今天就遇到一个maven打包的缺少插件的问题,于是整理一片学习笔记.2020.3.25 一.Setting.xml ...

  2. mysql数据库管理系统的配置文件是_MySQL学习笔记_1_MySQL数据库管理系统概述

    1. MySQL架构 C/S: client / server架构 MySQL DBMS(Data Bank Management System): 数据库管理系统 客户端  服务器 --->  ...

  3. oracle10g无监听配置文件,Oracle 10g学习笔记(七) tnsnames.ora 监听配置文件详解

    监听配置文件 为了使得外部进程 如 CAMS后台程序 能够访问 Oracle 数据库 必须配 置 Oracle 网络服务器环境 配置 Oracle 网络服务器环境是通过配置 listener.ora ...

  4. python学习笔记之编写readConfig读写配置文件

    python学习笔记之编写readConfig读写配置文件_weixin_34055910的博客-CSDN博客

  5. Python学习笔记:Day 6 配置文件

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  6. spring学习笔记03-spring-DI-依赖注入详解(通过xml配置文件来配置依赖注入)

    spring学习笔记03-spring-DI-依赖注入详解 1.概念 2.构造函数注入 3.set方法注入 4.集合的注入 需要被注入的实体对象 package com.itheima.service ...

  7. VIM学习笔记 配置文件(vimrc)

    为什么80%的码农都做不了架构师?>>>    VIM学习笔记 配置文件(vimrc) 在vim启动过程中,首先将查找配置文件并执行其中的命令.而这些初始化文件一般有vimrc.gv ...

  8. [原创]java WEB学习笔记80:Hibernate学习之路--- hibernate配置文件:JDBC 连接属性,C3P0 数据库连接池属性等...

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Redis学习笔记(五)——持久化及redis.conf配置文件叙述

    对于日常使用来说,学习完SpringBoot集成Redis就够我们工作中使用了,但是既然学习了,我们就学习一些Redis的配置及概念,使我们可以更深层次的理解Redis,以及增强我们的面试成功概率,接 ...

  10. [原创]Saltstack学习笔记:命令参数详解以及配置文件说明

    很久没有更新saltstack的文章了,今天还是来更新一点,又开始对saltstack复习了一下. 前边写了一点<saltstack入门概述(1)>以及<Saltstack如何安装( ...

最新文章

  1. 迈克尔·乔丹,无可复制的篮球之神!
  2. Python 装饰器初探
  3. “相当一部分”HPE公司OpenStack工作人员被转移至SUSE
  4. Spring Data Jpa出现Not supported for DML operations
  5. 技术面试时,程序员需要什么样的编程测试?
  6. 在Linux环境下搭建CCID测试环境
  7. 成功解决 AttributeError: module ‘neat’ has no attribute ‘Config’解决方式
  8. [51单片机] 四相五线减速比为1/64步进电机驱动设计
  9. python调用mt4_python mt4
  10. kux格式怎么转换成mp3_怎么把kux格式转换mp4、mp3?视频转换技巧介绍
  11. 计算机应不应该学电路,应该怎么学才能入门电子技术
  12. java实现pdf的拆分和合并
  13. 如何做网络投票的刷票外挂(一)
  14. 网络推广100种方法_免费在线推广业务的6种方法
  15. ORB-SLAM3编译问题 recipe for target ‘CMakeFiles/ORB_SLAM3.dir/src/LocalMapping.cc.o‘ failed
  16. 真正的好老板,都是高层次的“给予者”
  17. 目标检测算法——YOLOv5/YOLOv7改进之结合特征提取网络RFBNet(涨点明显)
  18. SpringBoot启动报错Could not resolve placeholder ‘XXX.XXX‘ in value
  19. python连接mysql的几种方式_Python连接MySQL数据库的多种方式
  20. .Net C# 发送带背景图html邮件(解决Outlook不显示背景图问题)

热门文章

  1. 快速给数据库大表添加字段或索引方法
  2. 热敏打印机实现打印小票
  3. js获取英文名字的首字母
  4. House-GAN 论文阅读
  5. 全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较
  6. 2021,送你一个“BTC”
  7. 我需要几个变量来记录游戏声音大小,游戏音效大小,游戏是否静音,请帮我给这些变量取名...
  8. bat脚本中调用另一个bat的坑
  9. 曲折词缀和python的功能区别_【原创】屈折词缀与派生词缀的区别
  10. 破军(云集初始团队长,达令家操盘执行)的人生经历,没有人可以随便成功。