发布一个轻便易用、概念简单、高性能、跨平台、线程安全的纯c日志函数库iLOG3 ^_^
iLOG3是一个轻便易用、概念简单,高性能、多层接口、原生跨平台、(规范使用时)线程安全的遵循LGPL开源协议的标准c日志函数库。
基本特性如下:
·原生跨平台,这意味着你的软件在日志层面上是可轻松移植的,目前支持WINDOWS & UNIX & Linux ,iLOG3会在不同的操作系统上做相应的实现和优化
·五类日志等级
·变参的日志函数和日志宏
·行日志风格方案选配
·输出介质有文件、标准输出、标准错误输出、syslogd或WINDOWS EVENT、自定义介质
高级特性如下:
·支持日志选项组合
·支持按日志文件大小、每天、每小时转档
·支持行日志风格自定义回调函数,很容易定制自己的行日志格式
·支持日志文件的打开、输出、关闭自定义回调函数,很容易扩展成日志输出到远程日志服务器落地
·线程安全、简易MDC、基于线程本地存储的缺省全局日志句柄
分层实施“日志句柄层(LOG)->日志句柄集合层(LOGS)->配置文件接口层(LOGCONF、LOGSCONF)”。其实大部分用户的日志需求很简单,一个进程写一个日志文件(使用日志句柄层函数即可),但也考虑到另外一些用户有多个输出对象需求(使用日志句柄集合层函数即可),还有用户喜欢用外部配置文件来配置日志(使用配置文件接口层函数即可),不同用户在不同项目场景中使用iLOG3的不同层接口,不至于杀鸡用牛刀、小刀砍大树。
我还开发了一个姐妹函数库iLOG3CONF_SML来支持用SML标记语言配置文件来配置日志句柄,有兴趣的朋友也可以调用日志句柄层或日志句柄集合层函数开发自己的iLOG3CONF_*,实现用XML或现在流行的json或自己项目统一配置文件格式,来实现用外部配置文件配置iLOG3日志句柄环境。
此外,源代码结构也比较简单,只有三对源文件,便于搬运、嵌入和修改。
输出日志如下:
下载页面
http://git.oschina.net/calvinwilliams/iLOG3
欢迎使用,多提宝贵意见 ^_^
基本特性如下:
·原生跨平台,这意味着你的软件在日志层面上是可轻松移植的,目前支持WINDOWS & UNIX & Linux ,iLOG3会在不同的操作系统上做相应的实现和优化
·五类日志等级
·变参的日志函数和日志宏
·行日志风格方案选配
·输出介质有文件、标准输出、标准错误输出、syslogd或WINDOWS EVENT、自定义介质
高级特性如下:
·支持日志选项组合
·支持按日志文件大小、每天、每小时转档
·支持行日志风格自定义回调函数,很容易定制自己的行日志格式
·支持日志文件的打开、输出、关闭自定义回调函数,很容易扩展成日志输出到远程日志服务器落地
·线程安全、简易MDC、基于线程本地存储的缺省全局日志句柄
分层实施“日志句柄层(LOG)->日志句柄集合层(LOGS)->配置文件接口层(LOGCONF、LOGSCONF)”。其实大部分用户的日志需求很简单,一个进程写一个日志文件(使用日志句柄层函数即可),但也考虑到另外一些用户有多个输出对象需求(使用日志句柄集合层函数即可),还有用户喜欢用外部配置文件来配置日志(使用配置文件接口层函数即可),不同用户在不同项目场景中使用iLOG3的不同层接口,不至于杀鸡用牛刀、小刀砍大树。
我还开发了一个姐妹函数库iLOG3CONF_SML来支持用SML标记语言配置文件来配置日志句柄,有兴趣的朋友也可以调用日志句柄层或日志句柄集合层函数开发自己的iLOG3CONF_*,实现用XML或现在流行的json或自己项目统一配置文件格式,来实现用外部配置文件配置iLOG3日志句柄环境。
此外,源代码结构也比较简单,只有三对源文件,便于搬运、嵌入和修改。
#include <stdio.h>
#include “LOG.h”
#define LOG_STYLES_HELLO ( LOG_STYLE_DATETIMEMS | LOG_STYLE_LOGLEVEL | LOG_STYLE_PID | LOG_STYLE_TID | LOG_STYLE_SOURCE | LOG_STYLE_FORMAT | LOG_STYLE_NEWLINE )
int test_hello()
{
char buffer[ 64 + 1 ] = "" ;
long buflen = sizeof(buffer)-1 ;
/* 创建日志句柄 */
if(CreateLogHandleG() == NULL )
{
printf( "创建日志句柄失败errno[%d]\n" , errno );
return -1;
}
else
{
printf( "创建日志句柄成功\n" );
}
/* 设置日志输出文件名 */
SetLogOutputG( LOG_OUTPUT_FILE , "test_hello.log" , LOG_NO_OUTPUTFUNC );
/* 设置当前日志过滤等级 */
SetLogLevelG( LOG_LEVEL_INFO );
/* 设置当前行日志风格方案 */
SetLogStylesG( LOG_STYLES_HELLO , LOG_NO_STYLEFUNC);
/* 以不同日志等级写行日志 */
DebugLogG( __FILE__ , __LINE__ , "hello iLOG3" ); /* 这行日志因等级不够,被华丽的过滤了 */
InfoLogG( __FILE__ , __LINE__ , "hello iLOG3" );
WarnLogG( __FILE__ , __LINE__ , "hello iLOG3" );
ErrorLogG( __FILE__ , __LINE__ , "hello iLOG3" );
FatalLogG( __FILE__ , __LINE__ , "hello iLOG3" );
/* 以不同日志等级写十六进制块日志 */
DebugHexLogG( __FILE__ , __LINE__ , buffer , buflen , "缓冲区[%ld]" , buflen ); /* 又一个被华丽的过滤 */
InfoHexLogG( __FILE__ , __LINE__ , buffer , buflen , "缓冲区[%ld]" , buflen );
WarnHexLogG( __FILE__ , __LINE__ , buffer , buflen , "缓冲区[%ld]" , buflen );
ErrorHexLogG( __FILE__ , __LINE__ , buffer , buflen , "缓冲区[%ld]" , buflen );
FatalHexLogG( __FILE__ , __LINE__ , buffer , buflen , "缓冲区[%ld]" , buflen );
/* 销毁日志句柄 */
DestroyLogHandleG();
printf( "释放日志句柄\n" );
return 0;
}
int main()
{
return -test_hello();
}
输出日志如下:
2014-02-09 20:06:39.203000 | INFO | 3880:700:test_20060920.c:32 | hello iLOG3
2014-02-09 20:06:39.203000 | WARN | 3880:700:test_20060920.c:33 | hello iLOG3
2014-02-09 20:06:39.203000 | ERROR | 3880:700:test_20060920.c:34 | hello iLOG3
2014-02-09 20:06:39.203000 | FATAL | 3880:700:test_20060920.c:35 | hello iLOG3
2014-02-09 20:06:39.203000 | INFO | 3880:700:test_20060920.c:39 | 缓冲区[64]
0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2014-02-09 20:06:39.203000 | WARN | 3880:700:test_20060920.c:40 | 缓冲区[64]
0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2014-02-09 20:06:39.203000 | ERROR | 3880:700:test_20060920.c:41 | 缓冲区[64]
0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
2014-02-09 20:06:39.203000 | FATAL | 3880:700:test_20060920.c:42 | 缓冲区[64]
0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0x00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0x00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
下载页面
http://git.oschina.net/calvinwilliams/iLOG3
欢迎使用,多提宝贵意见 ^_^
...全文
相关推荐
C语言程序日志打印和日志文件
在实际应用中,我们可能会看到以下代码片段:```c#include "ilog3.h"void init_logger(const char* log_file) { // 初始化日志系统,设置日志文件
cplex V12.1教程(Getting Started with ILOG Cplex12.1)
**商标声明**:IBM及其子公司拥有多个注册商标,包括IBM标志、WebSphere、ILOG等;此外,还有其他公司的商标和品牌,如Adobe、Linux、Microsoft、Java等。3.
日志接口实现
3. 可能还有一个`init()`方法,用于初始化日志系统,设置日志文件路径、输出格式等参数。在`logcinterface.cpp`中,会实现`ILog`接口的这些方法,具体实现可能包括:1.
log4net日志记录
然后,在项目中创建一个log4net.config文件,定义日志的行为。
C# 利用log4net 把日志写入到数据库
然后,通过`ILog`接口创建一个logger实例,用于记录日志信息。


非技术区
