代码之家  ›  专栏  ›  技术社区  ›  Anycorn

C++事件库

  •  3
  • Anycorn  · 技术社区  · 15 年前

    您能否推荐具有以下功能的轻型跨平台事件记录/日志库:

    • 简单界面
    • 增量事件记录(即事件++)
    • 快速更新
    • 可定制的报告输出(例如iostream)
    • 时间戳或操作系统集成并不重要

    原则上,使用带有字符串/整型键值的映射并不难,但我宁愿使用已经编写的映射。我看了一下log4cxx,但这似乎有点过头了。

    谢谢

    4 回复  |  直到 15 年前
        1
  •  0
  •   Michael Scott Shappe    15 年前

    好的旧系统日志(或系统日志ng)似乎是一个开始的好地方…

        2
  •  0
  •   Ricardo    15 年前
    • http://pantheios.sourceforge.net/ Pantheios是一个开源的C/C++诊断日志API库,它提供了100%种安全性、效率、通用性和可扩展性的最佳结合。它易于使用和扩展,高度可移植(与平台和编译器无关),最重要的是,它支持C传统,即您只为所使用的内容付费。

    • http://www.arg0.net/rlog RLog是C++程序和库的灵活消息记录工具。它针对没有输出日志消息的情况进行了高度优化,因此可以保留在生产代码中并按需启用

        3
  •  0
  •   harry    15 年前

    您需要的是BoostLogging库,它简单、快速、可配置。

    我不确定Event++选项,但它不会很难实现。它有你所需要的一切,还有更多,看看吧。 http://torjo.com/log2/doc/html/main_intro.html#main_motivation

        4
  •  0
  •   Anycorn    15 年前

    这是原型,最终版本是: http://code.google.com/p/asadchev/source/browse/trunk/projects/boost/utility/profiler.hpp

    #define UTILITY_EVENT_HPP
    
    #include "utility/timer.hpp"
    
    #include <string>
    #include <map>
    #include <boost/thread.hpp>
    #include <boost/tuple/tuple.hpp>
    
    #define PROFILE_FUNCTION(...)                                   \
        utility::profiler::event                                    \
        event__(utility::profiler::global[                          \
            utility::detail::profiler_event(__PRETTY_FUNCTION__)(__VA_ARGS__)])
    
    
    
    namespace utility {
    
        namespace detail {
            struct profiler_event {
                profiler_event(const std::string &key) : data_(key) {}
                operator const std::string&() const { return data_; }
                profiler_event& operator()(const std::string &key) {
                    data_ += (":" + key);
                    return *this;
                }
                profiler_event& operator()() { return *this; }
            private:
                std::string data_;
            };
        }
    
    
        struct profiler {
    
            typedef std::string event_key;
    
            struct event_data {
                event_data(): size_(0), value_(0) {}
                event_data(const event_data &e)
                    : size_(e.size_), value_(e.value_) {}
                event_data& operator+=(double t) {
                    boost::lock_guard<boost::mutex> lock(mutex_);
                     ++size_;
                     value_ += t;
                    return *this;
                }
                event_data& operator++() { return (*this += 1); }
                std::ostream& to_stream(std::ostream &ostream) const {
                    boost::lock_guard<boost::mutex> lock(mutex_);
                    ostream << value_ << "/" << size_;
                    return ostream;
                }
            private:
                typedef boost::tuple<profiler&, const event_key&> constructor;
                size_t size_;
                double value_;
                mutable boost::mutex mutex_;
            };
    
            struct event {
                event(event_data &data) : data_(data) {}
                ~event() {
                    // std::cout << timer_ << std::endl;
                    data_ += double(timer_);
                }
                event_data &data_;
                utility::timer timer_;
            };
    
            event_data& operator[](const event_key &key) {
                boost::lock_guard<boost::mutex> lock(mutex_);
                return events_[key];
            }
            std::ostream& to_stream(std::ostream &ostream) const {
                boost::lock_guard<boost::mutex> lock(mutex_);
                std::map<event_key, event_data>::const_iterator it = events_.begin();
                while (it != events_.end()) {
                    ostream << it->first << ": ";
                    it->second.to_stream(ostream);
                    ostream << std::endl;
                    ++it;
                }
                return ostream;
            }
            static profiler global;
        private:
            std::map<event_key, event_data> events_;
            mutable boost::mutex mutex_;
        };
    
        inline std::ostream& operator<<(std::ostream &ostream, const profiler &p) {
            return p.to_stream(ostream);
        }
    
    }
    
    
    #endif // UTILITY_EVENT_HPP