使用多个logger时,所有logger的配置写在一个配置文件里面

两个例子:

1 一个继承的例子(http://logging.apache.org/log4cxx/

//  file com/foo/bar.h
#include "log4cxx/logger.h" namespace com {
namespace foo {
class Bar {
static log4cxx::LoggerPtr logger; public:
void doIt();
}
}
}
// file bar.cpp
#include "com/foo/bar.h" using namespace com::foo;
using namespace log4cxx; LoggerPtr Bar::logger(Logger::getLogger("com.foo.bar")); void Bar::doIt() {
LOG4CXX_DEBUG(logger, "Did it again!")
}
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout # Print the date in ISO 8601 format
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n # Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
// file MyApp2.cpp

#include "com/foo/bar.h"
using namespace com::foo; // include log4cxx header files.
#include "log4cxx/logger.h"
#include "log4cxx/basicconfigurator.h"
#include "log4cxx/propertyconfigurator.h"
#include "log4cxx/helpers/exception.h" using namespace log4cxx;
using namespace log4cxx::helpers;
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
LoggerPtr logger(Logger::getLogger("MyApp")); int main(int argc, char **argv)
{
int result = EXIT_SUCCESS;
try
{
if (argc > 1)
{
// BasicConfigurator replaced with PropertyConfigurator.
PropertyConfigurator::configure(argv[1]);
}
else
{
BasicConfigurator::configure();
} LOG4CXX_INFO(logger, "Entering application.")
Bar bar
bar.doIt();
LOG4CXX_INFO(logger, "Exiting application.")
}
catch(Exception&)
{
result = EXIT_FAILURE;
} return result;
}

The output of MyApp configured with this file is shown below.

2000-09-07 14:07:41,508 [12345] INFO  MyApp - Entering application.
2000-09-07 14:07:41,529 [12345] INFO MyApp - Exiting application.

2 使用多个logger

前置知识

  • log4cxx可以使用配置文件进行设置,并且其设置方式与log4j兼容
  • log4cxx库对日志流设置,只需更改配置文件中的appender属性;
  • log4cxx支持Logger继承机制,默认会继承父Loggerappender,由于要将日志流输出到多个文件中,因此需要将子Logger的继承属性设置为false.

配置子Logger

为了最大程度的灵活性,log4cxx引入了子Logger这个概念,即拥有与父Logger不同的行为,和编程语言中的OOP概念一致。

下面是在配置文件中定义一个子Logger的代码,其中ap0logger0使用的appender

  1. log4j.logger.logger0 = TRACE, ap0

设置子Logger不继承父Loggerappender

  1. log4j.additivity.logger0=false

设置子Logger所使用的日志文件,下述代码将logger0的日志文件设定为当前程序目录下的0.log

  1. log4j.appender.ap0.File=./0.log

在程序中获取子Logger实例

首先是加载配置文件:

  1. log4cxx::PropertyConfigurator::configure(配置文件名称);

获取子Logger实例:

  1. log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(子Logger名[例如上文中的"logger0"]);

FreeJudger项目中使用的完整配置文件

下述代码配置了8个子Logger,用于FreeJudger项目中判题线程的日志:
  1. log4j.additivity.gather = false
  2. log4j.rootLogger=TRACE
  3. log4j.logger.logger0 = TRACE, ap0
  4. log4j.logger.logger1 = TRACE, ap1
  5. log4j.logger.logger2 = TRACE, ap2
  6. log4j.logger.logger3 = TRACE, ap3
  7. log4j.logger.logger4 = TRACE, ap4
  8. log4j.logger.logger5 = TRACE, ap5
  9. log4j.logger.logger6 = TRACE, ap6
  10. log4j.logger.logger7 = TRACE, ap7
  11. log4j.logger.logger8 = TRACE, ap8
  12. log4j.additivity.logger0=false
  13. log4j.additivity.logger1=false
  14. log4j.additivity.logger2=false
  15. log4j.additivity.logger3=false
  16. log4j.additivity.logger4=false
  17. log4j.additivity.logger5=false
  18. log4j.additivity.logger6=false
  19. log4j.additivity.logger7=false
  20. log4j.additivity.logger8=false
  21. log4j.appender.logfile.encoding=UTF-8
  22. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  23. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  24. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
  25. log4j.appender.R.MaxFileSize=100KB
  26. log4j.appender.ap0=org.apache.log4j.RollingFileAppender
  27. log4j.appender.ap0.ImmediateFlush=true
  28. log4j.appender.ap0.File=./0.log
  29. log4j.appender.ap0.MaxBackupIndex=10
  30. log4j.appender.ap0.layout=org.apache.log4j.PatternLayout
  31. log4j.appender.ap0.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
  32. log4j.appender.ap1=org.apache.log4j.RollingFileAppender
  33. log4j.appender.ap1.ImmediateFlush=true
  34. log4j.appender.ap1.File=./1.log
  35. log4j.appender.ap1.MaxBackupIndex=10
  36. log4j.appender.ap1.layout=org.apache.log4j.PatternLayout
  37. log4j.appender.ap1.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
  38. log4j.appender.ap2=org.apache.log4j.RollingFileAppender
  39. log4j.appender.ap2.ImmediateFlush=true
  40. log4j.appender.ap2.File=./2.log
  41. log4j.appender.ap2.MaxBackupIndex=10
  42. log4j.appender.ap2.layout=org.apache.log4j.PatternLayout
  43. log4j.appender.ap2.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
  44. log4j.appender.ap3=org.apache.log4j.RollingFileAppender
  45. log4j.appender.ap3.ImmediateFlush=true
  46. log4j.appender.ap3.File=./3.log
  47. log4j.appender.ap3.MaxBackupIndex=10
  48. log4j.appender.ap3.layout=org.apache.log4j.PatternLayout
  49. log4j.appender.ap3.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
  50. log4j.appender.ap4=org.apache.log4j.RollingFileAppender
  51. log4j.appender.ap4.ImmediateFlush=true
  52. log4j.appender.ap4.File=./4.log
  53. log4j.appender.ap4.MaxBackupIndex=10
  54. log4j.appender.ap4.layout=org.apache.log4j.PatternLayout
  55. log4j.appender.ap4.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
  56. log4j.appender.ap5=org.apache.log4j.RollingFileAppender
  57. log4j.appender.ap5.ImmediateFlush=true
  58. log4j.appender.ap5.File=./5.log
  59. log4j.appender.ap5.MaxBackupIndex=10
  60. log4j.appender.ap5.layout=org.apache.log4j.PatternLayout
  61. log4j.appender.ap5.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
  62. log4j.appender.ap6=org.apache.log4j.RollingFileAppender
  63. log4j.appender.ap6.ImmediateFlush=true
  64. log4j.appender.ap6.File=./6.log
  65. log4j.appender.ap6.MaxBackupIndex=10
  66. log4j.appender.ap6.layout=org.apache.log4j.PatternLayout
  67. log4j.appender.ap6.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
  68. log4j.appender.ap7=org.apache.log4j.RollingFileAppender
  69. log4j.appender.ap7.ImmediateFlush=true
  70. log4j.appender.ap7.File=./7.log
  71. log4j.appender.ap7.MaxBackupIndex=10
  72. log4j.appender.ap7.layout=org.apache.log4j.PatternLayout
  73. log4j.appender.ap7.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
  74. log4j.appender.ap8=org.apache.log4j.RollingFileAppender
  75. log4j.appender.ap8.ImmediateFlush=true
  76. log4j.appender.ap8.File=./8.log
  77. log4j.appender.ap8.MaxBackupIndex=10
  78. log4j.appender.ap8.layout=org.apache.log4j.PatternLayout
  79. log4j.appender.ap8.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n

log4cxx第三篇----使用多个logger的更多相关文章

  1. log4cxx入门第一篇--一个小例子

    先看官网:http://logging.apache.org/log4cxx/index.html 转载自:http://wenku.baidu.com/view/d88ab5a9d1f34693da ...

  2. 初学Python——文件操作第三篇

    一.引言 什么?有了第二篇文件操作还不够?远远不够!而且在读完第三篇文件操作还是不够.关于文件的操作,后续的学习中将不断学习新的操作方式,使用更加合适的方法. 进入正题,上一篇讲到,Python对文件 ...

  3. SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka篇

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  4. EnjoyingSoft之Mule ESB开发教程第三篇:Mule message structure - Mule message结构

    目录 1. 探索Mule Message结构 2. Mule Message的Payload 3. Mule Message的Property 4. Mule Message的Attachment 5 ...

  5. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  6. (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...

  7. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. 第三篇 Entity Framework Plus 之 Query Cache

    离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...

  9. 我的屌丝giser成长记-研三篇

    进入研三以来,基本都是自己的自由时间了,从导师的项目抽离出来,慢慢的都交给师弟他们来负责.研三的核心任务就是找工作以及写毕业论文,因为有导师科研基金项目成果作为支撑,所以自己的论文没什么可担心,一切都 ...

随机推荐

  1. ignite中的消息使用实例

    消息很简单,跟其他的mq相仿,关键点: 一,添加监听,订阅主题 二,发送消息 写了一个简单的示例: Receiver.java package test.ignite.broadcast; impor ...

  2. ignite服务中的bean注入为空

    在写ignite服务的时候,通常服务配置在启动文件中: <bean class="org.apache.ignite.services.ServiceConfiguration&quo ...

  3. 解决TortoiseGit 推送 拉取需要密码的问题

    找到解决了方法: 1)运行PuTTYGen,在Conversions菜单中点击Import key,选择ssh-keygen生成的私钥文件所在位置,比如id_rsa文件. 2)点击Save priva ...

  4. JSON文件存入MySQL数据库

    目标:将不同格式的JSON文件存入MySQL数据库 涉及的点有: 1. java处理JSON对象,直接见源码. 2. java.sql.SQLException: Incorrect string v ...

  5. android 设计模式学习

    1:单例模式 //对于创建开销较大的类可使用此方法,保证全局一个实例,在程序运行过程中该类不会因新建额外对象产生开销.示例代码如下:public class Singleton { private s ...

  6. 转:loadrunner关联及web_reg_save_param方法浅析

    一.什么是关联 关联(correlation):脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态 ...

  7. maven学习笔记 1

    1    概述 1.1 Maven是什么 1.2 为什么要用Maven 2    怎么用Maven 2.1 Maven仓库 2.2 Maven安装 2.3 Eclipse插件 2.4 Maven常用命 ...

  8. 剑指offer替换空格

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  9. php源码分析之base64_encode函数

    base64_encode编码规律分析 字符串长度除以3向上取整乘以4等于编码后的字符串长度 ceil(strlen($string)/3)*4 = strlen(base64_encode($str ...

  10. Android AudioPolicyService和AudioPolicyManager

    AudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有 MediaSever加载,加载的代码位于:framewor ...