]> git.sesse.net Git - casparcg/blob - common/log/log.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / common / log / log.cpp
1 #include "../stdafx.h"\r
2 \r
3 #if defined(_MSC_VER)\r
4 #pragma warning (disable : 4100) // 'identifier' : unreferenced formal parameter\r
5 #pragma warning (disable : 4512) // 'class' : assignment operator could not be generated\r
6 #endif\r
7 \r
8 #include "log.h"\r
9 \r
10 #include "../exception/exceptions.h"\r
11 \r
12 #include <ios>\r
13 #include <string>\r
14 #include <ostream>\r
15 \r
16 #include <boost/shared_ptr.hpp>\r
17 #include <boost/make_shared.hpp>\r
18 #include <boost/filesystem/convenience.hpp>\r
19 #include <boost/date_time/posix_time/posix_time.hpp>\r
20 \r
21 #include <boost/log/core/core.hpp>\r
22 \r
23 #include <boost/log/formatters/stream.hpp>\r
24 #include <boost/log/formatters/attr.hpp>\r
25 #include <boost/log/formatters/date_time.hpp>\r
26 #include <boost/log/formatters/message.hpp>\r
27 \r
28 #include <boost/log/filters/attr.hpp>\r
29 \r
30 #include <boost/log/sinks/text_file_backend.hpp>\r
31 \r
32 #include <boost/log/detail/universal_path.hpp>\r
33 \r
34 #include <boost/log/sinks/text_file_backend.hpp>\r
35 #include <boost/log/sinks/text_ostream_backend.hpp>\r
36 #include <boost/log/sinks/sync_frontend.hpp>\r
37 #include <boost/log/sinks/async_frontend.hpp>\r
38 \r
39 #include <boost/log/utility/init/common_attributes.hpp>\r
40 #include <boost/log/utility/empty_deleter.hpp>\r
41 \r
42 \r
43 namespace caspar{ namespace log{\r
44 \r
45 using namespace boost;\r
46 \r
47 namespace internal{\r
48 \r
49 void init()\r
50 {       \r
51         boost::log::add_common_attributes<wchar_t>();\r
52         typedef boost::log::aux::add_common_attributes_constants<wchar_t> traits_t;\r
53 \r
54         typedef boost::log::sinks::synchronous_sink<boost::log::sinks::wtext_file_backend> file_sink_type;\r
55 \r
56         typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::wtext_ostream_backend> stream_sink_type;\r
57 \r
58         auto stream_backend = boost::make_shared<boost::log::sinks::wtext_ostream_backend>();\r
59         stream_backend->add_stream(boost::shared_ptr<std::wostream>(&std::wcout, boost::log::empty_deleter()));\r
60         stream_backend->auto_flush(true);\r
61 \r
62         auto stream_sink = boost::make_shared<stream_sink_type>(stream_backend);\r
63 \r
64         stream_sink->locked_backend()->set_formatter(\r
65                 boost::log::formatters::wstream\r
66                         << L"[" << boost::log::formatters::attr<boost::log::attributes::current_thread_id::held_type >(traits_t::thread_id_attr_name())\r
67                         << L"] [" << boost::log::formatters::attr<severity_level >(boost::log::sources::aux::severity_attribute_name<wchar_t>::get())\r
68                         << L"] " << boost::log::formatters::message<wchar_t>()\r
69         );\r
70 \r
71         boost::log::wcore::get()->add_sink(stream_sink);\r
72 }\r
73 \r
74 }\r
75 \r
76 void add_file_sink(const std::wstring& folder)\r
77 {       \r
78         boost::log::add_common_attributes<wchar_t>();\r
79         typedef boost::log::aux::add_common_attributes_constants<wchar_t> traits_t;\r
80 \r
81         typedef boost::log::sinks::synchronous_sink<boost::log::sinks::wtext_file_backend> file_sink_type;\r
82 \r
83         try\r
84         {\r
85                 if(!boost::filesystem::is_directory(folder))\r
86                         BOOST_THROW_EXCEPTION(directory_not_found());\r
87 \r
88                 auto file_sink = boost::make_shared<file_sink_type>(\r
89                         boost::log::keywords::file_name = (folder + L"caspar_%Y-%m-%d_%H-%M-%S.%N.log"),\r
90                         boost::log::keywords::time_based_rotation = boost::log::sinks::file::rotation_at_time_point(0, 0, 0),\r
91                         boost::log::keywords::auto_flush = true\r
92                 );\r
93 \r
94                 file_sink->locked_backend()->set_formatter(\r
95                         boost::log::formatters::wstream\r
96                                 << boost::log::formatters::attr<unsigned int>(traits_t::line_id_attr_name())\r
97                                 << L" [" << boost::log::formatters::date_time< posix_time::ptime >(traits_t::time_stamp_attr_name())\r
98                                 << L"] [" << boost::log::formatters::attr<boost::log::attributes::current_thread_id::held_type >(traits_t::thread_id_attr_name())\r
99                                 << L"] [" << boost::log::formatters::attr<severity_level>(boost::log::sources::aux::severity_attribute_name<wchar_t>::get())\r
100                                 << L"] " << boost::log::formatters::message<wchar_t>()\r
101                 );\r
102 \r
103                 file_sink->set_filter(boost::log::filters::attr<severity_level>(boost::log::sources::aux::severity_attribute_name<wchar_t>::get()) >= info);\r
104 \r
105                 std::wcout << L"Logging [info] or higher severity to " << folder << std::endl << std::endl;\r
106 \r
107                 boost::log::wcore::get()->add_sink(file_sink);\r
108         }\r
109         catch(...)\r
110         {\r
111                 std::wcerr << L"Failed to Setup File Logging Sink" << std::endl << std::endl;\r
112         }\r
113 }\r
114 \r
115 }}