介绍一个headonly的log库easylogging++
因为TX的log要求按照小时滚动,并且按照大小滚动,原来的glog设置完大小后,容量了就不会再写入了,而且按小时滚动也很麻烦,所以就找了找其他的log库。
主要要求简单上手,支持大小和时间滚动,不需要改动太多。
看了之前用过的log4cxx等库,发现编译成静态文件后太大了,我们又必须要求静态,所以就很麻烦。
github上找到了一个easylogging++的库,headonly,只有一个头文件,看起来非常炫酷,决定试一试,结果上手确实很简单,支持配置,配置也很强大
项目地址:https://github.com/easylogging/easyloggingpp
一个简单的使用例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#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是配置文件,大致内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
* 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非常整齐,整体满足了我的需求,而且只有头文件,不需要编译库,实在是方便。
zpu
2018 年 1 月 4 日 21:16
这个头文件能用在Linux下的C开发码?
NickYang
2018 年 1 月 6 日 10:52
跨平台的,但是需要C++编译器
利物浦
2017 年 12 月 19 日 15:54
博主,我想请问一下easyloggingpp能不能实现每天生成新的日志文件?
NickYang
2017 年 12 月 19 日 16:16
把GitHub上的代码改一下就可以实现了,我增加了按照小时滚动,你可以修改为按照天来滚动
利物浦
2018 年 1 月 3 日 14:31
博主,这个按天滚动指的是前一天的文件会被覆盖,然后重新生成一个文件是吗?这个在windows环境下进行备份有点麻烦?
NickYang
2018 年 1 月 3 日 14:34
不会覆盖,会生成一个新名字的文件,文件名中带日期的
利物浦
2018 年 1 月 3 日 15:06
那博主你能把你按小时滚动的日志代码分享一下吗?
NickYang
2018 年 1 月 3 日 15:08
看上面github的地址,已经包含了我的改动
利物浦
2018 年 1 月 3 日 15:19
你指的是src目录下的easyloggingpp的两个文件吗?
NickYang
2018 年 1 月 3 日 15:43
https://github.com/NickYang1988/easylogging
这个地址,我的github上的
利物浦
2018 年 1 月 3 日 16:24
博主,不好意思,想请问一下,你的github上面只有一个头文件,你这按小时滚动是在头文件中实现的吗?还有,我参考了你另一个工程中的文件AFCLogModule.cpp,没有发现实现按小时滚动?
NickYang
2018 年 1 月 3 日 16:32
easylogging++本身就只有一个头文件,按照文件名滚动逻辑是在https://github.com/ArkGame/ArkGameFrame/blob/master/Frame/SDK/UtilityPlugin/AFCLogModule.cpp
按照时间滚动的在 https://github.com/NickYang1988/easylogging 函数是:unsafeValidateFileRolling
NickYang
2018 年 1 月 3 日 16:34
我用的是老版本,只有一个头文件
chesun
2017 年 5 月 27 日 17:12
大神 如何在低级别日志里包含高级别日志?
NickYang
2017 年 5 月 31 日 17:35
修改源码,把其中的switch-case中的break去掉,按照级别case下去就好了
yeshi
2017 年 4 月 6 日 17:20
ELPP_UNICODE
START_EASYLOGGINGPP(argc, argv);
…………………….
LOG(INFO) << L"中文汉字输出测试";
LOG(INFO) << "English Test";
中文输出不到屏幕终端,一旦输出中文,其后的日志都无法显示到终端,即使是英文也不能再终端显示
不过中文日志可正常输出到文件。
楼主有没有好的解决办法
NickYang
2017 年 4 月 6 日 17:29
你试试直接用中文呢,我还真没测试过中文,基本log都是输出英文的了,运营环境下机器都是英文环境。所以暂时帮不了你,你可以试试转成unicode
1233
2016 年 11 月 22 日 09:30
error C3861: “TRACE”: 找不到标识符 用在MFC中怎么报这个错
soshan
2015 年 9 月 18 日 10:53
用vs2010编译的过去吗?
eliteYang
2015 年 9 月 18 日 18:01
麻烦你仔细看下文章内容,这个库是head-only的,也就是只有头文件,直接包含就可以了,跟编译器没关系
soshan
2015 年 9 月 18 日 18:24
vs2010的编译报错,头文件用到c++11相关的东西,vs2010编译不过?你如果有vs2010可以帮忙看下,谢谢!
eliteYang
2015 年 9 月 19 日 15:23
具体的错误在github的issue里贴一下,我们在里面讨论
eliteYang
2015 年 9 月 19 日 15:23
https://github.com/eliteYang/easylogging 我做了小时滚动的版本,在这里讨论
soshan
2015 年 9 月 21 日 08:27
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”: 只有静态常量整型数据成员才可以在类中初始化
类似这些
eliteYang
2015 年 9 月 21 日 15:14
看这个章节,确实是不支持VS2010的,他用了模版参数
https://github.com/easylogging/easyloggingpp#compatibility
Tested with VS2012, VS2013-Preview; Use of argument templates instead of variadic templates. CRT warnings control. No stack trace logging.
wisteria
2015 年 6 月 10 日 16:44
好, 非常感谢, 我就不用再去造轮子了
eliteYang
2015 年 6 月 10 日 16:46
哈……因为我们是跟TX合作,需要按小时的,你也可以按天滚动,修改下时间判断就好了,造轮子太累了,这个库还算比较轻量,而且headonly的,可以试试,有问题多交流,微信和QQ都可以
wisteria
2015 年 6 月 10 日 16:28
这个简单粗暴按照小时滚动式怎么实现的呢, 能教下我么
eliteYang
2015 年 6 月 10 日 16:39
看github上这个我上传修改过的工程,https://github.com/eliteYang/easylogging 里面的这个函数unsafeValidateFileRolling,具体用法请看ReadMe.md文件
wisteria
2015 年 6 月 10 日 16:45
谢啦,
善记事博客
2015 年 5 月 27 日 17:26
内容很实用,谢谢
yoyo
2015 年 5 月 5 日 11:56
这个需要用到STL么?
eliteYang
2015 年 5 月 5 日 12:28
现在STL是标准库,肯定会用到的
阿里百秀
2015 年 4 月 13 日 11:16
分享的内容很赞,可以试试
阿里百秀
2015 年 4 月 13 日 11:16
分享的内容很赞,可以试试
Yu
2015 年 4 月 4 日 22:51
好赞,我也试试
eliteYang
2015 年 4 月 4 日 22:56
可以试试,挺不错的