介绍一个headonly的log库easylogging++

因为TX的log要求按照小时滚动,并且按照大小滚动,原来的glog设置完大小后,容量了就不会再写入了,而且按小时滚动也很麻烦,所以就找了找其他的log库。

主要要求简单上手,支持大小和时间滚动,不需要改动太多。

看了之前用过的log4cxx等库,发现编译成静态文件后太大了,我们又必须要求静态,所以就很麻烦。

github上找到了一个easylogging++的库,headonly,只有一个头文件,看起来非常炫酷,决定试一试,结果上手确实很简单,支持配置,配置也很强大

项目地址:https://github.com/easylogging/easyloggingpp

一个简单的使用例子:

#include "boost/filesystem.hpp"
#include "easylog/easylogging++.h"

INITIALIZE_EASYLOGGINGPP

static unsigned int idx = 0;

void rolloutHandler(const char* filename, std::size_t size)
{
    std::stringstream stream;
    stream << filename << "." << ++idx;
    boost::filesystem::rename(filename, stream.str().c_str());
}

int main(int argc, char** argv)
{
    el::Loggers::addFlag(el::LoggingFlag::StrictLogFileSizeCheck);
    el::Configurations conf("log.conf");
    el::Loggers::reconfigureAllLoggers(conf);
    el::Helpers::installPreRollOutCallback(rolloutHandler);

    for (int i = 0; i < 100000; ++i)
    {
        LOG(INFO) << "Test==========================================================";
    }

    el::Helpers::uninstallPreRollOutCallback();
    return 0;
}

上面注册过滚动函数后就可以按照大小滚动了,不过注意一定要加上StrictLogFileSizeCheck的flag。

按照小时滚动的我加了一些简单粗暴的代码实现了,就不放出来献丑了,如果大家需要,可以单独找我获取。

其中log.conf是配置文件,大致内容如下:

* GLOBAL:
    FORMAT                  =   "[%level | %datetime] | %msg"
    ENABLED                 =   true
    TO_FILE                 =   true
    TO_STANDARD_OUTPUT      =   true
    MILLISECONDS_WIDTH      =   3
    PERFORMANCE_TRACKING    =   false
    MAX_LOG_FILE_SIZE       =   209715200 ## Throw log files away after 2097152 2MB / 209715200 200MB / 4398046511104 1GB
* INFO:
    LOG_FLUSH_THRESHOLD     =   10
    FILENAME                =   "log/game_server_info_%datetime{%Y%M%d%H}.log"
    ENABLED                 =   true
* DEBUG:
    FILENAME                =   "log/game_server_debug_%datetime{%Y%M%d%H}.log"
    ENABLED                 =   true
* WARNING:
    LOG_FLUSH_THRESHOLD     =   0
    FILENAME                =   "log/game_server_warn_%datetime{%Y%M%d%H}.log"
    ENABLED                 =   true
* TRACE:
    
* VERBOSE:
    FORMAT                  =   "%level-%vlevel | %datetime{%d/%M/%y}  | %msg"
## Error logs
* ERROR:
    LOG_FLUSH_THRESHOLD     =   0
    ENABLED                 =   true
    FILENAME                =   "log/game_server_error_%datetime{%Y%M%d%H}.log"
* FATAL:
    LOG_FLUSH_THRESHOLD     =   0
    ENABLED                 =   true
    FILENAME                =   "log/game_server_fatal_%datetime{%Y%M%d%H}.log"

生成出来的log非常整齐,整体满足了我的需求,而且只有头文件,不需要编译库,实在是方便。


NickYang

NickYang

无知一码农,现居住于上海,从事游戏服务器端开发
http://www.cppfans.org


Comments

              1. 博主,不好意思,想请问一下,你的github上面只有一个头文件,你这按小时滚动是在头文件中实现的吗?还有,我参考了你另一个工程中的文件AFCLogModule.cpp,没有发现实现按小时滚动?

  1. ELPP_UNICODE
    START_EASYLOGGINGPP(argc, argv);
    …………………….
    LOG(INFO) << L"中文汉字输出测试";
    LOG(INFO) << "English Test";
    中文输出不到屏幕终端,一旦输出中文,其后的日志都无法显示到终端,即使是英文也不能再终端显示
    不过中文日志可正常输出到文件。
    楼主有没有好的解决办法

          1. easylogging++.h(502): error C2332: “enum”: 缺少标记名
            easylogging++.h(502): error C2236: 意外的“class”“el::Level”。是否忘记了“;”?
            easylogging++.h(502): error C3381: “el::Level”: 只有在用 /clr 选项编译的代码中才有程序集访问说明符
            easylogging++.h(502): error C2516: “el::base::type::EnumType”: 是非法基类
            easylogging++.h(471) : 参见“el::base::type::EnumType”的声明
            easylogging++.h(504): error C4430: 缺少类型说明符 – 假定为 int。注意: C++ 不支持默认 int
            easylogging++.h(504): error C2864: “el::Level::Global”: 只有静态常量整型数据成员才可以在类中初始化

            类似这些

    1. 哈……因为我们是跟TX合作,需要按小时的,你也可以按天滚动,修改下时间判断就好了,造轮子太累了,这个库还算比较轻量,而且headonly的,可以试试,有问题多交流,微信和QQ都可以

发表评论

电子邮件地址不会被公开。 必填项已用*标注