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 barbar.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 plaincopyprint?
- log4j.logger.logger0 = TRACE, ap0
设置子Logger不继承父Logger的appender:
[plain] view plaincopyprint?
- log4j.additivity.logger0=false
设置子Logger所使用的日志文件,下述代码将logger0的日志文件设定为当前程序目录下的0.log:
[plain] view plaincopyprint?
- log4j.appender.ap0.File=./0.log
在程序中获取子Logger实例
首先是加载配置文件:
[plain] view plaincopyprint?
- log4cxx::PropertyConfigurator::configure(配置文件名称);
获取子Logger实例:
[plain] view plaincopyprint?
- log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(子Logger名[例如上文中的"logger0"]);
FreeJudger项目中使用的完整配置文件
下述代码配置了8个子Logger,用于FreeJudger项目中判题线程的日志:
[plain] view plaincopyprint?
- log4j.additivity.gather = false
- log4j.rootLogger=TRACE
- log4j.logger.logger0 = TRACE, ap0
- log4j.logger.logger1 = TRACE, ap1
- log4j.logger.logger2 = TRACE, ap2
- log4j.logger.logger3 = TRACE, ap3
- log4j.logger.logger4 = TRACE, ap4
- log4j.logger.logger5 = TRACE, ap5
- log4j.logger.logger6 = TRACE, ap6
- log4j.logger.logger7 = TRACE, ap7
- log4j.logger.logger8 = TRACE, ap8
- log4j.additivity.logger0=false
- log4j.additivity.logger1=false
- log4j.additivity.logger2=false
- log4j.additivity.logger3=false
- log4j.additivity.logger4=false
- log4j.additivity.logger5=false
- log4j.additivity.logger6=false
- log4j.additivity.logger7=false
- log4j.additivity.logger8=false
- log4j.appender.logfile.encoding=UTF-8
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
- log4j.appender.R.MaxFileSize=100KB
- log4j.appender.ap0=org.apache.log4j.RollingFileAppender
- log4j.appender.ap0.ImmediateFlush=true
- log4j.appender.ap0.File=./0.log
- log4j.appender.ap0.MaxBackupIndex=10
- log4j.appender.ap0.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap0.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
- log4j.appender.ap1=org.apache.log4j.RollingFileAppender
- log4j.appender.ap1.ImmediateFlush=true
- log4j.appender.ap1.File=./1.log
- log4j.appender.ap1.MaxBackupIndex=10
- log4j.appender.ap1.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap1.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
- log4j.appender.ap2=org.apache.log4j.RollingFileAppender
- log4j.appender.ap2.ImmediateFlush=true
- log4j.appender.ap2.File=./2.log
- log4j.appender.ap2.MaxBackupIndex=10
- log4j.appender.ap2.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap2.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
- log4j.appender.ap3=org.apache.log4j.RollingFileAppender
- log4j.appender.ap3.ImmediateFlush=true
- log4j.appender.ap3.File=./3.log
- log4j.appender.ap3.MaxBackupIndex=10
- log4j.appender.ap3.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap3.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
- log4j.appender.ap4=org.apache.log4j.RollingFileAppender
- log4j.appender.ap4.ImmediateFlush=true
- log4j.appender.ap4.File=./4.log
- log4j.appender.ap4.MaxBackupIndex=10
- log4j.appender.ap4.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap4.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
- log4j.appender.ap5=org.apache.log4j.RollingFileAppender
- log4j.appender.ap5.ImmediateFlush=true
- log4j.appender.ap5.File=./5.log
- log4j.appender.ap5.MaxBackupIndex=10
- log4j.appender.ap5.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap5.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
- log4j.appender.ap6=org.apache.log4j.RollingFileAppender
- log4j.appender.ap6.ImmediateFlush=true
- log4j.appender.ap6.File=./6.log
- log4j.appender.ap6.MaxBackupIndex=10
- log4j.appender.ap6.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap6.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
- log4j.appender.ap7=org.apache.log4j.RollingFileAppender
- log4j.appender.ap7.ImmediateFlush=true
- log4j.appender.ap7.File=./7.log
- log4j.appender.ap7.MaxBackupIndex=10
- log4j.appender.ap7.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap7.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
- log4j.appender.ap8=org.apache.log4j.RollingFileAppender
- log4j.appender.ap8.ImmediateFlush=true
- log4j.appender.ap8.File=./8.log
- log4j.appender.ap8.MaxBackupIndex=10
- log4j.appender.ap8.layout=org.apache.log4j.PatternLayout
- log4j.appender.ap8.layout.ConversionPattern=%5p %d{HH:mm:ss} -- %m%n
转载于:https://www.cnblogs.com/For-her/p/3922536.html
log4cxx第三篇----使用多个logger相关推荐
- 初学Python——文件操作第三篇
一.引言 什么?有了第二篇文件操作还不够?远远不够!而且在读完第三篇文件操作还是不够.关于文件的操作,后续的学习中将不断学习新的操作方式,使用更加合适的方法. 进入正题,上一篇讲到,Python对文件 ...
- SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka篇
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...
- centOS7 LNMP+phpmyadmin环境搭建 第三篇phpmyadmin安装
这篇文章主要介绍了CentOS7 LNMP+phpmyadmin环境搭建,第三篇phpmyadmin安装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 之前我们已经安装了lnmp的环境,现在让我们 ...
- IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上)...
IIS负载均衡-Application Request Route详解第三篇:使用ARR进行Http请求的负载均衡(上) 在前两篇文章中,我们已经讲述如何配置与安装ARR,从本篇文章开始,我们将重点的 ...
- hadoop作业初始化过程详解(源码分析第三篇)
(一)概述 我们在上一篇blog已经详细的分析了一个作业从用户输入提交命令到到达JobTracker之前的各个过程.在作业到达JobTracker之后初始化之前,JobTracker会通过submit ...
- 厉害了,网易伏羲三篇论文上榜 AI 顶会 ACL
近日,国际AI顶尖学术会议ACL 2021(Annual Meeting of the Associationfor Computational Linguistics)公布了论文录用结果.网易伏羲共 ...
- 小米和西工大联手,三篇论文被Interspeech接收
翻译 | 林椿眄 编辑 | 阿司匹林 出品 | 人工智能头条(公众号ID:AI_Thinker) 小米和西北工业大学的"交情"不浅. 去年 7 月,小米和西工大计算机学院的谢磊教授 ...
- 12.6%!IJCAI 2020接收率断崖式下跌,但还是有华人大佬中了三篇
机器之心报道 参与:泽南.张倩.蛋酱 人工智能顶会 IJCAI 2020 论文接收结果出炉了,但大部分小伙伴却高兴不起来. 北京时间 4 月 20 日晚,IJCAI 2020 接收结果出炉了:在 47 ...
- 华南农业大学在Annual Review of Microbiology发表三篇综述文章
华南农业大学群体微生物研究中心科研人员应国际权威微生物综述期刊Annual Review of Microbiology的邀请,分别于2019年6月21日和7月5日在线发表了三篇综述文章,分别总结了细 ...
最新文章
- ubuntu 终端常用命令
- java groovy 动态计算_计算Java / Groovy中的经过时间
- HDU 2757 Ocean Currents
- js text 和 html,JS DOM innerText和textContent的区别
- LeetCode 663. 均匀树划分(树形DP)
- 3 css 奖品出现弹出动画_基于jquery css3实现点击动画弹出表单源码特效
- python解题教学_PYTHON教学设计:计算机解决问题的过程教案-精.doc
- oracle PROFILE的使用学习
- 我如何获得了梦想中的亚马逊工作机会?
- vue css隐藏_Vue+BootStrapV4,构建响应式、移动优先项目——BootstrapVue
- 极限编程 Extreme Programming (中英文对照)图形解释
- JavaSE知识点:finalize,treeMap
- leapmotion 在unity中看不到手
- c语言两矩阵相乘算法,用c语言实现两个矩阵相乘怎么做?
- 你不知道的JavaScript APIs
- linux防火墙之firewalld
- android Bluetooth连接方式 SCO ACL
- 支撑软件开发人员的三种精神
- 计算机资源不足 新用户无法登录怎么办,电脑系统资源不足及解决办法
- Xilinx Spartan6中oserdes2原语输出LVDS信号驱动液晶屏波形图
热门文章
- 2022-2028年中国汽车天线行业市场需求与投资规划分析报告
- 2022-2028年中国自动化设备市场研究及前瞻分析报告
- python实现二叉树的重建1 之由前序遍历和中序遍历重建
- Camera系列规格参数
- GPU指令集技术分析
- 英特尔Intel® Arria® 10 FPGA加速器设计
- Visual SLAM
- 无人驾驶传感器融合技术
- 2021年大数据Kafka(三):❤️Kafka的集群搭建以及shell启动命令脚本编写❤️
- The expression cannot be a selector(occur after a dot)下面是 what went wrong: Execution failed for task