easylog -- Linux 下的简单日志库

之前使用 log4c 或者 log4cpp 的时候, 总需要配置一些文件和链接库之类复杂的配置。 虽然越复杂越说明这个软件支持的功能多、可选择性强, 但是对于一个小的项目,或者要研究他人的代码而加点儿日志的时候, 用这么复杂的配置就没必要了。

所以我就想,要不写个简单一些的日志库, 这样再用到不需要那么复杂的日志控制工具的时候, 就不用每次都配置环境,也不用写配置文件什么的了。 所以我就写了个这个库,因为过于简单,代码也不多, 也就没必要做成lib库,直接编译到代码里就可以了。

下面从一个简单的小例子来认识一下这个库。

这个库包含两个文件,一个是 .c 文件,一个是 .h 文件, 在使用的时候直接和你的项目代码编译到一起就可以了。

假设项目的代码结构如下:

ls easylog.c easylog.h main.c

项目的主要代码在 main.c 文件里面:

cat main.c 
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog("hello 我的");

    return 0;
}

编译:

gcc -o main main.c easylog.c

运行:

$ ./main
$ ls easylog.c easylog.h main main.c main.log
$ cat main.log
hello 我的

上面的例子是最简配置,也就是不增加任何的多余信息, 在 easylog() 函数里面写什么,就输出什么。 还要就是,在什么都不设置的情况下,会自动创建和执行的文件一样的前缀的log文件。 获得这个文件名的方式是通过系统文件 "/proc/self/exe" 获取的。

要是我想换个其它的日志文件名字呢,那就是 那就需要复杂一些的操作需要在代码里面增加一行代码, 使用 easylog_file() 来制定日志文件的名字。 例如我们要把日志放到文件test.log中, 那就可以这么写:

easylog_file("test.log");

修改项目文件,编译执行,查看日志文件:

$ cat main.c
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog_file("test.log");
    easylog("hello 我的");

    return 0;
}

$ gcc -o main main.c easylog.c
$ ./main
$ ls
easylog.c  easylog.h  main  main.c  main.log  test.log
$ cat test.log
hello 我的

可以看到,当前目录下多了一个 test.log 文件,查看其中的内容,可以看到就是我们输出的日志。

可是我要是想获取其它的信息呢,比如我想获取时间信息。 那就得再加一行,easylog_flag_add(EASYLOG_DATE | EASYLOG_TIME) 这句代码的意思是,在日志中增加两个属性, EASYLOG_DATE 就是日期,EASYLOG_TIME 就是时间。

下面我们修改一下我们的项目文件 main.c,增加一行时间日期的设置代码。

$ cat main.c
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog_file("test.log");
    easylog_flag_add(EASYLOG_DATE | EASYLOG_TIME);
    easylog("hello 我的");

    return 0;
}

编译,运行,查看日志:

$ gcc -o main main.c easylog.c
$ ./main
$ cat test.log
hello 我的
2017-06-10 04:07:23.847 -- hello 我的

既然是为了日志,那就需要更详细的信息,比如我的这个日志是在哪个文件哪一行写下的呢, 为了得到这些信息,我们可以再加上一些设置,比如 EASYLOG_FILE、 EASYLOG_LINE、EASYLOG_FUNC,这三个分别是在日志中记录下这条日志语句所在的 文件、文件行以及所在的函数名。

修改项目文件,编译,运行,查看日志:

$ cat main.c
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog_file("test.log");//设置日志文件名
    easylog_flag_add(EASYLOG_DATE | //设置日志需要的属性
            EASYLOG_TIME |
            EASYLOG_FILE |
            EASYLOG_LINE |
            EASYLOG_FUNC);
    easylog("hello 我的");

    return 0;
}

$ gcc -o main main.c  easylog.c
$ ./main
$ cat test.log
hello 我的
2017-06-10 04:07:23.847 -- hello 我的
2017-06-10 04:20:38.438 main.c 11 main() -- hello 我的

从日志文件也可以看到,最后一行日志显示了日志所在的文件,行数和函数名。 和它上面的两行形成了鲜明的对比。

如果我们在记录到一半的时候,不想要某一个属性了,怎么办呢? 那就移除某一个属性,比如现在要移除日期属性,那就加这么一行: easylog_flag_rm(EASYLOG_DATE);

修改项目文件,编译,运行,查看日志:

$ cat main.c
#include <stdio.h>
#include "easylog.h"

int main(int argc, char* argv[]) {
    easylog_file("test.log");
    easylog_flag_add(EASYLOG_DATE |
            EASYLOG_TIME |
            EASYLOG_FILE |
            EASYLOG_LINE |
            EASYLOG_FUNC);
    easylog("hello 我的");
    easylog_flag_rm(EASYLOG_DATE);//移除项目属性
    easylog("hello 你的");

    return 0;
}

$ gcc -o main main.c  easylog.c
$ ./main
$ cat test.log
hello 我的
2017-06-10 04:37:28.094 -- hello 我的
2017-06-10 04:42:42.996 main.c 11 main() -- hello 我的
04:42:42.997 main.c 13 main() -- hello 你的

从最后的日志中可以看出,日志的最后一行没有记录日期信息。

因为 easylog 的代码本身很少,一共也就200多行, 所以可以被使用者很容易的修改和使用。

最后,easylog 的代码放在了github上,地址在这里https://github.com/fengbohello/easylog ,欢迎同学们来使用 ^_^



同步发表:http://www.fengbohello.top/code/easylog

时间: 2024-10-08 22:06:50

easylog -- Linux 下的简单日志库的相关文章

Linux下一个简单的日志系统的设计及其C代码实现

1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回值及其执行情况.脚本执行及调用情况等.通过阅读日志文件,我们能够较快地跟踪程序流程,并发现程序问题. 因此,熟练掌握日志系统的编写方法并快速地阅读日志文件,是对一个软件开发工程师的基本要求. 本文详细地介绍了Linux下一个简单的日志系统的设计方法,并给出了其C代码实现.本文为相关开发项目Linux

Linux下的动态连接库及其实现机制

Linux与Windows的动态连接库概念相似,但是实现机制不同.它引入了GOT表和PLT表的概念,综合使用了多种重定位项,实现了"浮动代码",达到了更好的共享性能.本文对这些技术逐一进行了详细讨论. 本文着重讨论x86体系结构,这是因为 (1)运行Linux的各种体系结构中,以x86最为普及: (2)该体系结构上的Windows操作系统广为人知,由此可以较容易的理解Linux的类似概念: 下表列出了Windows与Linux的近义词,文中将不加以区分: Windows Linux 动

linux下编译安装boost库

转载:http://www.cnblogs.com/oloroso/p/4632848.html linux下编译安装boost库 linux下编译安装boost库 1.下载并解压boost 1.58 源代码 下载 解压 2.运行bootstrap.sh 3.使用b2进行构建 构建成功的提示 4.安装boost库到指定目录 5.测试一下 代码 编译运行 先看一下系统环境 Linux o-pc 3.19.0-22-generic #22-Ubuntu SMP Tue Jun 16 17:15:15

linux下的静态连接库和动态链接库

对linux的静态连接库和动态链接库分不清楚,在看了一篇博文后,现在想做个自己的总结,以加深印象: 1.库的基本概念: 库是可执行代码的二进制形式,其可以被调入操作系统调入内存进行执行. 在window和linux系统,都存在各自的库,但是两种系统的库并不能兼容,因为它们的编译器,连接器,汇编器都是不相同的. 在windows下,静态连接库的后缀是.lib;动态链接库的后缀是.dll 在linux系统下,静态链接库的后缀是.a;动态链接库的后缀是.so 2.静态连接库和动态链接库的命名: 静态连

linux下常用的日志分析命令

linux下常用的日志分析命令 本文介绍下,在linux中常用的一些分析日志的命令行或脚本,有需要的朋友参考下. 形如下面这样的access.log日志内容: 211.123.23.133 – - [10/Dec/2010:09:31:17 +0800] “GET /query/trendxml/district/todayreturn/month/2009-12-14/2010-12-09/haizhu_tianhe.xml HTTP/1.1″ 200 1933 “-” “Mozilla/5.

Linux下搭建简单的DHCP服务器

在RHEL6.5下搭建简单的DHCP服务器 实验目标 1.为192.168.10.0/24网段的客户机自动配置网络参数 用来给客户机自动分配地址的IP地址范围是:192.168.10.50-192.168.10.100.192.168.10.120-192.168.10.200 客户机的默认网关地址设为192.168.10.1 客户机所使用的DNS服务器设为202.106.0.20.8.8.8.8,默认域后缀是"tarena.com" 将默认租期设为2小时,最大租期设置为4小时 2.为

转载: linux下创建svn代码库

linux下创建svn代码库 1.安装svn客户端 2.创建svn代码库 1.安装svn客户端 1.1.使用命令安装 1)CentOS $ yum install subversion 2)ubuntu sudo apt-get install subversion 1.2.源码安装 http://www.cnblogs.com/fengbohello/p/4142810.html 2.开启svn服务进程 2.1.我的习惯是把代码仓库放在/opt/svn目录下,所以先创建目录/opt/svn $

LINUX下的简单线程池

前言 任何一种设计方式的引入都会带来额外的开支,是否使用,取决于能带来多大的好处和能带来多大的坏处,好处与坏处包括程序的性能.代码的可读性.代码的可维护性.程序的开发效率等. 线程池适用场合:任务比较多,需要拉起大量线程来处理:任务的处理时间相对比较短,按照线程的周期T1(创建阶段).T2(执行阶段).T3(销毁阶段)来算,执行阶段仅占用较少时间. 简单的线程池通常有以下功能:预创建一定数量的线程:管理线程任务,当工作线程没有事情可做时休眠自己:销毁线程池. 复杂一些的线程池有额外的调节功能:管

linux下最简单好用的的端口转发工具

linux下最简单好用的的端口转发工具官网地址 http://www.rinetd.com/软件下载wget http://www.rinetd.com/download/rinetd.tar.gz 解压安装tar zxvf rinetd.tar.gzmakemake install 编辑配置vi /etc/rinetd.conf0.0.0.0 8080 172.19.94.3 80800.0.0.0 2222 192.168.0.103 33891.2.3.4 80 192.168.0.10