基于脚本配置来过滤log信息

除了通过程序实现对log环境的配置之外。log4cplus通过PropertyConfigurator类实现了基于脚本配置的功能。通过

脚本能够完毕对logger、appender和layout的配置。因此能够解决如何输出,输出到哪里的问题。我将在全文的最后

一部分中提到多线程环境中怎样利用脚本配置来配合实现性能測试。本节将重点介绍基脚本实现过滤log信息的功能。

首先简介一下脚本的语法规则:

包含Appender的配置语法和logger的配置语法。当中:

1.Appender 的配置语法:

1.1 设置名称:

/*设置方法*/log4cplus.appender.appenderName=fully.qualified.name.of.appender.class

比如(列举了全部可能的Appender,当中SocketAppender这里没有使用):

log4cplus.appender.append_1=log4cplus::ConsoleAppender

log4cplus.appender.append_2=log4cplus::FileAppender

log4cplus.appender.append_3=log4cplus::RollingFileAppender

log4cplus.appender.append_4=log4cplus::DailyRollingFileAppender

log4cplus.appender.append_4=log4cplus::SocketAppender

1.2. 设置Filter:

包含选择过滤器和设置过滤条件。可选择的过滤器包含:LogLevelMatchFilter、LogLevelRangeFilter、和StringMatchFilter:

对LogLevelMatchFilter来说,过滤条件包含LogLevelToMatch和AcceptOnMatch(true|false), 仅仅有当log信息的LogLevel值与LogLevelToMatch同样,且AcceptOnMatch为true时才会匹配。

LogLevelRangeFilter来说,过滤条件包含LogLevelMin、LogLevelMax和AcceptOnMatch,仅仅有当log信息的LogLevel在LogLevelMin、LogLevelMax之间同一时候AcceptOnMatch为true时才会匹配。

对StringMatchFilter来说,过滤条件包含StringToMatch和AcceptOnMatch。仅仅有当log信息的LogLevel值与StringToMatch相应的LogLevel值与同样。 且AcceptOnMatch为true时会匹配。

    过滤条件处理机制类似于IPTABLE的Responsibility chain,(即先deny、再allow)只是运行顺序刚好相反。后写的条件会被先运行,比方:

log4cplus.appender.append_1.filters.1=log4cplus::spi::LogLevelMatchFilterlog4cplus.appender.append_1.filters.1.LogLevelToMatch=TRACElog4cplus.appender.append_1.filters.1.AcceptOnMatch=true#log4cplus.appender.append_1.filters.2=log4cplus::spi::DenyAllFilter

会首先运行filters.2的过滤条件。关闭全部过滤器。然后运行filters.1,仅匹配TRACE信息。

1.3. 设置Layout

能够选择不设置、TTCCLayout、或PatternLayout

假设不设置。会输出简单格式的log信息。

设置TTCCLayout例如以下所看到的:log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout

设置PatternLayout例如以下所看到的:log4cplus.appender.append_1.layout=log4cplus::PatternLayoutlog4cplus.appender.append_1.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n

2.logger的配置语法

同一个 logger 下的 Appender 会输出内容到该logger 下的全部文件,能够通过 LogLevel 等措施拉过滤。

以下演示了建立不同logger,隔离输出内容的方法。

包含rootLogger和non-root logger。

对于rootLogger来说:log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...

对于non-root logger来说:log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, appenderName, ...

    脚本方式使用起来很easy,仅仅要首先载入配置就可以(urconfig.properties是自行定义的配置文件):

PropertyConfigurator::doConfigure("urconfig.properties");以下我们通过样例体会一下log4cplus强大的基于脚本过滤log信息的功能。

以下建立的是 VS2012 的WIN32控制台project log4cplus_test,用来演示日志输出,

project须要注意两点:

1. 使用的是最新的 log4cplus-1.1.1 版本号,链接的是当中的静态库 log4cplusSD.lib

2. project须要设置 字符集为 "使用多字节字符集",设置方法是VS2012 菜单:

项目->log4cplus_test属性->配置属性->字符集

以下是配置文件 urconfig.properties 的内容,使用配置来控制log4cplus 的log 输出.

#全局默认根 logger,这里忽略 

#log4cplus.rootLogger=TRACE, ALL_MSGS, TRACE_MSGS, DEBUG_INFO_MSGS, FATAL_MSGS

#log4cplus.rootLogger=TRACE,ALL_MSGS

#log4cplus.appender.ALL_MSGS=log4cplus::RollingFileAppender

#log4cplus.appender.ALL_MSGS.File=./logout/all_msgs.log

#log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout

#独立的 logger 的配置语法,支持两个 appender

log4cplus.logger.APPfilelogger = TRACE,APP,APP_DAILY

og4cplus.additivity.APPfilelogger = false

#独立的 logger 的配置语法,同一个 logger 下会发送到全部文件,

#是否写入到全部文件,通过 LogLevel 来控制

log4cplus.logger.SYSfilelogger = TRACE,SYS

#log4cplus.additivity.SYSfilelogger = TRUE

#独立的 logger 的配置语法

log4cplus.logger.ACCfilelogger = TRACE,ACC

#log4cplus.additivity.ACCfilelogger = TRUE

#支持仅仅写入同一个 logger 下的指定文件

log4cplus.appender.APP=log4cplus::RollingFileAppender

log4cplus.appender.APP.File=./logout/app_msgs.log

log4cplus.appender.APP.ImmediateFlush=false

log4cplus.appender.APP.MaxFileSize=1MB

#log4cplus.appender.APP.MinFileSize=1M

log4cplus.appender.APP.MaxBackupIndex=3

log4cplus.appender.APP.layout=log4cplus::PatternLayout

log4cplus.appender.APP.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%Q}|%-5p|%c[2]|%t|%F:%L|%m%n

log4cplus.appender.APP.filters.1=log4cplus::spi::LogLevelRangeFilter

log4cplus.appender.APP.filters.1.LogLevelMin=TRACE

log4cplus.appender.APP.filters.1.LogLevelMax=FATAL

#支持仅仅写入同一个 logger 下的指定文件

log4cplus.appender.APP_DAILY=log4cplus::DailyRollingFileAppender

log4cplus.appender.APP_DAILY.File=./logout/app_msgs_d.log

#MONTHLY,WEEKLY,DAILY,TWICE_DAILY,HOURLY,MINUTELY

log4cplus.appender.APP_DAILY.Schedule=MINUTELY

log4cplus.appender.APP_DAILY.DatePattern='.'yyyy-MM-dd

log4cplus.appender.APP_DAILY.ImmediateFlush=false

log4cplus.appender.APP_DAILY.MaxBackupIndex=3

log4cplus.appender.APP_DAILY.layout=log4cplus::PatternLayout

log4cplus.appender.APP_DAILY.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%Q}|%-5p|%c[2]|%t|%F:%L|%m%n

log4cplus.appender.APP_DAILY.filters.1=log4cplus::spi::LogLevelRangeFilter

log4cplus.appender.APP_DAILY.filters.1.LogLevelMin=TARCE

log4cplus.appender.APP_DAILY.filters.1.LogLevelMax=FATAL

#支持仅仅写入同一个 logger 下的指定文件

log4cplus.appender.SYS=log4cplus::RollingFileAppender

log4cplus.appender.SYS.File=./logout/sys_msgs.log

log4cplus.appender.SYS.MaxFileSize=1MB

log4cplus.appender.SYS.MaxBackupIndex=3

log4cplus.appender.SYS.ImmediateFlush=false

log4cplus.appender.SYS.layout=log4cplus::PatternLayout

log4cplus.appender.SYS.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%Q}|%-5p|%c[2]|%t|%F:%L|%m%n

log4cplus.appender.SYS.filters.1=log4cplus::spi::LogLevelRangeFilter

log4cplus.appender.SYS.filters.1.LogLevelMin=TRACE

log4cplus.appender.SYS.filters.1.LogLevelMax=FATAL

#支持仅仅写入同一个 logger 下的指定文件

log4cplus.appender.ACC=log4cplus::RollingFileAppender

log4cplus.appender.ACC.File=./logout/acc_msgs.log

log4cplus.appender.ACC.MaxFileSize=1MB

log4cplus.appender.ACC.MaxBackupIndex=3

log4cplus.appender.ACC.ImmediateFlush=false

log4cplus.appender.ACC.layout=log4cplus::PatternLayout

log4cplus.appender.ACC.layout.ConversionPattern=%D{%Y-%m-%d %H:%M:%S.%Q}|%-5p|%c[2]|%t|%F:%L|%m%n

log4cplus.appender.ACC.filters.1=log4cplus::spi::LogLevelRangeFilter

log4cplus.appender.ACC.filters.1.LogLevelMin=TRACE

log4cplus.appender.ACC.filters.1.LogLevelMax=FATAL

在单进程单线程或单进程多线程下实现log4cplus写日志并按大小切割的更多相关文章

  1. c# 多线程使用队列顺序写日志的类 (需要再优化)

    using System; using System.Collections.Generic; using System.Threading; public class LogManager { // ...

  2. web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)

    知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...

  3. Redis为什么使用单进程单线程方式也这么快

    [转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...

  4. Redis使用单进程单线程方式的优缺点分析

    [转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...

  5. Redis 为什么使用单进程单线程方式也这么快(转载)

    Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 ...

  6. Redis为什么使用单进程单线程方式

    Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写.官方提供的数据是可以达到100000+的qps.这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached ...

  7. Redis 为什么使用单进程单线程方式也这么快

    Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 ...

  8. Redis为什么单进程单线程也那么快

    [转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...

  9. Redis 是单进程单线程的?

    Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消 除了传统数据库串行控制的开销.

随机推荐

  1. onethink 路由规则无效问题解决

    修改文件 Application/Common/Conf/config.php 打开注释 //'MODULE_ALLOW_LIST' => array('Home','Admin'), // 1 ...

  2. python链接mysql以及mysql中对表修改的常用语法

    MySQL是一个关系型数据库管理系统 ,其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库.在使用过程中不总是和它打交道,导致使用时候都得 ...

  3. 循序渐进PYTHON3(十三) --5-- DJANGO请求处理流程

    上面的流程图可以大致描述Django处理request的流程,可以分为以下几个步骤: 1. 用户通过浏览器请求一个页面 2. 请求到达Request Middlewares,中间件对request做一 ...

  4. poj 1298(水题)

    The Hardest Problem Ever Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24241   Accept ...

  5. 【数据结构】Not so Mobile (6-9)

    [UVA839]Not so Mobile 算法入门经典第6章6-9(P157) 题目大意:输入一个树状天平,根据力矩相等原则判断是否平衡. 试题分析:貌似没有什么难点…… #include<i ...

  6. 【期望DP+高斯消元】BZOJ3270-博物馆

    [题目大意] 有m条走廊连接的n间房间,并且满足可以从任何一间房间到任何一间别的房间.两个男孩现在分别处在a,b两个房间,每一分钟有Pi 的概率在这分钟内不去其他地方(即呆在房间不动),有1-Pi 的 ...

  7. Codeforces Round #345 (Div. 1) A - Watchmen 容斥

    C. Watchmen 题目连接: http://www.codeforces.com/contest/651/problem/C Description Watchmen are in a dang ...

  8. python 实现简单的KNN算法

    from numpy import * import operator def createDataSet(): group = array([[3,104],[2,100],[1,81],[101, ...

  9. 关于applicationContext.xml cannot be opened because it does not exist的解决

    初学Spring在用Resource rs=new ClassPathResource("applicationContext.xml");时老是遇到这个错误.后来发现用 Appl ...

  10. Linux下Apache、PHP、MySQL默认安装路径

    Apache: 如果采用RPM包安装,安装路径应在 /etc/httpd 目录下 Apache配置文件:/etc/httpd/conf/httpd.conf Apache模块路径:/usr/sbin/ ...