开源纯C日志函数库iLOG3快速入门(八、如果你喜欢简单日志函数甚于日志函数库)

很多网友来信坚持表达了在项目中应使用简单日志函数,而不喜欢日志函数库,我与之反复争论无果,不过话说回来,我也喜欢短小轻快的日志函数库,而不是融入太多功能的臃肿库,比如日志转档我还是坚持用外部shell来实现会更好,这样的日志函数库既可以小很多,也可以更轻快稳定,我只是迫于另外一批功能控网友的“威胁”而加入了太多的功能,他们喜欢极端的一揽子解决方案,并且展示其它诸如log4c也实现了这些功能为由证明他们是正确的,如果我不实现就免谈。

最近在研发一个小型的应用服务器平台tcpdaemon,里面需要日志功能,但整个tcpdaemon代码很少,比iLOG3小的多,于是让我想到最上面的那些网友的话,经过反复考量,我决定给我的iLOG3补充一点小鬼灵精怪——附带一个单独的迷你型的简单日志函数,这样大家终于都满足了吧。

src/新增LOGC.h,LOGC.c,这两个源文件不编译进libiLOG3.so,而是独立出来提供喜欢简单日志函数而反感日志函数库的朋友单独复制到他的项目中去直接源码包含使用。比如tcpdaemon项目

tcpdaemon-1.1.0/
    src/
        tcpdaemon.h
        main.c
        tcpdaemon.c
        worker.c
        LOGC.h
        LOGC.c
        ...

在iLOG3的test目录中有测试案例test_logc.c

#include "../src/LOGC.h"

int test_logc()
{
    char    buf[ 64 + 1 ] ;
    long    buflen ;

    SetLogFile( "%s/log/test_logc.log" , getenv("HOME") );
    SetLogLevel( LOGLEVEL_INFO );

    DebugLog( __FILE__ , __LINE__ , "call DebugLog" );
    InfoLog( __FILE__ , __LINE__ , "call InfoLog" );
    WarnLog( __FILE__ , __LINE__ , "call WarnLog" );
    ErrorLog( __FILE__ , __LINE__ , "call ErrorLog" );
    FatalLog( __FILE__ , __LINE__ , "call FatalLog" );

    memset( buf , 0x00 , sizeof(buf) );
    buflen = sizeof(buf) - 1 ;
    DebugHexLog( __FILE__ , __LINE__ , buf , buflen , "call DebugHexLog" );
    InfoHexLog( __FILE__ , __LINE__ , buf , buflen , "call InfoHexLog" );
    WarnHexLog( __FILE__ , __LINE__ , buf , buflen , "call WarnHexLog" );
    ErrorHexLog( __FILE__ , __LINE__ , buf , buflen , "call ErrorHexLog" );
    FatalHexLog( __FILE__ , __LINE__ , buf , buflen , "call FatalHexLog" );

    return 0;
}

int main()
{
    return -test_logc();
}

编译时只需把LOGC.c一起编译链接即可

$ gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c test_logc.c
$ gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -c ../src/LOGC.c
$ gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -o test_logc test_logc.o LOGC.o -lpthread
$ ./test_logc
$ cat $HOME/log/test_logc.log
2014-07-20 22:35:12.890000 | INFO  | 1556:3284:test_logc.c:12 | call InfoLog
2014-07-20 22:35:12.906000 | WARN  | 1556:3284:test_logc.c:13 | call WarnLog
2014-07-20 22:35:12.906000 | ERROR | 1556:3284:test_logc.c:14 | call ErrorLog
2014-07-20 22:35:12.906000 | FATAL | 1556:3284:test_logc.c:15 | call FatalLog
2014-07-20 22:35:12.906000 | INFO  | 1556:3284:test_logc.c:20 | call InfoHexLog
             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-07-20 22:35:12.906000 | WARN  | 1556:3284:test_logc.c:21 | call WarnHexLog
             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-07-20 22:35:12.906000 | ERROR | 1556:3284:test_logc.c:22 | call ErrorHexLog
             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-07-20 22:35:12.906000 | FATAL | 1556:3284:test_logc.c:23 | call FatalHexLog
             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   ................

很简单吧?那就赶紧下载来玩玩吧

首页传送门 : [url]http://git.oschina.net/calvinwilliams/iLOG3[/url]

源代码包doc目录中包含了用户指南和参考手册,里面有更详尽的说明

开源纯C日志函数库iLOG3快速入门(八、如果你喜欢简单日志函数甚于日志函数库)

时间: 2024-08-04 17:55:31

开源纯C日志函数库iLOG3快速入门(八、如果你喜欢简单日志函数甚于日志函数库)的相关文章

C++矩阵库 Eigen 快速入门

最近需要用 C++ 做一些数值计算,之前一直采用Matlab 混合编程的方式处理矩阵运算,非常麻烦,直到发现了 Eigen 库,简直相见恨晚,好用哭了. Eigen 是一个基于C++模板的线性代数库,直接将库下载后放在项目目录下,然后包含头文件就能使用,非常方便.此外,Eigen的接口清晰,稳定高效.唯一的问题是之前一直用 Matlab,对 Eigen 的 API 接口不太熟悉,如果能有 Eigen 和 Matlab 对应的说明想必是极好的,终于功夫不负有心人,让我找到了,原文在这里,不过排版有

Spring Boot 快速入门 史上最简单

1.Spring Boot 概述 Spring Boot 是所有基于 Spring 开发的项目的起点.Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件. 2.什么是 Spring Boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我的话来理解,就是spring boot其实不是什么新

JQuery面向对象编程快速入门(八)-插件开发

JQuery源码片段分析 (function(window){ /** * jQuery是一个函数 是一个对象 是一个构造器函数 */ var jQuery = function( selector, context ) { return new jQuery.fn.init( selector, context ); }, //fn就是jQuery对象上的一个属性,该属性指向了prototype //jQuery的 prototype中的方法是根据jQuery的选择器获取到的jQuery对象,

(多核DSP快速入门)1.创建简单的多核DSP项目HelloWorld

原创文章 转载请注册来源http://blog.csdn.net/tostq 教程目录:http://blog.csdn.net/tostq/article/details/51245979 本节我们将运行第一个多核DSP程序,熟悉CCS开发环境,学会使用CCS调试工具,主要内容如下: (1)新建CCS项目 (2)导入Target 仿真模块 (3)使用调试工具 一.新建CCS项目 选择File/New/CCS Project 二.新建项目对话框 (1)Project name: 指项目名称,这里

Jmeter 快速入门教程(二)--创建简单web测试

[版权所有: whoistester.com & jmeter.cf] 今天我们就来实际用Jmeter创建一个测试场景,并进行性能测试. 注:由于本人使用中文版本,使用英文版本的请注意具体的菜单及参数名称. 1. 添加线程组(相当于lr里的scenario 设置) 打开jmeter主窗口后, 选择左侧树形结构里的"测试计划". 然后右键选择添加, 选择"threads(users)",我们可以看到 [email protected]开头的是google jm

mybatis快速入门(八)-spring-mybatis动态代理整合

将上一节的代码改造下就好了,不过这一章会加一个basedaomapper.废话不多说直接上代码了. 创建一个BaseDaoMapper.java package cn.my.sm.mapper; /** * 将公用方法提取出来 * @author Administrator * * @param <T> */ public interface BaseDaoMapper<T> { public T findById(int id); } 为了防止和上个UserDao有冲突,我们创建

其他主流开源硬件简介BeagleBone Black快速入门

其他主流开源硬件简介BeagleBone Black快速入门 1.3 其他主流开源硬件简介 开源硬件种类繁多,但主要有两款开源硬件常与BeagleBone比较.它们就是Arduino和Raspberry Pi(即树莓派).之所以常拿他们来比较,是因为他们有共同点也有不同点.在笔者看来,他们之间可以互相补充,但是均是不可替代的.下面就来简单介绍一下这两种开源硬件本文选自BeagleBone Black快速入门教程. 1.3.1  Arduino Arduino常被用来称呼Arduino的硬件控制器

TinyXml快速入门(二)

在<TinyXml快速入门(一)>中我介绍了使用TinyXml库如何创建和打印xml文件,下面我介绍使用tinyxml库对xml文件进行一系列的操作,包括获取xml文件声明,查询指定节点.删除指定节点.修改指定节点和增加节点的用法.在<TinyXml快速入门(一)>中我们知道xml文件中的一个节点元素实际包含两种值:属性和文本.其中属性在我看来可以看作是STL中的map,一个属性带一个属性值,map中也是一个键带一个键值.因此查询指定节点.删除指定节点和增加节点必然是需要实现两种方

第一章 快速入门

C++ Primer 中文版,第4版 /* 第一章 快速入门第二章 变量和基本类型第三章 标准库类型第四章 数组和指针第五章 表达式第六章 语句第七章 函数第八章 标准IO库第九章 顺序容器第十章 关联容器第11章 泛型算法 第12章 类 第13章 复制控制 第14章 重载操作符与转换第15章 面向对象编程第16章 模板和泛型编程第17章 用于大型程序的工具第18章 特殊工具与技术 */ /* 第一部分:基本语言------------------------------------------