使用多个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. nginx+php-fpm 的配置下,php的错误日志

    发现php 运行错误时,浏览器的网页上并没有输出php的错误日志.那php的错误日志在哪里呢? 发现在 /var/log/nginx/error.log文件中. 怎么样才能在浏览器的网页中输出php的 ...

  2. ng-init小解

    ng-init可有多个表达式 ng-init= "a= 1;b= 2" 在这里头定义的变量会加入scope作用域 ng-init只能加入不必要的简单逻辑,输入alert() 定义数 ...

  3. 转 Oracle12c/11个 Client安装出现"[INS-30131]"错误“请确保当前用户具有访问临时位置所需的权限”解决办法之完整版

    错误分析:安装时exe会自动解压到C:\Users\Administrator\AppData\Local\Temp再进行安装,当文件夹权限不足时就会拒绝安装程序的访问: 第一步:  在win+R输入 ...

  4. win8上cmder文字重叠问题

    1.用过ubuntu上的bash,zsh后发现win自带的cmd弱爆了,在网上搜索后找到了代替品cmder,下载安装后好发现中文错位的问题, 状况如下: 修复方法:把设置里面的Monospace选项勾 ...

  5. Android OpenGL ES(十三)通用的矩阵变换指令 .

    Android OpenGL ES 对于不同坐标系下坐标变换,大都使用矩阵运算的方法来定义和实现的.这里介绍对应指定的坐标系(比如viewmodel, projection或是viewport) An ...

  6. POJ 2031 Building a Space Station 最小生成树模板

    题目大意:在三维坐标中给出n个细胞的x,y,z坐标和半径r.如果两个点相交或相切则不用修路,否则修一条路连接两个细胞的表面,求最小生成树. 题目思路:最小生成树树模板过了,没啥说的 #include& ...

  7. ARC属性中还能使用assign,copy,retain这些关键字吗

    http://blog.sina.com.cn/s/blog_6531b9b80101c6cr.html      很早以前比较弱,网上不知道哪里看了篇博文,留下了ARC属性中不能使用retain关键 ...

  8. python 第三方库下载

    C:\Python27\Scripts 路径下: easy_install.exe: C:\Python27\Scripts>easy_install.exe pycrypto pip.exe: ...

  9. struts2+ajax实现异步验证

    由于老师布置作业的需要,在添加管理员的时候,要实现验证添加的管理员的用户名是否在数据库中已经存在,然后再客户端给用户一个提示.我首先想到的就是利用ajax实现异步验证技术,由于利用的ssh框架,所以在 ...

  10. Excel工作表 表名导出

    Technorati 标签: microsoft office,vbs,excel   1: Attribute VB_Name = "表名导出" 2: Sub test() 3: ...