使用多个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. ubuntu apt-get update 连接不到指定的源

    问题描述: ubuntu apt-get update 连接不到指定的源,修改了几个软件源还是连接不上,同样的软件源在别的机器上都可以正常使用,后来发现每次 sudo apt-get update操作 ...

  2. CodeForces 429B Working out 动态规划

    Description Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to loo ...

  3. execlp("ls","flw","-?",(char *)0) 为什么少了最后的一个参数就不行?

    execlp("ls","flw","-?",(char *)0) 为什么少了最后的一个参数就不行?

  4. linux视频学习5(top, 网络监控

    top命令的详解: 1. top :动态监控进程. 第一行:当前系统时间:  up  4days :服务器启动后的持续时间. 5 user 当前服务器上的用户数目 ; load average :负载 ...

  5. div.2/D. As Fast As Possible<数学题,二分>

    题目连接 题意: n个学生出去玩,要前进一段距离,租了一辆可以载k个人的车,问到达到目的地的最短时间. cin: n,l,v1,v2,k. £:所有人一起到达终点的时候时间最短. £:所有人走路和坐车 ...

  6. 直接拿来用!Facebook移动开源项目大合集

    直接拿来用!Facebook移动开源项目大合集 时间:2014-04-22 15:37 作者:唐小引 随着iOS依赖管理工具CocoaPods和大量第三方开源库成熟起来,业界积累了大量的优秀开源项目. ...

  7. (转)Unity3D移动平台动态读取外部文件全解析

    Unity3D移动平台动态读取外部文件全解析 c#语言规范 阅读目录 前言: 假如我想在editor里动态读取文件 移动平台的资源路径问题 移动平台读取外部文件的方法 补充: 回到目录 前言: 一直有 ...

  8. Android.mk与jni目录的关系

    附1: Android.mk与jni目录的关系: 在某目录下,如/src/modules1/下存放Android.mk和Application.mk,调用ndk-build试图编译时,会遇到如下错误: ...

  9. Hadoop: LongWritable cannot be cast to org.apache.hadoop.io.IntWritable

    写MR Job的时候遇到一个坑爹的异常: LongWritable cannot be cast to org.apache.hadoop.io.IntWritable 当写Map的时候,key的默认 ...

  10. 11--tag 和transform属性

    tag 和transform属性 1.tag 标签,就相当于身份识别的标码,可以通过tag值获取对应的对象. 2.使用transform 实现对象的平移和旋转. // // ViewControlle ...