- 浏览: 793925 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
1.Log工具简单比较
Log4cpp & Log4CPlus:C++的日志库,可移植移性相对差些
Log4c:C的日志库,基本上都是一些纯c的东西,移植性较好
2.Log4c的基本概念
Log4c中有三个重要的概念, Category, Appender, Layout。
Category用于区分不同的日志,在一个程序中我们可以通过Category来指定很多的日志。
Appdender用于描述输出流,通过为Category来指定一个Appdender,可以决定将log信息来输出到什么地方去,比如stdout, stderr, rollingfile等等。
Layout用于指定日志信息的格式,通过为Appender来指定一个Layout,可以决定log信息以何种格式来输出,比如是否有带有时间戳, 是否包含文件位置信息等,以及他们在一条log信息中的输出格式的等。
Category, Appender, Layout三者之间的关系,一个Category需要为其指定一个appender, 一个appender亦要为其指定一个layout。
另外,对于文件类型输出还有一个rollingpolicy。rollingpolicy用于描述文件输出的配置策略。
3.关于配置
配置文件示例如下:
<!DOCTYPE log4c SYSTEM ""> <log4c version="1.2.0"> <config> <bufsize>0</bufsize> <debug level="0"/> <nocleanup>0</nocleanup> </config> <layout name="dated" type="dated_l"/> <!-- appenders ===================================== --> <appender name="LoadBusinessLog" type="rollingfile" logdir="../etc/log" prefix="LoadBusiness-" layout="dated_l" rollingpolicy="Policy1" /> <appender name="CataRollingFileAppender" type="rollingfile" logdir="../etc/log/" prefix="testLog" layout="dated" rollingpolicy="RollingPolicy" /> <!-- category ========================================= --> <category name="root" priority="notice"/> <category name="framework" priority="info" appender="FrameLog" /> <category name="test.log" priority="trace" appender="CataRollingFileAppender" /> <!-- policy ======================================= --> <rollingpolicy name="Policy1" type="timewin" timetype="1" maxnum="10" /> <rollingpolicy name="RollingPolicy" type="sizewin" maxsize="102400" maxnum="10" /> </log4c> |
3.1 category
name:日志的名称
priority:日志的优先级,共有fatal、alert、crit、error、warn、notice、info、debug、trace、notset和unknown11个级别,其级别逐步递增,记录在日志中的数据为小于等于指定级别的数据。
appender:输出流类型名称,为appender节点的name属性的值。
3.2 appender
name:输出流名称
type:输出流类型,共有stream、syslog、rollingfile三大类
layout:输出日志的格式的名称,为layout节点的name属性的值。
rollingpolicy:输出日志文件配置策略名称,为rollingpolicy节点的name属性的值。
rollingpolicy的timewin类型的日志输出为自定义类型
3.3 layout
name:输出日志的格式名称
type:输出日志格式的类型,共有base 、dated、dated_l等格式类型,对于自定义类型也有配置在这里,否则不能够加载。
base:%P %c - %m/n
"%P" 日志信息的优先级
"%c" 日志的名称
"%m" 日志信息内容
dated:%d %P %c - %m/n
"%d" 日志信息产生的时间,UTC格式yyyymmdd hh:mm:ss.mis
"%P" 日志信息的优先级
"%c" 日志的名称
"%m" 日志信息内容
dated_l:%d %P %c - %m/n (源代码里面没有,自己增加的)
"%d" 日志信息产生的时间,本地时间格式yyyymmdd hh:mm:ss
"%P" 日志信息的优先级
"%c" 日志的名称
"%m"日志信息内容
3.4 rollingpolicy
name:日志文件输出的配置策略名称。
type:日志文件输出的配置策略的类型,有sizewin一种类型。
maxsize:输出日志文件的最大值。默认值为20KB
maxnum:保存的历史日志文件总数。默认值为5
3.5 配置文件的路径
:
${ LOG4C_RCPATH }/log4crc //环境变量中设置的配置文件夹下log4crc
${HOME}/.log4crc //HOME文件夹下log4crc
./log4crc //当前可执行文件夹下log4crc
4、Log4c的基本使用
头文件
(直接引用log4c.h程序编译出错,因此只引用需要的头文件) extern "C" { #include <log4c/init.h> #include <log4c/category.h> } cpp文件 //初始化 log4c_init(); //获取一个已有的category log4c_category_t* mycat = log4c_category_get("cata.log "); //用该category进行日志输出,优先级为DEBUG,输出信息为 "Hello World!" log4c_category_log(mycat, LOG4C_PRIORITY_DEBUG, "Hello World!"); //析构 log4c_fini(); //在日志输出过程中可以进行格式化输出: log4c_category_log(mycat, LOG4C_PRIORITY_ERROR, "Error code = %d", 12345); //对于格式化输出也可以有如下写法: void CLog::Trace(const char * format, ... ) { if (log4c_category_is_priority_enabled(mycat, LOG4C_PRIORITY_TRACE)) { a_list argptr; va_start(argptr, format); log4c_category_vlog(mycat, LOG4C_PRIORITY_TRACE, format, argptr); va_end(argptr); } } |
5.自定义Logout
5.1 添加在Log4c源代码中的流程
在log4c-1.2.0/src/文件夹添加相应的头文件和实现文件,如examplelayout.h和examplelayout.c文件
编辑log4c-1.2.0/src/log4c/Makefile.in
在am__liblog4c_la_SOURCES_DIST中添加examplelayout.c
在am_liblog4c_la_OBJECTS中添加examplelayout. lo
在liblog4c_la_SOURCES 中添加examplelayout.c
在pkginclude_HEADERS中添加 examplelayout.h
添加@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ examplelayout.Plo@am__quote@
编辑log4c-1.2.0/src/log4c/Makefile.am
在liblog4c_la_SOURCES中添加examplelayout.c
在pkginclude_HEADERS中添加examplelayout.h
编辑log4c-1.2.0/src/init.c
添加#include <examplelayout.h>
在static const log4c_layout_type_t * const layout_types[]数组中添加新添加的layout_type函数指针
5.2在工程中添加自定义日志格式
实现自定义格式的主要函数:
static const char* cat_format( const log4c_layout_t* a_layout, const log4c_logging_event_t*a_event) { static char buffer[4096]; /* * For this formatter we put the category up front in the log message */ sprintf(buffer, "[%s][LINE:%d][FILE:%s] %s", a_event->evt_category, a_event->evt_loc->loc_line, a_event->evt_loc->loc_file, a_event->evt_msg); return buffer; } const log4c_layout_type_t log4c_layout_type_cat = { "test_cat", //格式名称,用于配置文件的设置 cat_format, //格式定义函数 |
5.3将自定义格式添加到Log4c的配置中 :
int init_example_formatters() { log4c_layout_type_set(&log4c_layout_type_cat);//自定义格式类型函数指针 } |
5.4自定义格式的使用
//执行自定义格式初始化
init_example_formatters(); //执行Log4c的初始化 log4c_init(); …… |
#ff00806.自定义Appender
6.1实现自定义输出流的主要函数:
static int test_file_append(log4c_appender_t* a_appender, const log4c_logging_event_t* a_event) { FILE* fp = log4c_appender_get_udata(a_appender); /* return fprintf(fp, "[%s] [%s] [%d] [%d] [%s] [%s] [%d]/n%s", log4c_appender_get_name(this), a_event->evt_category, a_event->evt_priority, a_event->evt_timestamp.tv_sec*1000000 + a_event->evt_timestamp.tv_usec, a_event->evt_msg, a_event->evt_loc->loc_file, a_event->evt_loc->loc_line, a_event->evt_rendered_msg); */ return fprintf(fp, "%s/n", a_event->evt_rendered_msg); } static int test_open(log4c_appender_t* a_appender) { FILE* fp = log4c_appender_get_udata(a_appender); if (fp) return 0; if ( (fp = fopen(log4c_appender_get_name(a_appender), "a+")) == NULL) fp = stderr; /* unbuffered mode */ setbuf(fp, NULL); log4c_appender_set_udata(a_appender, fp); return 0; } static int test_close(log4c_appender_t* a_appender) { FILE* fp = log4c_appender_get_udata(a_appender); return (fp ? fclose(fp) : 0); } const log4c_appender_type_t log4c_appender_type_test_file = { "test_file", //输出流的名称,用于配置文件设置 test_open, //打开输出流的函数 test_file_append, //给输出流追加日志信息的函数 test_close, //关闭输出流的函数 }; |
6.2将自定义输出流添加到Log4c的配置中 :
int init_example_appenders() { log4c_appender_type_set (&log4c_appender_type_test_file);//自定义输出流类型的函数指针 } |
6.3自定义输出流的使用
//执行自定义格式初始化 init_example_appenders(); //执行Log4c的初始化 log4c_init(); …… |
7.自定义rollingpolicy
源代码中有一个sizewin的rollingpolicy,是根据文件大小进行生成日志控制的。
在这里添加一个根据时间的控制日志输出的策略,实现代码如下:
7.1 rollingpolicy_type_timewin.h
#ifndef log4c_policy_type_timewin_h
#define log4c_policy_type_timewin_h
#include <log4c/defs.h> #include <log4c/rollingpolicy.h> __LOG4C_BEGIN_DECLS LOG4C_API const log4c_rollingpolicy_type_t log4c_rollingpolicy_type_timewin; typedef struct __timewin_udata rollingpolicy_timewin_udata_t; #define TIME_TYPE_HOUR 0 #define TIME_TYPE_DAY 1 #define TIME_TYPE_MONTH 2 #define TIME_TYPE_YEAR 3 #define ROLLINGPOLICY_TIME_DEFAULT_MAX_NUM_FILES 100 #define ROLLINGPOLICY_TIME_DEFAULT_FILE_TYPE TIME_TYPE_DAY LOG4C_API rollingpolicy_timewin_udata_t *timewin_make_udata(void); LOG4C_API int timewin_udata_set_file_time_type( rollingpolicy_timewin_udata_t * swup, long time_type); LOG4C_API int timewin_udata_set_max_num_files( rollingpolicy_timewin_udata_t * swup, long max_num); LOG4C_API int timewin_udata_set_appender( rollingpolicy_timewin_udata_t * swup, log4c_appender_t* app); __LOG4C_END_DECLS #endif |
7.2 rollingpolicy_type_timewin.c
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #ifdef HAVE_PTHREAD_H #include <pthread.h> #endif #include <log4c/appender.h> #include <log4c/rollingpolicy.h> #include <log4c/rollingpolicy_type_timewin.h> #include "appender_type_rollingfile.h" #include <sd/malloc.h> #include <sd/error.h> #include <sd/sd_xplatform.h> #include <sd/sprintf.h> #include <stdio.h> #include <stdlib.h> #include <time.h> /* Internal structs that defines the conf and the state info * for an instance of the appender_type_rollingfile type. */ struct __timewin_conf { long swc_file_time_type; long swc_file_max_num_files; }; struct __timewin_udata { struct __timewin_conf sw_conf; rollingfile_udata_t *sw_rfudata; const char *sw_logdir; const char *sw_files_prefix; char *sw_curfileflag; char *sw_prefileflag; int sw_flags; }; /***************************************************************************/ static int timewin_init(log4c_rollingpolicy_t *this, rollingfile_udata_t* rfup); static int timewin_rollover(log4c_rollingpolicy_t *this, FILE **current_fpp ); static int timewin_is_triggering_event( log4c_rollingpolicy_t *this, const log4c_logging_event_t* a_event, long current_file_size); static int timewin_fini(log4c_rollingpolicy_t *this); static char* timewin_get_filename(rollingpolicy_timewin_udata_t * swup); static int timewin_check_update_fileflag(rollingpolicy_timewin_udata_t * swup); static int timewin_open_file(char *filename, FILE **fpp ); static int timewin_copy_string(char** szDest, const char* src); /******************************************************************************* Policy interface: init, is_triggering_event, rollover *******************************************************************************/ static int timewin_is_triggering_event( log4c_rollingpolicy_t *this, const log4c_logging_event_t* a_event, long current_file_size){ int decision = 0; rollingpolicy_timewin_udata_t *swup = log4c_rollingpolicy_get_udata(this); sd_debug("timewin_is_triggering_event["); decision = timewin_check_update_fileflag(swup); if (decision) { sd_debug("triggering event"); } else { sd_debug("not triggering event"); } sd_debug("]"); return(decision); } /*******************************************************************************/ static int timewin_rollover(log4c_rollingpolicy_t *this, FILE ** current_fpp ){ int rc = 0; rollingpolicy_timewin_udata_t *swup = log4c_rollingpolicy_get_udata(this); int k = 0; char * szFileName = NULL; sd_debug("timewin_rollover["); if ( !swup || !swup->sw_logdir){ sd_error("rollingpolicy '%s' not yet configured (logdir,prefix etc.)", log4c_rollingpolicy_get_name(this)); } else { k = swup->sw_flags; if (k > 0 || *current_fpp == NULL) { szFileName = timewin_get_filename(swup); if (*current_fpp) { if(fclose(*current_fpp)){ sd_error("failed to close current log file"); rc = 1; } } if (!rc && timewin_open_file(szFileName, current_fpp)){ sd_error("open zero file failed"); } free(szFileName); } } sd_debug("]"); return(rc); } /*******************************************************************************/ static int timewin_init(log4c_rollingpolicy_t *this, rollingfile_udata_t *rfup){ rollingpolicy_timewin_udata_t *swup = NULL; sd_debug("timewin_init["); if (!this){ goto timewin_init_exit; } swup = log4c_rollingpolicy_get_udata(this); if ( swup == NULL ){ swup = timewin_make_udata(); log4c_rollingpolicy_set_udata(this, swup); } swup->sw_logdir = rollingfile_udata_get_logdir(rfup); swup->sw_files_prefix = rollingfile_udata_get_files_prefix(rfup); timewin_check_update_fileflag(swup); timewin_init_exit: sd_debug("]"); return(0); } /*******************************************************************************/ static int timewin_fini(log4c_rollingpolicy_t *this){ rollingpolicy_timewin_udata_t *swup = NULL; int rc = 0; sd_debug("timewin_fini[ "); if (!this){ goto timewin_fini_exit; } swup = log4c_rollingpolicy_get_udata(this); if (!swup){ goto timewin_fini_exit; } if (swup->sw_curfileflag) { free(swup->sw_curfileflag); } if (swup->sw_prefileflag) { free(swup->sw_prefileflag); } swup->sw_flags = 0; /* logdir and files_prefix are just pointers into the rollingfile udata * so they are not ours to free--that will be done by the free call to * the rollingfile appender */ sd_debug("freeing timewin udata from rollingpolicy instance"); free(swup); log4c_rollingpolicy_set_udata(this,NULL); timewin_fini_exit: sd_debug("]"); return(rc); } /******************************************************************************* timewin specific conf functions *******************************************************************************/ LOG4C_API rollingpolicy_timewin_udata_t *timewin_make_udata(void) { rollingpolicy_timewin_udata_t *swup = NULL; swup = (rollingpolicy_timewin_udata_t *)sd_calloc(1, sizeof(rollingpolicy_timewin_udata_t)); timewin_udata_set_file_time_type(swup, ROLLINGPOLICY_TIME_DEFAULT_FILE_TYPE); timewin_udata_set_max_num_files(swup, ROLLINGPOLICY_TIME_DEFAULT_MAX_NUM_FILES); swup->sw_curfileflag = 0; swup->sw_prefileflag = 0; swup->sw_flags = 0; return(swup); } /*******************************************************************************/ LOG4C_API int timewin_udata_set_file_time_type(rollingpolicy_timewin_udata_t * swup, long time_type){ swup->sw_conf.swc_file_time_type = time_type; return(0); } /****************************************************************************/ LOG4C_API int timewin_udata_set_max_num_files(rollingpolicy_timewin_udata_t *swup, long max_num){ swup->sw_conf.swc_file_max_num_files = max_num; return(0); } /****************************************************************************/ LOG4C_API int timewin_udata_set_rfudata(rollingpolicy_timewin_udata_t *swup, rollingfile_udata_t *rfup ){ swup->sw_rfudata = rfup; return(0); } /***************************************************************************** private functions *****************************************************************************/ /****************************************************************************/ static char* timewin_get_filename(rollingpolicy_timewin_udata_t* swup){ long filename_len = 0; char *s = NULL; filename_len = strlen(swup->sw_logdir) + 1 + strlen(swup->sw_files_prefix) + 1 + 15; // a margin / s = (char *)malloc(filename_len); sprintf( s, "%s%s%s%s%s", swup->sw_logdir, FILE_SEP, swup->sw_files_prefix, swup->sw_curfileflag, ".log"); return(s); } /********************************************************************************/ static int timewin_check_update_fileflag(rollingpolicy_timewin_udata_t * swup) { struct tm tm; time_t timep; time(&timep); char buf[11]; memset(buf, 0, 11); #ifndef _WIN32 #ifndef __HP_cc #warning gmtime() routine should be defined in sd_xplatform #endif localtime_r(&timep, &tm); #else /* xxx Need a CreateMutex/ReleaseMutex or something here */ { struct tm *tmp = NULL; tmp = localtime(&timep); tm = *tmp; /* struct copy */ } #endif swup->sw_flags = 0; switch (swup->sw_conf.swc_file_time_type) { case TIME_TYPE_YEAR: sprintf(buf, "%04d", tm.tm_year + 1900); break; case TIME_TYPE_MONTH: sprintf(buf, "%04d%02d", tm.tm_year + 1900, tm.tm_mon + 1); break; case TIME_TYPE_DAY: sprintf(buf, "%04d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); break; case TIME_TYPE_HOUR: sprintf(buf, "%04d%02d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour); break; default: sprintf(buf, "%04d%02d%02d%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour); break; } if (swup->sw_curfileflag == NULL) { timewin_copy_string(&swup->sw_curfileflag, buf); swup->sw_flags = 1; } else if (strcmp(swup->sw_curfileflag, buf) != 0) { timewin_copy_string(&swup->sw_prefileflag, swup->sw_curfileflag); timewin_copy_string(&swup->sw_curfileflag, buf); swup->sw_flags = 1; } return swup->sw_flags; } /******************************************************************************/ static int timewin_copy_string(char** szDest, const char* src) { int len = 0; if (src == 0) { return -1; } len = strlen(src) + 1; if (*szDest == NULL) { * szDest = (char *)malloc(len); } else if (strlen(*szDest) < len) { free(*szDest); * szDest = (char *)malloc(len); memset(*szDest, 0, len); } memcpy(* szDest, src, len); return 0; } /*******************************************************************************/ static int timewin_open_file(char *filename, FILE **fpp ){ int rc = 0; sd_debug("timewin_open_file['%s'", filename); if ( (*fpp = fopen(filename, "a+")) == NULL){ sd_error("failed to open file '%s'--defaulting to stderr--error='%s'", filename, strerror(errno)); *fpp = stderr; rc = 1; } /* unbuffered mode at the filesystem level xxx make this configurable from the outside ? */ setbuf(*fpp, NULL); sd_debug("]"); return(rc); } /****************************************************************************/ const log4c_rollingpolicy_type_t log4c_rollingpolicy_type_timewin = { "timewin", timewin_init, timewin_is_triggering_event, timewin_rollover, timewin_fini }; |
7.3 init.c
#ifdef WITH_ROLLINGFILE
static const log4c_rollingpolicy_type_t * const rollingpolicy_types[] = {
&log4c_rollingpolicy_type_sizewin,
&log4c_rollingpolicy_type_timewin
};
static size_t nrollingpolicy_types =
sizeof(rollingpolicy_types) / sizeof(rollingpolicy_types[0]);
#endif
rc.c
#ifdef WITH_ROLLINGFILE
/******************************************************************************/
static int rollingpolicy_load(log4c_rc_t* this, sd_domnode_t* anode)
{
sd_domnode_t* name = sd_domnode_attrs_get(anode, "name");
sd_domnode_t* type = sd_domnode_attrs_get(anode, "type");
log4c_rollingpolicy_t* rpolicyp = NULL;
sd_debug("rollingpolicy_load[");
if (!name) {
sd_error("attribute /"name/" is missing");
return -1;
}
rpolicyp = log4c_rollingpolicy_get(name->value);
if (type){
log4c_rollingpolicy_set_type(rpolicyp,
log4c_rollingpolicy_type_get(type->value));
if (!strcasecmp(type->value, "sizewin")){
sd_domnode_t* maxsize = sd_domnode_attrs_get(anode, "maxsize");
sd_domnode_t* maxnum = sd_domnode_attrs_get(anode, "maxnum");
rollingpolicy_sizewin_udata_t *sizewin_udatap = NULL;
sd_debug("type='sizewin', maxsize='%s', maxnum='%s', "
"rpolicyname='%s'",
(maxsize && maxsize->value ? maxsize->value :"(not set)"),
(maxnum && maxnum->value ? maxnum->value :"(not set)"),
(name && name->value ? name->value :"(not set)"));
/*
* Get a new sizewin policy type and configure it.
* Then attach it to the policy object.
* Check to see if this policy already has a
sw udata object. If so, leave as is except update
the params
*/
if ( !(sizewin_udatap = log4c_rollingpolicy_get_udata(rpolicyp))){
sd_debug("creating new sizewin udata for this policy");
sizewin_udatap = sizewin_make_udata();
log4c_rollingpolicy_set_udata(rpolicyp,sizewin_udatap);
sizewin_udata_set_file_maxsize(sizewin_udatap, atoi(maxsize->value));
sizewin_udata_set_max_num_files(sizewin_udatap, atoi(maxnum->value));
}else{
sd_debug("policy already has a sizewin udata--just updating params");
sizewin_udata_set_file_maxsize(sizewin_udatap, atoi(maxsize->value));
sizewin_udata_set_max_num_files(sizewin_udatap, atoi(maxnum->value));
/* allow the policy to initialize itself */
log4c_rollingpolicy_init(rpolicyp,
log4c_rollingpolicy_get_rfudata(rpolicyp));
}
}
else if (!strcasecmp(type->value, "timewin")){
sd_domnode_t* timetype = sd_domnode_attrs_get(anode, "timetype");
sd_domnode_t* maxnum = sd_domnode_attrs_get(anode, "maxnum");
rollingpolicy_timewin_udata_t *timewin_udatap = NULL;
sd_debug("type='timewin', timetype='%s', maxnum='%s', "
"rpolicyname='%s'",
(timetype && timetype->value ? timetype->value :"(not set)"),
(maxnum && maxnum->value ? maxnum->value :"(not set)"),
(name && name->value ? name->value :"(not set)"));
/*
* Get a new sizewin policy type and configure it.
* Then attach it to the policy object.
* Check to see if this policy already has a
sw udata object. If so, leave as is except update
the params
*/
if ( !(timewin_udatap = log4c_rollingpolicy_get_udata(rpolicyp))){
sd_debug("creating new sizewin udata for this policy");
timewin_udatap = timewin_make_udata();
log4c_rollingpolicy_set_udata(rpolicyp,timewin_udatap);
timewin_udata_set_file_time_type(timewin_udatap, atoi(timetype->value));
timewin_udata_set_max_num_files(timewin_udatap, atoi(maxnum->value));
}else{
sd_debug("policy already has a sizewin udata--just updating params");
timewin_udata_set_file_time_type(timewin_udatap, atoi(timetype->value));
timewin_udata_set_max_num_files(timewin_udatap, atoi(maxnum->value));
/* allow the policy to initialize itself */
log4c_rollingpolicy_init(rpolicyp,
log4c_rollingpolicy_get_rfudata(rpolicyp));
}
}
}
sd_debug("]");
return 0;
}
#endif
发表评论
-
c++ cin输入int的用法
2014-06-10 11:17 1353int icin = 0; for(int i =0; ... -
Linux下case报错syntax error near unexpected token `in
2014-05-20 16:16 1105来分享一个在Linux下执 ... -
查看linux某目录下所有普通文件,不含目录
2014-05-14 15:15 0#include <fstream>#i ... -
scp sz
2014-03-31 18:15 0使用的是secureCRT 那么先拷贝到这台服务器上,再下 ... -
Linux可执行文件执行时找不到共享库
2014-03-31 18:09 2261编译程序时使用了如下参数指定了链接库的位置,但是执 ... -
C++ assert机制
2014-03-06 10:21 925C++ assert机制 ASSERT ... -
为什么C++语言中既有指针也有引用
2013-11-19 11:16 0写在前面的话,本文是 ... -
C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
2013-11-19 10:20 806栈,就是那些由编译器 ... -
堆内存和栈内存
2013-11-19 10:13 0堆内存就是你用new 修饰符创建的内容会在堆内存中开辟一段空 ... -
C++使用CLI连接DB2
2013-11-15 09:31 3374<!--推荐博文--> ... -
使用 C++ 处理 JSON 数据交换格式
2013-09-10 11:10 909一、摘要 JSON 的全称为:JavaScript Obj ... -
C++的Json解析库:jsoncpp和boost (转)
2013-09-10 10:40 6624JSON(JavaScript Object Notatio ... -
C++ JsonCpp 使用(转)
2013-09-10 10:21 1778前言 JSON是一个轻量级 ... -
C++中map容器的说明和使用技巧(转)
2013-08-22 15:01 1031C++中map容器提供一个键值对容器,map与multim ... -
C++中各种类型的成员变量的初始化方法(转)
2013-08-01 15:26 1018c++各种不同类型成员根据是否static 、时候con ... -
Xerces浅析
2013-07-30 14:15 3139本篇文章主要讲述项目 ... -
Xerces C++ 学习笔记 (转)
2013-07-24 17:04 13191. 初始化平台: XMLPlatformUtils: ... -
Boost智能指针——shared_ptr (转)
2013-07-16 17:27 1783boost::scoped_ptr虽然简单易用,但它不能共享 ... -
GDB调试精粹及使用实例 (转)
2013-07-16 16:21 1071一:列文件清单1. List( ... -
Xerces-C++学习之——查询修改XML文档 (转)
2013-07-16 16:02 3343/** ========================== ...
相关推荐
这个压缩包包含了 log4c 的一个完整实例,适合初学者学习和参考。 在 C 语言中,日志处理通常是通过标准输出或自定义文件进行的,但这样的方式往往缺乏灵活性和可扩展性。log4c 的出现解决了这个问题,它提供了多种...
**如何使用log4c日志库:测试例子程序** 在软件开发中,日志记录是一项至关重要的任务,它有助于调试、性能分析以及问题排查。log4c是一个针对C语言的开源日志库,模仿了Java的log4j设计,提供了一个灵活且功能强大...
### log4c开发手册知识点概览 #### 一、引言 Log4C是一款基于C语言的开源日志工具库,旨在为C语言开发者提供一个高效且可配置的日志记录解决方案。通过它,用户可以轻松地在自己的项目中集成日志功能,并能够根据...
《log4c-1.2.1:C语言编写的高效日志库》 在软件开发过程中,日志记录是一项至关重要的任务,它能够帮助开发者追踪程序运行状态,定位和解决问题。"log4c-1.2.1"便是这样一个专为C语言编程设计的日志库,它提供了...
log4c的源代码。log4c是用C语言编写的日志工具,借鉴了log4j的思想,可以自由配置日志的输出格式、输出文件等,是一个很方便的程序调试、运行追踪工具。还有一个C语言的日志工具是ZLog,与这个有些像。
Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用Log4c win32例子调用
Log4c is a library of C for flexible logging to files, syslog and other destinations. It is modeled after the Log for Java library (http://jakarta.apache.org/log4j/), .
《log4c-2.0.1:强化日志管理的新版本》 log4c-2.0.1是一款在原有log4c-2.0.0基础上进行升级的开源日志库,专为C语言应用程序设计,致力于提供高效、灵活的日志记录功能。此次更新的核心亮点在于引入了Cache模块,...
### Log4C 配置与开发指南 #### 1. 引言 Log4C是一款基于C语言的高效日志库,旨在为C语言开发者提供一个可配置且高效的日志记录解决方案。它提供了大多数项目所需的经典日志功能,并且通过灵活的配置方式,能够满足...
《深入解析log4c——基于源码的剖析》 在软件开发中,日志记录扮演着至关重要的角色,它能够帮助开发者追踪程序运行状态、定位问题所在,甚至为系统性能优化提供依据。log4c是C语言实现的一个日志记录框架,类似于...
描述中提到Log4c在开发时作为写日志的工具非常实用且易于学习,这表明它具有易用性高、功能全面的特点,适合开发者用于调试和监控程序运行状态。 **Log4c核心知识点** 1. **模块化设计**:Log4c采用模块化设计,...
**Log4j学习笔记** Log4j是一款广泛应用于Java编程中的日志记录框架,由Apache软件基金会开发。它提供了一套灵活的日志记录系统,帮助开发者在开发过程中追踪应用程序的行为,便于调试、性能分析和问题排查。Log4j...
【简易版log4C#】是一个专门为C#开发者设计的日志记录工具,它的核心目标是提供一个简单易用、功能实用的日志管理方案。在这个简易版本中,它着重于按月生成日志文件,便于开发者追踪和分析程序运行时的问题。这种...
在原来的log4c-1.2.1的基础上重新架构优化,实现日志的配置式管理,内含使用说明文档......
### Log4j 学习笔记知识点详解 #### 一、Log4j 概述与架构 **Log4j** 是 **Apache** 组织提供的一个开源日志框架,旨在简化应用开发中的日志记录工作。它能够灵活地记录程序运行时的信息,并允许用户自定义日志的...
多线程和多进程写同一个日志的情况下,安全转档(转档就是把太大的日志重命名) 可以精确到微秒 如果一个程序默认只用一个分类输出,zlog提供了简单的调用包装dzlog MDC,一个log4j风格的键-值对的表,可以扩展用户...
### log4J学习笔记 #### 一、Apache Commons Logging与log4j及JDK Logger的关系 **Apache Commons Logging** 的设计初衷是为了提供一个简洁统一的日志接口,它并不直接实现日志功能,而是通过桥接的方式支持多种...
"Log4c for VxWorks" 指的是 Log4c 这个开源日志库被适配和应用于 VxWorks 实时操作系统。Log4c 是一个基于 C 语言的日志记录框架,它借鉴了 Java 的 Log4j 设计理念,为 C 语言开发提供了强大的日志处理功能。...
**Log4j学习笔记** Log4j是一款广泛应用于Java编程中的日志记录工具,由Apache软件基金会开发。它提供了一种灵活且强大的机制来记录应用的运行情况,这对于调试、性能分析、问题追踪以及系统监控至关重要。这篇学习...