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 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:
- log4j.logger.logger0 = TRACE, ap0
设置子Logger不继承父Logger的appender:
- log4j.additivity.logger0=false
设置子Logger所使用的日志文件,下述代码将logger0的日志文件设定为当前程序目录下的0.log:
- log4j.appender.ap0.File=./0.log
在程序中获取子Logger实例
首先是加载配置文件:
- log4cxx::PropertyConfigurator::configure(配置文件名称);
获取子Logger实例:
- log4cxx::LoggerPtr logger = log4cxx::Logger::getLogger(子Logger名[例如上文中的"logger0"]);
FreeJudger项目中使用的完整配置文件
下述代码配置了8个子Logger,用于FreeJudger项目中判题线程的日志:
- 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
log4cxx第三篇----使用多个logger的更多相关文章
- log4cxx入门第一篇--一个小例子
先看官网:http://logging.apache.org/log4cxx/index.html 转载自:http://wenku.baidu.com/view/d88ab5a9d1f34693da ...
- 初学Python——文件操作第三篇
一.引言 什么?有了第二篇文件操作还不够?远远不够!而且在读完第三篇文件操作还是不够.关于文件的操作,后续的学习中将不断学习新的操作方式,使用更加合适的方法. 进入正题,上一篇讲到,Python对文件 ...
- SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka篇
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...
- EnjoyingSoft之Mule ESB开发教程第三篇:Mule message structure - Mule message结构
目录 1. 探索Mule Message结构 2. Mule Message的Payload 3. Mule Message的Property 4. Mule Message的Attachment 5 ...
- 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...
- (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 第三篇 Entity Framework Plus 之 Query Cache
离上一篇博客,快一周,工作太忙,只能利用休息日来写一些跟大家分享,Entity Framework Plus 组件系列文章,之前已经写过两篇 第一篇 Entity Framework Plus 之 A ...
- 我的屌丝giser成长记-研三篇
进入研三以来,基本都是自己的自由时间了,从导师的项目抽离出来,慢慢的都交给师弟他们来负责.研三的核心任务就是找工作以及写毕业论文,因为有导师科研基金项目成果作为支撑,所以自己的论文没什么可担心,一切都 ...
随机推荐
- git简单常用的命令
git status --查看文件状态 git add+文件路径 --上传到缓存区 git add --all --全部传到缓存区 git commit -m '描述' --对上传文件做描述 git ...
- 开放型Modbus/TCP 规范
修订版 1.0,1999 年3 月29 日Andy SwalesSchneider 电气公司aswales@modicon.com目录目录............................... ...
- OpenGL—Android 开机动画源码分析二
引自http://blog.csdn.net/luoshengyang/article/details/7691321/ BootAnimation类的成员函数的实现比较长,我们分段来阅读: 第三个开 ...
- ubuntu上的mysql数据库双机备份设置
配置环境: myslq 5.5.3 + ubuntu server 12.04 一.配置MySQL主服务器(192.168.0.1) 1.增加一个账号专门用于同步 1 mysql>grant r ...
- java反射简解
1.首先一个问题,什么是类,类是不是对象? 我们总是说我们new一个对象出来 那么我们还没有new的时候,建造的那个java类是不是对象呢? 是 它是java.lang.Class的对象 对于反射我们 ...
- JS的数据类型转换
JS 数据类型转换 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把 ...
- 浅谈:html5和html的区别
什么是html5呢? html5最先由WHATWG(Web 超文本应用技术工作组)命名的一种超文本标记语言,随后和W3C的xhtml2.0(标准)相结合,产生现在最新一代的超文本标记语言.可以简单点理 ...
- 为什么我的Android SDK Manager中只显示已安装的package?
如图.在菜单packages中,前两项我都是选了的 . 两种可能: 1. 明显是楼主连不上谷歌的更新服务器了,换成国内的吧,左上Tools-->Options弹出的界面有两个可以填写的 ,下面一 ...
- stock 当天盘势
看盘 (一)怎样看大盘当天的指数收阴.收阳 投资者每天都看大盘,但多数人看不准大盘.大盘到底当天是收阴,还是收阳?我通过很长时间的记录.验证,发现大盘在正常时间内,收阴.收阳是有规律的.我判断的准确率 ...
- 用TcpClient如何获取远程网页的内容
用TcpClient如何获取远程网页的内容 private string GetHTMLTCP(string URL) { string strHTML = "";//用来保存获得 ...