1.简介
Log4c基本概念
Log4c中有三个重要的概念, Category, Appender, Layout。
- Category用于区分不同的Logger, 其实它就是个logger。在一个程序中我们可以通过Category来指定很多的Logger,用于不同的目的。
- Appender用于描述输出流,通过为Category来指定一个Appender,可以决定将log信息来输出到什么地方去,比如stdout, stderr, 文件, 或者是socket等等
- Layout用于指定日志信息的格式,通过为Appender来指定一个Layout,可以决定log信息以何种格式来输出,比如是否有带有时间戳, 是否包含文件位置信息等,以及他们在一条log信息中的输出格式的等。
2.下载log4c
点击这里下载log4c
3.安装
我的操作系统是RHEL5,直接解压安装即可。
#tar xvzf log4c-1.2.1.tar.gz
#cd log4c-1.2.1
#./configure –prefix=/usr/local
#make
#make install
安装成功会在/usr/local/lib下看到liblog4cplus.a,在/usr/local/include下有个liblog4cplus文件夹
注意:将/usr/local/lib下的文件copy到/usr/lib.4.第一个例子
点击这里下载代码。
工程文件如下图所示:
本工程共7个文件,源码如下:
—————————————————-main.c—————————————————————
#include <stdio.h>
#include “mylog.h”
#include “other.h”
int main(int argv, char **argc) {
int i;
if ( mylog_init() == 1 )
{
printf(“mylog_init() failed!\n”);
}
for(i=0;i<140000;i++)
{
LOG(“%s%d”,”Hello!-“,i);
otherFunc();
}
if(mylog_fini() == 1)
{
printf(“mylog_fini() failed!\n”);
}
return 0;
}
—————————————————————————————————————————-
———————————————————Makefile——————————————————-
TARGET=log4ctest
OBJS=main.o other.o mylog.o
INC=./
LOG4CINC=/usr/local/include/log4c
LIBPATH=./
%.o:%.c
g++ -c -I$(LOG4CINC) -I$(INC) $< -o $@
%.o:%.cpp
g++ -Wall -c -g -I$(INC) $< -o $@
$(TARGET):$(OBJS)
g++ $(OBJS) -llog4c -o $(TARGET)
.PHONY:clean
clean:
rm *.o $(TARGET)
—————————————————————————————————————————-
——————————————————–log4crc———————————————————-
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<!DOCTYPE log4c SYSTEM “”>
<log4c version=”1.2.1″>
<config>
<bufsize>0</bufsize>
<debug level=”2″/>
<nocleanup>0</nocleanup>
<reread>1</reread>
</config>
<category name=”root” priority=”notice”/>
<category name=”linuxany.com” priority=”debug” appender=”stderr” />
<category name=”log4ctest” priority=”debug” appender=”myrollingfileappender” />
<rollingpolicy name=”myrollingpolicy” type=”sizewin” maxsize=”104857600″ maxnum=”10″ />
<appender name=”myrollingfileappender” type=”rollingfile” logdir=”./” prefix=”mylogfile” layout=”dated” rollingpolicy=”myrollingpolicy” />
<appender name=”stdout” type=”stream” layout=”basic”/>
<appender name=”stderr” type=”stream” layout=”dated”/>
<appender name=”syslog” type=”syslog” layout=”basic”/>
<appender name=”s13file” type=”s13_file” layout=”basic”/>
<appender name=”plain_stderr” type=”s13_stderr” layout=”none”/>
<appender name=”cat_stderr” type=”s13_stderr” layout=”catlayout”/>
<appender name=”xml_stderr” type=”s13_stderr” layout=”xmllayout”/>
<appender name=”user_stderr” type=”s13_stderr” layout=”userlayout”/>
<layout name=”basic” type=”basic”/>
<layout name=”dated” type=”dated”/>
<layout name=”catlayout” type=”s13_cat”/>
<layout name=”xmllayout” type=”s13_xml”/>
<layout name=”none” type=”s13_none”/>
<layout name=”userlayout” type=”s13_userloc”/>
</log4c>
—————————————————————————————————————————-
———————————————————–other.h——————————————————-
void otherFunc(void);
—————————————————————————————————————————-
————————————————————-other.c——————————————————
#include “mylog.h”
#include “other.h”
void otherFunc(void)
{
LOG(“%s”,”Enter”);
}
–—————————————————————————————————————————-
–————————————————————mylog.h—————————————————–
#ifndef _MYLOG_H_
#define _MYLOG_H_
#include <string.h>
#include <stdlib.h>
#ifdef __cplusplus
extern “C”
{
#endif
#include “log4c.h”
#ifdef __cplusplus
}
#endif
#define MYLOG_CATEGORY_NAME “log4ctest”
#define MYLOG_PRIORITY LOG4C_PRIORITY_WARN
//1.LOG4C_PRIORITY_ERROR
//2.LOG4C_PRIORITY_WARN
//3.LOG4C_PRIORITY_NOTICE
//4.LOG4C_PRIORITY_DEBUG
//5.LOG4C_PRIORITY_TRACE
extern int mylog_init();
extern void log_message(char* file, int line, const char* func,const char* a_format, …);
extern int mylog_fini();
#define LOG(fmt,args…) log_message(__FILE__, __LINE__, __FUNCTION__,fmt ,## args);
#endif
————————————————————-mylog.c—————————————————–
#include “mylog.h”
const char *format = “[%10s][%4d][%10s()]: “;
log4c_category_t* mycat = NULL;
int mylog_init()
{
if (log4c_init() == 1)
{
return 1;
}
mycat = log4c_category_get(MYLOG_CATEGORY_NAME);
return 0 ;
}
void log_message(char* file, int line, const char* func,const char* a_format, …)
{
char *file_info;
char *new_format;
size_t info_len;
size_t new_format_len;
va_list va;
info_len = strlen(format) + 50;
file_info = (char *) malloc(info_len);
sprintf(file_info, format,file, line,func );
new_format_len = strlen(file_info) + strlen(a_format) + 2;
new_format = (char *) malloc(new_format_len);
sprintf(new_format, “%s%s”, file_info, a_format);
va_start(va, a_format);
log4c_category_vlog(mycat, MYLOG_PRIORITY, new_format, va);
va_end(va);
free(file_info);
free(new_format);
}
int mylog_fini()
{
return(log4c_fini());
}
–—————————————————————————————————————————-
编译、运行结果如下图所示:
日志文件:mylogfile.0