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继承机制,默认会继承父Logger的appender,由于要将日志流输出到多个文件中,因此需要将子Logger的继承属性设置为false.

配置子Logger

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

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

[plain] 
view plain
copy

  1. log4j.logger.logger0 = TRACE, ap0  

设置子Logger不继承父Logger的appender:

[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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 笔记:解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to…

    笔记:解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to…今天重启游戏服务器在连接redis数据库时突然报错:MISCONFRedisisconfiguredtosaveRDBsnapshots,butitiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled,becausethisinstance

    2022年10月25日
  • java injector_java – Injector Hierarchy / Child Injector解释?「建议收藏」

    java injector_java – Injector Hierarchy / Child Injector解释?「建议收藏」Modules.override()在Stage.PRODUCTION中不起作用.您应该使用PrivateModule,其中绑定仅在私有模块内有效/可见,因此您可以将不同的实现类绑定到同一个接口.然后,您可以将Private模块安装到父模块,但是您必须显式公开()您希望其他模块可见的所有绑定.让我们说:DatabaseSearchModule.java(扩展PrivateModule)bind(P…

    2022年10月31日
  • matlab中示波器的用法_示波器单次触发设置

    matlab中示波器的用法_示波器单次触发设置在做Simulink仿真时,使用的Scope波形显示模块实际上也是一种Figure窗口,不过Matlab把Scope的菜单栏隐藏起来,只提供了几个有限的参数设置。如果需要对Scope中的图加上坐标、更改界面背景色等,没有菜单栏就基本上无从下手了。可以在打开你的mdl文件之后,在Matlab的命令行输入以下指令来恢复显示Scope的Figure菜单栏:>>set(0,’ShowHidd…

    2022年10月12日
  • linux扩容VBoxManage

    linux扩容VBoxManage//查看虚拟磁盘空间信息,确认确实是需要扩容的虚拟硬盘。VBoxManageshowhdinfo”F:\oracleVirtualBox\workspace\centos1\centos1.vdi”//计算要扩容的空间大小,我这里是要扩展到100G(1024*1024*1024*100)。set/a1024*1024*1024//扩展虚拟硬盘空间,最后的数字替换成上面计算出的硬盘空…

    2022年6月1日
  • UVA 11080 – Place the Guards(二分图判定)

    UVA 11080 – Place the Guards(二分图判定)

    2022年1月21日
  • idea2022最新激活码[最新免费获取]

    (idea2022最新激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1M…

    2022年3月13日

发表回复

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

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