C++ 新手入门,写了一个简单的 log 小工具,顺便请教个小问题。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Aidenboss
V2EX    C

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

  •  
  •   Aidenboss 2018-12-09 10:22:29 +08:00 2790 次点击
    这是一个创建于 2573 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
        1
    Hconk  
       2018-12-09 10:35:20 +08:00 via Android
    变参模板了解下
    zmj1316
        2
    zmj1316  
       2018-12-09 10:50:14 +08:00
    线程安全做了吗?
    winterfell30
        3
    winterfell30  
       2018-12-09 10:53:59 +08:00
    同楼上,不过楼主为什么要用 auto_ptr,而不用更安全的 unique_ptr
    zmj1316
        4
    zmj1316  
       2018-12-09 10:54:34 +08:00
    转字符串的话,用 fold + std::to_string 就行了
    htfy96
        5
    htfy96  
       2018-12-09 10:57:05 +08:00
    1. 现在都用 shared_ptr 和 make_unique 与变参模板了
    2. 需要增加宏或者 file_location 来提供打印文件名行号的功能
    3. format 直接用 fmt 库吧
    Aidenboss
        6
    Aidenboss  
    OP
       2018-12-09 11:08:52 +08:00
    @Hconk @zmj1316 @winterfell30 @htfy96
    谢谢各位老师的解疑。过会我会按照老师提出的建议做出一定的修正。
    再次谢谢!
    Wicked
        7
    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
        8
    misaka19000  
       2018-12-09 11:36:27 +08:00 via Android
    赞 学习了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1527 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 16:31 PVG 00:31 LAX 08:31 JFK 11:31
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86