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

相关推荐

  • linux目录结构详解_文件系统目录结构采用

    linux目录结构详解_文件系统目录结构采用前言平常linux系统用的也不少,那么linux下的每个目录都是用来干什么的,小伙伴们有仔细研究过吗?让我们来了解下吧Linux系统目录结构登录系统后,在当前命令窗口下输入命令:[root@

    2022年7月31日
  • vim搜索中文_vim编辑器搜索字符串

    vim搜索中文_vim编辑器搜索字符串2019独角兽企业重金招聘Python工程师标准>>>…

    2022年9月23日
  • linux常用命令菜鸟教程_初学者化妆必备用品清单

    linux常用命令菜鸟教程_初学者化妆必备用品清单一.学习Linux终端命令的原因1.Linux刚面世时并没有图形界面,所有的操作全靠命令完成,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等2.在职场中,大量的服务器维护工作都是在远程通过SSH客户端来完成的,并没有图形界面,所有的维护工作都需要通过命令来完成在职场中,作为后端程序员,必须要或多或少的掌握一些Linux常用的终端命令。3.Linux发行版本的命令大概有200多个,但是常用的命令只有10多个而已二.linux常用指令ls命令…

    2022年8月21日
  • [Android] Bitmap的内存计算

    本文聚焦的问题1、Bitmap中像素数据占用多大内存?如何计算?2、不同图片来源对内存大小有什么影响?Bitmap bitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);依然以如此声明一个bitmap为例,参数就决定了bitmap的大小。(以Android 8.0+平台为例,这行代码执行后占用的总内存大小=bitmap在…

    2022年3月11日
  • 原生android系统官网 source.android.com,存储  |  Android 开源项目  |  Android Open Source Project…「建议收藏」

    原生android系统官网 source.android.com,存储  |  Android 开源项目  |  Android Open Source Project…「建议收藏」Android一直在不断发展,可支持各种存储设备类型和功能。所有Android版本均支持配有传统存储(包括便携式存储和模拟存储)的设备。便携式存储是指物理介质(如SD卡或USB设备),用于进行临时数据传输/文件存储。物理介质可以随设备一起保留更长时间,但并非固定在设备上,可以移除。自Android1.0开始,SD卡已可用作便携式存储;Android6.0增加了对USB…

    2022年6月19日
  • nyaa镜像站 nyaa反向代理站「建议收藏」

    提供一个可以磁力转种子,并且资源中心里边是nyaa镜像站的网站:https://magnet-vip.com资源中心做了登录限定,防止无法访问!

    2022年4月7日

发表回复

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

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