log4cxx–使用多个logger「建议收藏」

log4cxx–使用多个logger「建议收藏」转载自:http://blog.csdn.net/crazyhacking/article/details/9668267使用多个logger时,所有logger的配置写在一个配置文件里面两个例子:1一个继承的例子(http://logging.apache.org/log4cxx/)//filecom/foo/bar.h#include”log4cxx/log

大家好,又见面了,我是你们的朋友全栈君。

转载自:http://blog.csdn.net/crazyhacking/article/details/9668267

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

  1. log4j.logger.logger0 = TRACE, ap0  

设置子Logger不继承父Loggerappender

[plain] 
view plain
copy

  1. log4j.additivity.logger0=false  

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

[plain] 
view plain
copy

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

在程序中获取子Logger实例

首先是加载配置文件:

[plain] 
view plain
copy

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

获取
子Logger实例:

[plain] 
view plain
copy

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

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

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

[plain] 
view plain
copy

  1. log4j.additivity.gather = false  
  2. log4j.rootLogger=TRACE  
  3.   
  4. log4j.logger.logger0 = TRACE, ap0  
  5. log4j.logger.logger1 = TRACE, ap1  
  6. log4j.logger.logger2 = TRACE, ap2  
  7. log4j.logger.logger3 = TRACE, ap3  
  8. log4j.logger.logger4 = TRACE, ap4  
  9. log4j.logger.logger5 = TRACE, ap5  
  10. log4j.logger.logger6 = TRACE, ap6  
  11. log4j.logger.logger7 = TRACE, ap7  
  12. log4j.logger.logger8 = TRACE, ap8  
  13.   
  14. log4j.additivity.logger0=false  
  15. log4j.additivity.logger1=false  
  16. log4j.additivity.logger2=false  
  17. log4j.additivity.logger3=false  
  18. log4j.additivity.logger4=false  
  19. log4j.additivity.logger5=false  
  20. log4j.additivity.logger6=false  
  21. log4j.additivity.logger7=false  
  22. log4j.additivity.logger8=false  
  23.   
  24. log4j.appender.logfile.encoding=UTF-8  
  25.   
  26. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  27. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  28. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) – %m%n  
  29.   
  30. log4j.appender.R.MaxFileSize=100KB  
  31.   
  32. log4j.appender.ap0=org.apache.log4j.RollingFileAppender  
  33. log4j.appender.ap0.ImmediateFlush=true   
  34. log4j.appender.ap0.File=./0.log  
  35. log4j.appender.ap0.MaxBackupIndex=10  
  36. log4j.appender.ap0.layout=org.apache.log4j.PatternLayout  
  37. log4j.appender.ap0.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
  38.   
  39. log4j.appender.ap1=org.apache.log4j.RollingFileAppender  
  40. log4j.appender.ap1.ImmediateFlush=true   
  41. log4j.appender.ap1.File=./1.log  
  42. log4j.appender.ap1.MaxBackupIndex=10  
  43. log4j.appender.ap1.layout=org.apache.log4j.PatternLayout  
  44. log4j.appender.ap1.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
  45.   
  46. log4j.appender.ap2=org.apache.log4j.RollingFileAppender  
  47. log4j.appender.ap2.ImmediateFlush=true   
  48. log4j.appender.ap2.File=./2.log  
  49. log4j.appender.ap2.MaxBackupIndex=10  
  50. log4j.appender.ap2.layout=org.apache.log4j.PatternLayout  
  51. log4j.appender.ap2.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
  52.   
  53. log4j.appender.ap3=org.apache.log4j.RollingFileAppender  
  54. log4j.appender.ap3.ImmediateFlush=true   
  55. log4j.appender.ap3.File=./3.log  
  56. log4j.appender.ap3.MaxBackupIndex=10  
  57. log4j.appender.ap3.layout=org.apache.log4j.PatternLayout  
  58. log4j.appender.ap3.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
  59.   
  60. log4j.appender.ap4=org.apache.log4j.RollingFileAppender  
  61. log4j.appender.ap4.ImmediateFlush=true   
  62. log4j.appender.ap4.File=./4.log  
  63. log4j.appender.ap4.MaxBackupIndex=10  
  64. log4j.appender.ap4.layout=org.apache.log4j.PatternLayout  
  65. log4j.appender.ap4.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
  66.   
  67. log4j.appender.ap5=org.apache.log4j.RollingFileAppender  
  68. log4j.appender.ap5.ImmediateFlush=true   
  69. log4j.appender.ap5.File=./5.log  
  70. log4j.appender.ap5.MaxBackupIndex=10  
  71. log4j.appender.ap5.layout=org.apache.log4j.PatternLayout  
  72. log4j.appender.ap5.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
  73.   
  74. log4j.appender.ap6=org.apache.log4j.RollingFileAppender  
  75. log4j.appender.ap6.ImmediateFlush=true   
  76. log4j.appender.ap6.File=./6.log  
  77. log4j.appender.ap6.MaxBackupIndex=10  
  78. log4j.appender.ap6.layout=org.apache.log4j.PatternLayout  
  79. log4j.appender.ap6.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
  80.   
  81. log4j.appender.ap7=org.apache.log4j.RollingFileAppender  
  82. log4j.appender.ap7.ImmediateFlush=true   
  83. log4j.appender.ap7.File=./7.log  
  84. log4j.appender.ap7.MaxBackupIndex=10  
  85. log4j.appender.ap7.layout=org.apache.log4j.PatternLayout  
  86. log4j.appender.ap7.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
  87.   
  88. log4j.appender.ap8=org.apache.log4j.RollingFileAppender  
  89. log4j.appender.ap8.ImmediateFlush=true   
  90. log4j.appender.ap8.File=./8.log  
  91. log4j.appender.ap8.MaxBackupIndex=10  
  92. log4j.appender.ap8.layout=org.apache.log4j.PatternLayout  
  93. log4j.appender.ap8.layout.ConversionPattern=%5p %d{HH:mm:ss} — %m%n  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148715.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java缓存设置_缓存数据可以清除吗

    java缓存设置_缓存数据可以清除吗1、@Cacheable(key="#vo.toString()",value="licence")//载入缓存2、@CacheEvict(key="#vo.toString()",value="licence")//清除缓存3、缓存设置在service层生效4、config目录下建ehcache.xml5、ehcache.xml配置如下<ehcachex…

    2022年10月4日
    2
  • CAS 单点登录/登出 系统「建议收藏」

    CAS 单点登录/登出 系统「建议收藏」前言:  在我们的实际开发中,更多的是采用分布式系统。那么问题来了,对于分布式系统的登录问题,我们如何解决呢?  如果说我们在每一个系统中都要进行一次登录,那么用户体验度也就差的没法用了。以京东商城为例,如果用户在登录京东商城的时候需要登录一次,在查询商品的时候还有在登录一次,加入购物车是还要重新登录,…(注意,每跳过一个页面都是进入了一个新的系统,请看他的url地址的变化)…

    2022年5月9日
    251
  • C++中list用法详解[通俗易懂]

    C++中list用法详解[通俗易懂]1.关于list容器list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。list的实现大概是这样的:list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域保存了前驱元素的首地

    2022年7月12日
    27
  • oracle优化器统计信息相关

    优化器使用统计信息来生成每个sql语句最优的执行计划。准确的统计信息对于数据库的效率至关重要。dba和程序开发人员都应该了解一些统计信息相关知识,这可以使你更好的理解为什么会生成一个你看到的执行计划,知其然且知其所以然。

    2022年4月8日
    36
  • C#中什么是泛型

    C#中什么是泛型参考视频c#教程泛型集合与非泛型集合最大的区别在于,泛型集合,不需要进行装箱和拆箱的操作。如集合元素为值类型,通常泛型集合要优于非泛型集合,并优于从非泛型集合派生出来的类型,泛是广泛的意思,而型是数据类型。这里的泛型可以理解为应用广泛的数据类型。为了提高性能及维护类型安全,一般最好采用泛型集合。如果两个类的内容完全一样,只是处理的数据类型不同。那么,采用泛型是一个不错的选择。泛型类用于封装不是特定于具体数据类型的操作,通常用于集合。诸如从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存

    2022年6月16日
    33
  • Informatica ETL开发入门实例

    Informatica ETL开发入门实例Informatica客户端工具:5个Designer——定义源及目标结构设计转换规则,生成ETL映射RepositoryManager——元数据资料库,依赖性分析,安全性管理等RepositoryServerAdministratorConsole——Repository的建立与维护WorkflowManager——合理的实现复杂的ETL工作流基于时间或事件的作业高度WorkflowMonitor——监控workflow和session,生成工作日志及报告…

    2022年6月11日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号