Aidenboss
V2EX  ›  C

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

  •  
  •   Aidenboss · Dec 9, 2018 · 3526 views
    This topic created in 2892 days ago, the information mentioned may be changed or developed.

    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 的实现,不能直接判断参数类型。不知道大神们有没有其他方式实现呢?
    谢谢解疑。

    Hconk
    Hconk
    Dec 9, 2018 via Android
    1
    变参模板了解下
    zmj1316
    zmj1316
    Dec 9, 2018
    2
    线程安全做了吗?
    winterfell30
    winterfell30
    Dec 9, 2018
    3
    同楼上,不过楼主为什么要用 auto_ptr,而不用更安全的 unique_ptr
    zmj1316
    zmj1316
    Dec 9, 2018
    4
    转字符串的话,用 fold + std::to_string 就行了
    htfy96
    htfy96
    Dec 9, 2018
    5
    1. 现在都用 shared_ptr 和 make_unique 与变参模板了
    2. 需要增加宏或者 file_location 来提供打印文件名行号的功能
    3. format 直接用 fmt 库吧
    Aidenboss
    Aidenboss
    OP
    Dec 9, 2018
    6
    @Hconk @zmj1316 @winterfell30 @htfy96
    谢谢各位老师的解疑。过会我会按照老师提出的建议做出一定的修正。
    再次谢谢!
    Wicked
    Wicked
    Dec 9, 2018
    7
    GitHub 上看下别人的实现?
    stream style 可以看 NanoLog
    printf style 可以看[stb_log]( https://github.com/wangyongcong/stb_log)
    C++14 single file logger,比 NanoLog 还快那么一点点。你可以跳过多线程的部分,看一下参数处理。用的是比较流行的模板变参的做法,最小化 frondend 的延迟。
    misaka19000
    misaka19000
    Dec 9, 2018 via Android
    8
    赞👍 学习了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2800 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 458ms · UTC 00:45 · PVG 08:45 · LAX 16:45 · JFK 19:45
    ♥ Do have faith in what you're doing.