基于脚本配置来过滤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. FZU 2297 Number theory【线段树/单点更新/思维】

    Given a integers x = 1, you have to apply Q (Q ≤ 100000) operations: Multiply, Divide. Input First l ...

  2. git "Could not read from remote repository.Please make sure you have the correct access rights."解决方案

    我们在使用git clone 或其他命令的时候,有时候会遇到这类问题,如图: fatal: Could not read from remote repository.Please make sure ...

  3. oracle中 char,varchar,varchar2的区别

    区别:      1. CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符) ...

  4. Visual Studio 2017创建XAML文件

    Visual Studio 2017创建XAML文件   在Visual Stuido 2015中,在已经创建好的项目中添加XAML文件,只要右击项目,单击“添加”|“新建项”命令,然后从“添加新项” ...

  5. Rxjava与Retrofit的使用

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha ---- -----

  6. [BZOJ2286][SDOI2011]消耗战(虚树DP)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4998  Solved: 1867[Submit][Statu ...

  7. 【Floyd】文化之旅

    [NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 ...

  8. 20172333 2017-2018-2 《Java程序设计》第3周学习总结

    20172333 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 1.String类.Random类.Math类.NumberFormat类和DecimalF ...

  9. windows和linux下杀死Tomcat进程,解决端口占用

    windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...

  10. Codeforces Round #344 (Div. 2) D. Messenger kmp

    D. Messenger 题目连接: http://www.codeforces.com/contest/631/problem/D Description Each employee of the ...