zoukankan      html  css  js  c++  java
  • 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 ,欢迎同学们来使用 ^_^


    同步发表:https://www.fengbohello.top/archives/easylog

  • 相关阅读:
    文件操作工具类
    批量插入数据到 MySQL的几种方式
    C#队列学习笔记:RabbitMQ使用多线程提高消费吞吐率
    C#队列学习笔记:RabbitMQ延迟队列
    C#队列学习笔记:RabbitMQ优先级队列
    C#队列学习笔记:RabbitMQ实现客户端相互通讯
    C#队列学习笔记:RabbitMQ搭建集群
    C#队列学习笔记:RabbitMQ安装及使用
    C#队列学习笔记:RabbitMQ基础知识
    C#队列学习笔记:MSMQ入门二
  • 原文地址:https://www.cnblogs.com/fengbohello/p/6978469.html
Copyright © 2011-2022 走看看