log4cxx第三篇----使用多个logger

使用多个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

[plain] view plaincopyprint?

  1. log4j.logger.logger0 = TRACE, ap0

设置子Logger不继承父Loggerappender

[plain] view plaincopyprint?

  1. log4j.additivity.logger0=false

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

[plain] view plaincopyprint?

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

在程序中获取子Logger实例

首先是加载配置文件:

[plain] view plaincopyprint?

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

获取子Logger实例:

[plain] view plaincopyprint?

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

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

下述代码配置了8个子Logger,用于FreeJudger项目中判题线程的日志:

[plain] view plaincopyprint?

  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

时间: 2024-10-16 01:46:50

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

ELK统一日志管理平台第三篇-logstash grok插件的使用

1. ELK统一日志管理平台第三篇-logstash grok插件的使用   在本篇博文中,主要讲解如下几个知识点和实践经验,供大家参考:   1. 关于JAVA应用程序的日志内容标准规范:   2. 如何使用logstash的grok插件来完成message字段的拆分:   3. 定时删除Es的索引: 1. 关于JAVA应用程序的日志内容标准规范:   最近公司一直在主推ELK这个项目,而我是ELK这个项目的运维人员.所以针对ELK项目会有很多经验输出:由于我们公司的业务系统以JAVA语言开发

HttpApplication处理对象与HttpModule处理模块 (第三篇)

一.HttpApplication对象简述 在HttpRuntime创建了HttpContext对象之后,HttpRuntime将随后创建一个用于处理请求的对象,这个对象的类型为HttpApplication. HttpRuntime管理一个定义在System.Web命名空间下的HttpApplicationFactory类的时候,HttpApplicationFactory通过工厂模式管理HttpApplication对象.在HttpApplicationFactory内部维护了一个HttpA

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

SylixOS ARM BSP 第三篇【bspInit.c】

此篇博客为 SylixOS ARM BSP 编写连载的第三篇,主要介绍 bspInit.c 文件具体实现. bspInit.c 为 BSP 操作系统初始化部分代码,通常由 startup.S 初始完基本处理器参数后调用,下面以 S3C2440A 处理器为例,逐块介绍 bspInit.c 代码. SylixOS ARM BSP 第二篇中提到 startup.S 初始化完成会将会调用 bspInit() 函数,此函数用于初始化操作系统,并开始多任务调度. int bspInit (void) {  

谷歌的三篇论文

传说中的谷歌三篇论文 MapReduce: Simpli?ed Data Processing on Large Clusters The Google file system Bigtable: A Distributed Storage System for Structured Data 谷歌学术立搜可下,每日潜心研习,假以时日,便可大成.

认识元数据和IL(上) <第三篇>

说在,开篇之前 很早就有说说Metadata(元数据)和IL(中间语言)的想法了,一直在这篇开始才算脚踏实地的对这两个阶级兄弟投去些细关怀,虽然来得没有<第一回:恩怨情仇:is和as>那么迅速,但是Metadata和IL却是绝对重量级的内容,值得我们在任何时间关注,本文就是开始. 1 引言 你可曾想到,我们的C#代码,编译之后究竟为何物?你可曾认知,我们的可执行程序,运行之时的轨迹究竟为哪般?那么,本文通过对Metadata(元数据)和IL(Intermediate Language, 中间语

编写小游戏《贪头蛇》第三篇

源码下载地址:http://download.csdn.net/detail/oyangyufu/7492917 点击NEW GAME按钮,进入游戏主场景 代码: 游戏背景 layer = (CCLayer*)this->getChildren()->objectAtIndex(SnakeConstants::LAYER_BACKGROUND); layer->setTouchEnabled(false); //游戏背景 CCSize size = CCDirector::sharedD

ORA-38760: This database instance failed to turn on flashback database 第三篇

ORA-38760: This database instance failed to turn on flashback database  第三篇 第一篇 第二篇 问题现象: 在数据库alert告警日志中看见例如以下信息: Completed: ALTER DATABASE MOUNT Wed Nov 19 04:57:28 2014 alter database open Errors in file /DBSoft/diag/rdbms/woo/woo/trace/woo_ora_593

第三篇 读后感

      今天读了大道至简中的第三篇关于团队缺乏的不只是管理的文章,其中作者引用了<汉书>中的“言人三人众”,来说明团队是至少以三个人为规模的,而三人构成的团队,这样便具备了团队的一些基本特征:主从.监督和责任.团队并不是个体能够组成的,两个人同样不能成为一个团队,两人则互相支撑,正如古文中“从”字是二人互立的,并没有监督.老师课上所说的一个和尚有水喝,两个和尚抬水喝,三个和尚没水喝的故事,三个和尚之所以没水喝是因为没有能够的安排没有领导人,三个人本能比一个人有更高的效率,正如文中所说的的一