C++ 新手入门,写了一个简单的 log 小工具,顺便请教个小问题。

2018-12-09 10:22:29 +08:00
 Aidenboss

C++ 新手,写了一个简单的 log 小工具。
使用了 appender、format 正交设计。支持多个 appender。appender 只实现了 FileLoggerAppender 和 ConsoleLoggerAppender ; format 只实现了 PlainTextFormat。
还简单的支持 template 参数。 使用方式:

   auto_ptr<Logger> logger(new Logger());
   auto_ptr<LoggerAppender> fileLoggerAppender(new FileLoggerAppender());
   auto_ptr<LoggerAppender> consoleLoggerAppender(new ConsoleLoggerAppender());
   auto_ptr<PlainTextLoggerFormat> plainTextLoggerFormat(new PlainTextLoggerFormat());
   logger.get()->loggerAppender(fileLoggerAppender.get())
           ->loggerAppender(consoleLoggerAppender.get())
           ->loggerFormat(plainTextLoggerFormat.get());

   string errorMessage("num1: {} add number2: {}, sum : {}");

   logger.get()->e(errorMessage, "10", "20", "30");

output:

    [ERROR] 2018-12-2 23:41:40: num1: 10 add number2: 20, sum : 30

还有一个小问题,想请教下。

num1: {} add number2: {}, sum : {}

只能传入 10, 20, 30 的字符串,而不能传入 int 类型的参数。 我这里使用了 va_args 的实现,不能直接判断参数类型。不知道大神们有没有其他方式实现呢?
谢谢解疑。

2372 次点击
所在节点    C
8 条回复
Hconk
2018-12-09 10:35:20 +08:00
变参模板了解下
zmj1316
2018-12-09 10:50:14 +08:00
线程安全做了吗?
winterfell30
2018-12-09 10:53:59 +08:00
同楼上,不过楼主为什么要用 auto_ptr,而不用更安全的 unique_ptr
zmj1316
2018-12-09 10:54:34 +08:00
转字符串的话,用 fold + std::to_string 就行了
htfy96
2018-12-09 10:57:05 +08:00
1. 现在都用 shared_ptr 和 make_unique 与变参模板了
2. 需要增加宏或者 file_location 来提供打印文件名行号的功能
3. format 直接用 fmt 库吧
Aidenboss
2018-12-09 11:08:52 +08:00
@Hconk @zmj1316 @winterfell30 @htfy96
谢谢各位老师的解疑。过会我会按照老师提出的建议做出一定的修正。
再次谢谢!
Wicked
2018-12-09 11:09:58 +08:00
GitHub 上看下别人的实现?
stream style 可以看 NanoLog
printf style 可以看[stb_log]( https://github.com/wangyongcong/stb_log)
C++14 single file logger,比 NanoLog 还快那么一点点。你可以跳过多线程的部分,看一下参数处理。用的是比较流行的模板变参的做法,最小化 frondend 的延迟。
misaka19000
2018-12-09 11:36:27 +08:00
赞👍 学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/515785

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX