当前位置: 首页 > 编程日记 > 正文

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继承机制,默认会继承父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.   
  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://www.cnblogs.com/For-her/p/3922536.html

相关文章:

authy不同账户间不同步_「第七期」shopify产品还能同步到微信小程序销售?看这里...

众所周知,微信坐拥12亿用户,已经是国民应用,而其中小程序依托于微信生态日活已经超过4亿,对于国内的一些商家来讲是不可错过的流量圣地,那么对于做跨境的朋友来讲怎么利用起来了?今天给大家介绍一款无缝对接…

Ubuntu环境变量

2019独角兽企业重金招聘Python工程师标准>>> Ubuntu 环境变量 环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量 1、 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执…

mysql 免安装

1. 解压得到如下目录 2. 配置环境变量 D:\Program Files\mysql-5.7.11-winx64\bin 3. 安装的根目录,新增 my.ini 文件 [mysqld] port 3306 character_set_serverutf8 basedir D:\Program Files\mysql-5.7.11-winx64 datadir D:\Program Files\mysql-5.7.…

leetcode-23 合并K个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 方法一: 使用vector数组存多个链表的所有节点,进行从小…

Access应用日志一

今天在确认实习生不能帮忙搭建数据库后,自己根据业务需求尝试搭了一个小型access数据库。 主要目的:储存历史月度数据,避免每次从公司数据库下载数据的麻烦,节省数据拉取时间。 搭建了以acct id为主键的两种数据。 1)客…

mongodb检查点_mongodb 监控命令mongostat

mongodb 监控命令mongostat2016/03/07 15:11 于 数据分析mongostat实用工具提供了mongoDB一个实例快速概述和当前运行的状态。mongostat功能类似于UNIX / Linux文件系统实用vmstat,mongostat只不过是提供 mongodb 的数据。监控包含的数据:服务器状态数据副本状态数据…

RunnableException与CheckedException

Checked Exception 编译时异常 编译的时候检查你的代码可能在运行的时候抛出异常,这通常在编译的时候要去处理的。 RunnableException 运行时异常,可以编译通过,但如果不处理运行时会导致崩溃,需要对其进行try....catch...处理。 …

Educational Codeforces Round 59 (Rated for Div. 2)

A.Digits Sequence Dividing 题意&#xff1a;给你一个1-9的数字字符串&#xff0c;把它划分成若干段&#xff08;>2&#xff09;段&#xff0c;使其大小递增。 错误&#xff1a;当长度为2的时候没考虑 #include<cstdio> #include<cmath> #include<cstring&g…

leetcode-225 队列实现栈

使用队列实现栈的下列操作&#xff1a; push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空 队列的特点&#xff1a;先入先出 栈的特点&#xff1a;后入先出 即我们每次添加元素到队列时&#xff0c;想要达到栈的效果&#xff0c;…

详解Java Math类的toDegrees()方法:将参数从弧度转换为角度

Java Math 类的 toDegrees() 方法是将一个角度的弧度表示转换为其度表示,返回值为double类型,表示从弧度数转换而来的角度数。这就是Java Math 类的 toDegrees() 方法的攻略。我们已经了解了该方法的基本概念、语法、注意事项以及两个示例。希望这篇攻略对你有所帮助。

python语音合成 标贝_tacotronV2 + wavernn 实现中文语音合成(Tensorflow + pytorch)

TacotronV2 WaveRNN开源中文语音数据集标贝(女声)训练中文TacotronV2&#xff0c;实现中文到声学特征(Mel)转换的声学模型。在GTA模式下&#xff0c;利用训练好的TacotronV2合成标贝语音数据集中中文对应的Mel特征&#xff0c;作为声码器WaveRNN的训练数据。在合成阶段&#x…

SpringBoot接口防抖(防重复提交)的一些实现方案

作为一名老码农,在开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。啥是防抖所谓防抖,一是防用户手抖,二是防网络抖动。

OC语言基础笔记

OC方面的基础笔记:1.类的基本用法#import <Foundation/Foundation.h>// 大体上就是include, 用于包含头文件, 但是即使头文件中, 没有ifndef defined endif, 仍然能够踢除重复包含的头文件// ----interface section----// OC中声明和实现是分离的, 两个都必须有.interfac…

Docker 数据卷之进阶篇

Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇笔者在《Docker 基础 : 数据管理》一文中介绍了 docker 数据卷(volume) 的基本用法。随着使用的深入&#xff0c;笔者对 docker 数据卷的理解与认识也在不断的增强。本文将在前文的基础上介绍 docker 数据卷的原理及一些高级用…

leetcode-232 用栈实现队列

使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空 栈的特点&#xff1a;后入先出 队列的特点&#xff1a;先入先出 使用一个数据栈&#xff0c;一个辅…

sparkcore分区_Spark学习:Spark源码和调优简介 Spark Core (二)

本文基于 Spark 2.4.4 版本的源码&#xff0c;试图分析其 Core 模块的部分实现原理&#xff0c;其中如有错误&#xff0c;请指正。为了简化论述&#xff0c;将部分细节放到了源码中作为注释&#xff0c;因此正文中是主要内容。第一部分内容见&#xff1a;Spark学习&#xff1a;…

Tips——IndexSearcher自动更新

情景描述 为了调高效率&#xff0c;创建全局变量IndexReader取代每次查询新建IndexReader所带来的效率问题。 当时每天会更新一边索引8.23号部署的Index服务&#xff0c;Search服务&#xff0c;结果index都更新到了8.25&#xff0c;查询结果还是8.23的 Tips分享 先来看一下Inde…

公司运作 - 利润率、周转率

公司一般由市场部、研发部、财务部、人力资源部及其他辅助部门组成。分成了几个层面&#xff0c;如下&#xff1a; 宏观层面&#xff1a;业务范围、业务定位、专业化、多元化部门层面&#xff1a;各部门绩效、部门职责主体层面&#xff1a;跨部门事务&#xff0c;如产品研发涉及…

测试用例设计方法基础理论知识

一、什么是测试用例 测试用例设计&#xff1a;将软件测试的行为活动&#xff0c;作为一个科学化的组织归纳。 测试用例&#xff1a;设计一个情况&#xff0c;软件程序在这种情况下&#xff0c;必须能够正常运行并且达到程序所设计的执行结果。 因为我们不可能进行穷举测试&…

leetcode-155 最小栈

设计一个支持 push&#xff0c;pop&#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。 示例&#xff1a; MinStack minStack new Mi…

legend位置 pyecharts_可视化入门 | pyecharts全局配置项详解

更多文章&#xff0c;请见&#xff1a;http://mp.weixin.qq.com/mp/homepage?__bizMzIxODczMDUwOA&hid2&sn7928727456d49032f08ef1fcf0ee719e&scene18#wechat_redirect​mp.weixin.qq.com大家好&#xff0c;我是你们的机房老哥&#xff01; 计算机绘图是老哥很早就…

查询Master下的系统表和系统视图获取数据库的信息和简单的渗透测试

在SQL中可以通过查询Master下的系统表&#xff08;sys&#xff09;和系统视图&#xff08;information_schema&#xff09;获取数据库的信息。SQL2000和SQL2005的结构略有不同。 系统表结构参考系统表详细说明。 系统信息结构图参考&#xff1a;http://dev.mysql.com/doc/refma…

cocos2d-x android 移植 问题

为什么80%的码农都做不了架构师&#xff1f;>>> 由于android系统目前没有将boost加入&#xff0c;这里面使用了大量的STL及C的一些语言特性&#xff0c;导致编译出现令人非常头痛的问题。 1、出现类似的异常函数错误 boost/exception/detail/exception_ptr.hpp:382…

python插入排序演示源码

工作闲暇时间&#xff0c;把写内容过程较好的内容段做个备份&#xff0c;下面的内容内容是关于python插入排序演示的内容&#xff0c;应该能对各朋友也有用处。 def insert_sort(t): for i in xrange(len(t)): key t[i] j i - 1 while j>-1 and t[j]>key:#如果当前值比…

leetcode-215 数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k 2 输出: 5 该题比较简洁的解法&#xff0c;我们使用堆来完成 最小堆&#xff1a;即堆顶为所…

c++ double 只输出五位_c 语言第四章 在控制台上数据的输入和输出

1 数据输出我们之前已经使用过printf()函数来实现数据在控制台上输出#include<stdio.h> int main(){printf("hello world");return 0; }具体的用法是printf("数据模板",数据1,数据2,...)// 数据模板表示输出数据的形式,里面包含占位符,打印的时候使用…

pyQt 每日一练习 -- 登录框

#codingutf-8#第一个练习&#xff0c;登录框import sys from PyQt4 import QtGui,QtCore#登录框 class LoginBox(QtGui.QWidget):def __init__(self):super(LoginBox, self).__init__()self.initUI()def initUI(self):vBoxLayout QtGui.QVBoxLayout()hBoxLayout_1 QtGui.QHBo…

photoshop CS5 Dreamweaver CS5序列号及完美破解方法

adobe photoshop CS5 的序列号&#xff08;任选一个&#xff09;1330-1440-1602-3671-9749-78971330-1191-2998-6712-2520-54241330-1367-4285-4928-0630-31071330-1570-9599-9499-8092-82371330-1028-1662-3206-1688-51141330-1631-5733-5042-4138-6389 Adobe Dreamweaver CS…

[原创]Android Monkey 在线日志分析工具开发

[原创]Android Monkey 在线日志分析工具开发 在移动App测试过程中,Monkey测试是我们发现潜在问题的一种非常有效手段&#xff0c;但是Android原生的Monkey有其天然的不足&#xff0c;数据不能有效的去解读&#xff0c;同时也不能提供非常清晰的信息&#xff0c;所以针对这个问题…

leetcode-295 数据流的中位数

中位数是有序列表中间的数。如果列表长度是偶数&#xff0c;中位数则是中间两个数的平均值。 例如&#xff0c; [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 3) / 2 2.5 设计一个支持以下两种操作的数据结构&#xff1a; void addNum(int num) - 从数据流中添加一个整数到数…