#include <boost/log/sinks/text_ostream_backend.hpp>\r
#include <boost/log/sinks/sync_frontend.hpp>\r
#include <boost/log/sinks/async_frontend.hpp>\r
+#include <boost/log/core/record.hpp>\r
+#include <boost/log/utility/attribute_value_extractor.hpp>\r
\r
#include <boost/log/utility/init/common_attributes.hpp>\r
#include <boost/log/utility/empty_deleter.hpp>\r
-\r
+#include <boost/lambda/lambda.hpp>\r
\r
namespace caspar{ namespace log{\r
\r
using namespace boost;\r
\r
-namespace internal{\r
\r
+class system_uptime : public boost::log::attribute\r
+{\r
+ typedef boost::log::attributes::basic_attribute_value<unsigned int> attribute_value_type;\r
+\r
+public:\r
+ boost::shared_ptr<boost::log::attribute_value> get_value()\r
+ {\r
+ unsigned int up;\r
+ up = GetTickCount() / 1000;\r
+ return boost::shared_ptr<boost::log::attribute_value>(new attribute_value_type(up));\r
+ }\r
+};\r
+\r
+void my_formatter(std::wostream& strm, boost::log::basic_record<wchar_t> const& rec)\r
+{\r
+ namespace lambda = boost::lambda;\r
+ \r
+ #pragma warning(disable : 4996)\r
+ time_t rawtime;\r
+ struct tm* timeinfo;\r
+ time(&rawtime );\r
+ timeinfo = localtime ( &rawtime );\r
+ char buffer [80];\r
+ strftime (buffer,80, "%c", timeinfo);\r
+ strm << L"[" << buffer << L"] ";\r
+ \r
+ boost::log::attributes::current_thread_id::held_type thread_id;\r
+ if(boost::log::extract<boost::log::attributes::current_thread_id::held_type>(L"ThreadID", rec.attribute_values(), lambda::var(thread_id) = lambda::_1))\r
+ strm << L"[" << thread_id << L"] ";\r
+\r
+ severity_level severity;\r
+ if(boost::log::extract<severity_level>(boost::log::sources::aux::severity_attribute_name<wchar_t>::get(), rec.attribute_values(), lambda::var(severity) = lambda::_1))\r
+ strm << L"[" << severity << L"] ";\r
+\r
+ strm << rec.message();\r
+}\r
+\r
+namespace internal{\r
+ \r
void init()\r
{ \r
+ boost::log::wcore::get()->add_global_attribute(L"ASD", boost::make_shared<system_uptime>());\r
+\r
boost::log::add_common_attributes<wchar_t>();\r
typedef boost::log::aux::add_common_attributes_constants<wchar_t> traits_t;\r
\r
stream_backend->auto_flush(true);\r
\r
auto stream_sink = boost::make_shared<stream_sink_type>(stream_backend);\r
-\r
- stream_sink->locked_backend()->set_formatter(\r
- boost::log::formatters::wstream\r
- //<< L"[" << boost::log::formatters::date_time<std::tm>(L"TimeStamp") << L"] "\r
- << L"[" << boost::log::formatters::attr<boost::log::attributes::current_thread_id::held_type >(L"ThreadID") << L"] "\r
- << L"[" << boost::log::formatters::attr<severity_level>(boost::log::sources::aux::severity_attribute_name<wchar_t>::get()) << L"] "\r
- << boost::log::formatters::message<wchar_t>()\r
- );\r
+ \r
+ stream_sink->locked_backend()->set_formatter(&my_formatter);\r
\r
boost::log::wcore::get()->add_sink(stream_sink);\r
}\r
-\r
}\r
\r
void add_file_sink(const std::wstring& folder)\r
boost::log::keywords::auto_flush = true\r
);\r
\r
- file_sink->locked_backend()->set_formatter(\r
- boost::log::formatters::wstream\r
- //<< L"[" << boost::log::formatters::date_time<std::tm>(L"TimeStamp") << L"] "\r
- << L"[" << boost::log::formatters::attr<boost::log::attributes::current_thread_id::held_type >(L"ThreadID") << L"] "\r
- << L"[" << boost::log::formatters::attr<severity_level>(boost::log::sources::aux::severity_attribute_name<wchar_t>::get()) << L"] "\r
- << boost::log::formatters::message<wchar_t>()\r
- );\r
+ //file_sink->locked_backend()->set_formatter(\r
+ // boost::log::formatters::wstream\r
+ // //<< L"[" << boost::log::formatters::date_time(L"TimeStamp") << L"] "\r
+ // << L"[" << boost::log::formatters::attr<boost::log::attributes::current_thread_id::held_type >(L"ThreadID") << L"] "\r
+ // << L"[" << boost::log::formatters::attr<severity_level>(boost::log::sources::aux::severity_attribute_name<wchar_t>::get()) << L"] "\r
+ // << boost::log::formatters::message<wchar_t>()\r
+ //);\r
\r
file_sink->set_filter(boost::log::filters::attr<severity_level>(boost::log::sources::aux::severity_attribute_name<wchar_t>::get()) >= info);\r
\r
\r
void load(int index, const safe_ptr<frame_producer>& producer, bool preview)\r
{\r
- channel_.execution().invoke([&]{layers_[index].load(make_safe<destroy_producer_proxy>(channel_.destruction(), producer), preview);});\r
+ channel_.execution().invoke([&]\r
+ {\r
+ layers_[index].load(make_safe<destroy_producer_proxy>(channel_.destruction(), producer), preview);\r
+ });\r
}\r
\r
void pause(int index)\r
{ \r
- channel_.execution().invoke([&]{layers_[index].pause();});\r
+ channel_.execution().invoke([&]\r
+ {\r
+ layers_[index].pause();\r
+ });\r
}\r
\r
void play(int index)\r
{ \r
- channel_.execution().invoke([&]{layers_[index].play();});\r
+ channel_.execution().invoke([&]\r
+ {\r
+ layers_[index].play();\r
+ });\r
}\r
\r
void stop(int index)\r
{ \r
- channel_.execution().invoke([&]{layers_[index].stop();});\r
+ channel_.execution().invoke([&]\r
+ {\r
+ layers_[index].stop();\r
+ });\r
}\r
\r
void clear(int index)\r
{\r
- channel_.execution().invoke([&]{layers_.erase(index);});\r
+ channel_.execution().invoke([&]\r
+ {\r
+ layers_.erase(index);\r
+ });\r
}\r
\r
void clear()\r
{\r
- channel_.execution().invoke([&]{layers_.clear();});\r
+ channel_.execution().invoke([&]\r
+ {\r
+ layers_.clear();\r
+ });\r
} \r
\r
void swap_layer(int index, size_t other_index)\r
{\r
- channel_.execution().invoke([&]{layers_[index].swap(layers_[other_index]);});\r
+ channel_.execution().invoke([&]\r
+ {\r
+ layers_[index].swap(layers_[other_index]);\r
+ });\r
}\r
\r
void swap_layer(int index, size_t other_index, stage& other)\r