在单进程单线程或单进程多线程下实现log4cplus写日志并按大小切割
基于脚本配置来过滤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写日志并按大小切割的更多相关文章
- c# 多线程使用队列顺序写日志的类 (需要再优化)
using System; using System.Collections.Generic; using System.Threading; public class LogManager { // ...
- web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)
知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...
- Redis为什么使用单进程单线程方式也这么快
[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...
- Redis使用单进程单线程方式的优缺点分析
[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...
- Redis 为什么使用单进程单线程方式也这么快(转载)
Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 ...
- Redis为什么使用单进程单线程方式
Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写.官方提供的数据是可以达到100000+的qps.这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached ...
- Redis 为什么使用单进程单线程方式也这么快
Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写.官方提供的数据是可以达到100000+的 qps.这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 ...
- Redis为什么单进程单线程也那么快
[转] http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.htm ...
- Redis 是单进程单线程的?
Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消 除了传统数据库串行控制的开销.
随机推荐
- Aras Innovator DB备份与还原
错误信息 确认到该问题是因为孤立帐号的问题,在解决孤立帐号之前,可以通过语句查看,另外,还原了DB后,系统不会自动创建原来的登陆帐号的,需要手动新增登陆帐号 #查看孤立帐号列表exec sp_chan ...
- php 获取指定月份的开始结束时间
/** * * 获取指定年月的开始和结束时间戳 * * @param int $y 年份 * @param int $m 月份 * @return array(开始时间,结束时间) */ functi ...
- ProgrammingProjectList-文本操作
https://github.com/jobbole/ProgrammingProjectList 逆转字符串——输入一个字符串,将其逆转并输出. package com.zrl.github; im ...
- 洛谷P1414 又是毕业季 [数论]
题目传送门 又是毕业季 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在 ...
- TarjanLCA学习笔记
1.前言 首先我们介绍的算法是LCA问题中的离线算法-Tarjan算法,该算法采用DFS+并查集,再看此算法之前首先你得知道并查集(尽管我相信你如果知道这个的话肯定是知道并查集的),Tarjan算法的 ...
- [POJ1980]Unit Fraction Partition(搜索)
Unit Fraction Partition Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4571 Accepted ...
- hdu 5963 朋友(2016ccpc 合肥站 C题)
朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...
- [Lydsy1805月赛] quailty 算法
稍微建一下模型就可以发现,题目要求的其实是一个最小异或基环森林.... 可以用类似最小生成树的拟阵性质来证明,贪心的从小的边权开始依次尝试加入的方法是对的. 所以我们把a[]排完序之后直接递归贪心就行 ...
- 【最大权森林/Kruskal】POJ3723-Conscription
[题目大意] 招募m+n个人每人需要花费$10000,给出一些关系,征募某个人的费用是原价-已招募人中和他亲密值的最大值,求最小费用. [思路] 人与人之间的亲密值越大,花费越少,即求出最大权森林,可 ...
- Problem D: 指针:调用自定义排序函数sort,对输入的n个数进行从小到大输出。
#include<stdio.h> int sort(int *p,int n) { int i,j,temp; ;i<n-;i++) for(j=i;j<n;j++) if( ...