log4z
log4z copied to clipboard
Log4z is an open source C++ lightweight & cross platform log library
在 FAQ( https://github.com/zsummer/log4z/wiki/LOG4Z-1.2.1-FAQ )中提到: 14. 我想添加一个额外的日志记录器 怎么做? 回答: 调用接口DynamicCreateLogger, 然后使用日志输出的时候指定该接口返回的LoggerId. 具体使用参见源代码中提供的advance例子. 然而实际上,在当前(现在是2018年6月11日)的 log4z.h 中,并没有 DynamicCreateLogger 的定义,而且 advance例子中也没有DynamicCreateLogger的例子/ 实际上在我的应用中,非常需要DynamicCreateLogger,因为我需要动态地加载一组动态链接库,然后每一个动态链接库都需要创建它自己的loggerId。主程序实现并不知道会加载哪些动态链接库,完全通过用户行为动态决定。(但动态链接库的个数肯定在20个以内) 我尝试着假如不用DynamicCreateLogger,在在决定加载哪些动态链接库时,执行 ILog4zManager::getRef().stop(); 然后再通过createLogger创建我需要的所有logger,然后再执行 ILog4zManager::getRef().start(); 可是我发现 ILog4zManager 一旦 stop 就无法再 start。 所以我还真是必须要用DynamicCreateLogger。
H:\vcpkg\downloads\log4z-master\g++>cmake -Dlog4z_SOURCE_DIR=".." -G "MinGW Makefiles" CMake Error: Error: generator : MinGW Makefiles Does not match the generator used previously: Visual Studio 15 2017 Either remove the CMakeCache.txt file and CMakeFiles...
The error message as follows: *** log4z.cpp:1265:16: Thread-local storage is not supported for the current target Please refer to https://stackoverflow.com/questions/28094794/why-does-apple-clang-disallow-c11-thread-local-when-official-clang-supports
**测试场景:** 3个线程,每个线程输出10000条数据,使用LOGFMTD输出。并且关闭console输出,只写文件。 **测试环境:** win10 64bit, i5, 8G **测试结果:** 原本应该在日志文件里有30000条记录,结果只有2万多条(每次结果不一样)。 **原因分析:** 定位了一下,发现是prePushLog函数里会判断_logs队列的大小,如果超过LOG4Z_LOG_QUEUE_LIMIT_SIZE就会返回false,这条日志就被丢弃了。 **解决方案:** 把LOG4Z_LOG_QUEUE_LIMIT_SIZE这个值设置大一点,就能输出全部30000条。不过,到底设置多大才算够大,在实际使用过程中不好确定,只能是尽量设置的大一点,保证日志不丢失吧。
建议封装成动态库
单例模式,如果在跨库的使用过程当中(如 DLL库A依赖ILog4zManager,而exe同样依赖ILog4zManager)容易产生两个实例,这样就需要初始化两次(虽然在linux下可以使用rdynamic导出所有符号,确保整个进程中只有一个ILog4zManager符号,但是在windows还没找到解决办法),目前我ILog4zManager改成了动态库,确保在调用工程中只有一个实例在使用
1应该多一点使用的示例啊,比如怎么输出进程线程ID 2.我在log后使用了std::cout, 结果std::cout输出结果竟然在 log之前,这是为什么啊
In current apparoch, if we enable both file logger and SYNC write, the following code will be run: `if (_loggers[pLog->_id]._outfile && LOG4Z_ALL_SYNCHRONOUS_OUTPUT) { if (openLogger(pLog)) { _loggers[pLog->_id]._handle.write(pLog->_content, pLog->_contentLen); closeLogger(pLog->_id); }...