log 的优先级别解读,参阅源码 log4cpp-0.3.5rc3/include/log4cpp/Priority.hh
由高到低

EMERG
FATAL
ALERT
CRIT
ERROR
WARN
NOTICE
INFO
DEBUG
NOTSET

对应到 Category 相应函数,参阅源码 log4cpp-0.3.5rc3/include/log4cpp/Category.hh

Category::emerg()
Category::fatal()
Category::alert()
Category::crit()
Category::error()
Category::warn()
Category::notice()
Category::info()
Category::debug()

以上函数都有 2 个重载函数,可分别接受格式化字串或 std::string,例如 debug(),有

void debug(const char* stringFormat, ...) throw();
void debug(const std::string& message) throw();

关于优先级别使用的建议
开发运行时,设为 DEBUG 级,而正式运营时,则设为 NOTICE ;
一定要显示出来的信息则可以用 NOTICE 或以上级别;
跟踪函数运行痕迹的信息用 INFO 级别;
运行时调试的信息用 DEBUG 级别;
举例说明

void initialize(int argc, char* argv[])
{
log.info("initialize() : argc=%d", argc);

for (int i=0; i < argc; ++i)
{
    log.debug("initialize() : argv[%d]=%s", i, argv[i]);
}

log.notice("initialize() : done");
}

log4cpp 的 category 分为 rootCategory 和其它自定义的 category。

而每个 category 都可以输出到多个 appender。并且 category 也是有包含关系的。

例如 rootCategory 就是所有 category 的根。而自定义的 category 也可以在配置文件中定义其包含关系。

先看一个 rootCategory 的配置

log4cpp.rootCategory=DEBUG, console, sample

这个定义里,指定了 rootCategory 的 log 优先级是 DEBUG,其 appender 有 2 个,分别是 console 和 sample。

即是说,等号右边内容以逗号分隔,第一项是优先级别,接下来的都是 appender 名字,可以有一个或多个。

现在来看看自定义的 category

log4cpp.category.demo=DEBUG, sample

这里定义了一个名字为 demo 的 category,其优先级为 DEBUG,appender 为 sample。

注意, category 和 appender 名字可以完全相同。

再来看看有包含关系的 category 的定义

log4cpp.category.demo.son=DEBUG, son
log4cpp.category.demo.daughter=DEBUG, daughter

以上定义了 2 个 category,名字分别为 son 和 daughter,其父 category 为 demo。

son 产生的 log 会写到 son 和 demo 的 appender 中。同理,daughter 的 log 会写到 daughter 和 demo 的 appender 中。

现在来看看 appender 的定义。appender 有很多种,我这里只介绍几种,分别是

ConsoleAppender : 控制台输出,即 std::cout
Win32DebugAppender : VC IDE 的输出,即 ::OutputDebugString
FileAppender : 文件输出
RollingFileAppender : 有待研究

现在看一个 ConsoleAppender 的例子

log4cpp.appender.console=ConsoleAppender
log4cpp.appender.console.layout=PatternLayout
log4cpp.appender.console.layout.ConversionPattern=%d [%p] - %m%n

以上信息解释为:一个名为 console 的 appender,其类型为 ConsoleAppender,即 控制台输出 log 输出的布局是 指定的样式
输出的格式 是 "%d [%p] - %m%n" (稍后再解释)

再看一个 FileAppender 的例子

log4cpp.appender.sample=FileAppender
log4cpp.appender.sample.fileName=sample.log
log4cpp.appender.sample.layout=PatternLayout
log4cpp.appender.sample.layout.ConversionPattern=%d [%p] - %m%n

以上信息解释为:一个名为 sample 的 appender,其类型为 FileAppender,即 文件输出指定的 log 文件名为 sample.log,输出的布局是 指定的样式,输出的格式 是 "%d [%p] - %m%n"

对应 category 和 appender 的配置方式,可以发现

category 是 "log4cpp.category." + "category name"

category 名字可以用 "." 分隔,以标识包含关系

appender 是 "log4cpp.appender." + "appender name"

appender 名字 不能 用 "." 分隔,即是说 appender 是没有包含关系的

现在看一个完整的配置文件例子

#定义 root category 的属性
log4cpp.rootCategory=DEBUG, console

#定义 console 属性
log4cpp.appender.console=ConsoleAppender
log4cpp.appender.console.layout=PatternLayout
log4cpp.appender.console.layout.ConversionPattern=%d [%p] - %m%n

#定义 sample category 的属性
log4cpp.category.sample=DEBUG, sample

#定义 sample appender 的属性
log4cpp.appender.sample=FileAppender
log4cpp.appender.sample.fileName=sample.log
log4cpp.appender.sample.layout=PatternLayout
log4cpp.appender.sample.layout.ConversionPattern=%d [%p] - %m%n

#定义 sample.son category 的属性
log4cpp.category.sample.son=DEBUG, son

#定义 son appender 的属性
log4cpp.appender.son=FileAppender
log4cpp.appender.son.fileName=son.log
log4cpp.appender.son.layout=PatternLayout
log4cpp.appender.son.layout.ConversionPattern=%d [%p] - %m%n

#定义 sample.daughter category 的属性
log4cpp.category.sample.daughter=DEBUG, daughter

#定义 daughter appender 的属性
log4cpp.appender.daughter=FileAppender
log4cpp.appender.daughter.fileName=daughter.log
log4cpp.appender.daughter.layout=PatternLayout
log4cpp.appender.daughter.layout.ConversionPattern=%d [%p] - %m%n

ConversionPattern 参数解读,参阅源码 log4cpp-0.3.5rc3/src/PatternLayout.cpp

%m log message 内容, 即 用户写 log 的具体信息
%n 回车换行
%c category 名字
%d 时间戳
%p 优先级
%r 距离上一次写 log 的间隔, 单位毫秒
%R 距离上一次写 log 的间隔, 单位秒
%t 线程名
%u 处理器时间
%x NDC ?

窃以为,以下格式就足够了,即输出 "时间 [线程名] 优先级 - log内容 回车换行"

%d [%t] %p - %m%n

配置的知识就差不多了,现在看看实际代码应用

首先是初始化 log4cpp 的配置,例如我的配置文件名是 log4cpp.properties

try
{
log4cpp::PropertyConfigurator::configure("log4cpp.properties");
}
catch (log4cpp::ConfigureFailure & f)
{
std::cerr << "configure problem " << f.what() << std::endl;
}

初始化完成后,就可以这样用了(具体的应用技巧,你自己摸索吧)

log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample"));

log.debug("test debug log");
log.info("test info log");

// 用 sample.son

log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample.son"));

log.debug("test debug log of son");
log.info("test info log of son");


// 用 sample.daughter

log4cpp::Category & log = log4cpp::Category::getInstance(std::string("sample.daughter"));

log.debug("test debug log of daughter");
log.info("test info log of daughter");

再举一个在自定义类中的使用

#include <log4cpp/Category.hh>

namespace demo
{
class Sample
{
public:
    Sample();
    ~Sample();

public:
    Testing(int i);

private:
    static log4cpp::Category & log;
};

}

#include "Sample.h"

namespace demo
{
log4cpp::Category & Sample::log = log4cpp::Category::getInstance(std::string("sample"));

Sample::Sample()
{
    log.debug("Sample::Sample()");
}

Sample::~Sample()
{
    log.debug("Sample::~Sample()");
}

Sample::Testing(int i)
{
    log.debug("Sample::Testing() : i=%d", i);
}
}

example of log4cpp properties configuration的更多相关文章

  1. spring boot -Properties & configuration

    72. Properties & configuration72.1 Automatically expand properties at build timeRather than hard ...

  2. Inspection info: Checks Spring Boot application .properties configuration files. Highlights unresolved and deprecated configuration keys and in

    Cannot resolve class or package ‘jdbc’ less… (Ctrl+F1) Inspection info: Checks Spring Boot applicati ...

  3. Log4cpp配置文件格式说明

    Log4cpp配置文件格式说明 博客分类: log4cpp log4cpp  log4cpp有3个主要的组件:categories(类别).appenders(附加目的地).和 layouts(布局) ...

  4. 【转】 log4cpp 的使用

    [转自] http://sogo6.iteye.com/blog/1154315     Log4cpp配置文件格式说明   log4cpp有3个主要的组件:categories(类别).append ...

  5. java编程中Properties类的具体作用和使用

    如果不熟悉 java.util.Properties类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的.(如清单 1 所示).最近更新的java.util.Properti ...

  6. Hibernate中的Configuration类

    Configuration类用来管理我们的配置文件的信息的,通过它,我们可以通过创建一个configuration实例来管理相应的配置文档,但是通常我们只创建一个configuration实例. 下面 ...

  7. MyBatis(3.2.3) - Configuring MyBatis using XML, Properties

    The properties configuration element can be used to externalize the configuration values into a prop ...

  8. Springboot 配置类( @Configuration) 不能使用@Value注解从application.propertyes中加载值以及Environment为null解决方案

    最近遇到个场景,需要在使用@Bean注解定义bean的时候为对象设置一些属性,比如扫描路径,因为路径经常发布新特性的时候需要修改,所以就计划着放在配置文件中,然后通过@ConfigurationPro ...

  9. Unit Testing of Spring MVC Controllers: Configuration

    Original Link: http://www.petrikainulainen.net/programming/spring-framework/unit-testing-of-spring-m ...

随机推荐

  1. 关闭自动弹出照片自动弹出iTunes以及关闭手机照片流

    关闭自动弹出照片自动弹出iTunes以及关闭手机照片流 如何阻止iPhone连接Mac后自动弹出照片? 时间:2015/6/18 17:07:15来源:本站原创作者:Chenjh我要评论 很多新 iP ...

  2. google fcm 推送的流程

    总结:1.给一个人推,能成功,2.给多个人推,有两种,一种是给组推,一种是给主题推,之前用的是组推,但是不成功,这里换成主题推: <?phpnamespace App\Http\Controll ...

  3. 如何消除类型是submit类型的按钮的默认文字 ‘确认提交’

    只需要加上value="" 即可.默认的文字就可以去掉了.

  4. linux命令(17):pwd命令

    1:查看当前工作目录的完整路径命令:pwd 2:目录连接链接时,pwd -P  显示出实际路径,而非使用连接(link)路径:pwd显示的是连接路径: [root@host-172-168-80-55 ...

  5. tk界面版股票下载

    from tkinter import * import urllib.request import re,os import threading from tkinter import filedi ...

  6. 你想了解的轮询、长轮询和websocket都在这里了

    日常生活中,有很多需要数据的实时更新,比如群聊信息的实时更新,还有投票系统的实时刷新等 实现的方式有很多种,比如轮询.长轮询.websocket 轮询 轮询是通过设置页面的刷新频率(设置多长时间自动刷 ...

  7. 今天开始学模式识别与机器学习(PRML),章节5.1,Neural Networks神经网络-前向网络。

    今天开始学模式识别与机器学习Pattern Recognition and Machine Learning (PRML),章节5.1,Neural Networks神经网络-前向网络. 话说上一次写 ...

  8. ELK日志处理

    ELK的工作原理: 使用多播进行机器发现同一个集群内的节点,并汇总各个节点的返回组成一个集群,主节点要读取各个节点的状态,在关键时候进行数据的恢复,主节点会坚持各个节点的状态,并决定每个分片的位置,通 ...

  9. bzoj 1449 费用流

    思路:先把没有进行的场次规定双方都为负,对于x胜y负 变为x + 1胜 y - 1 负所需要的代价为 2 * C[ i ] * x  - 2 * D[ i ] * y + C[ i ] + D[ i ...

  10. SpringMVC组件配置

    web.xml . springmvc-servlet.xml 配置SpringMVC四大组件. web.xml 配置前端控制器:前端控制器就是个servlet <!-- 配置前端控制器 --& ...