\brief IOStreamTarget non-inline non-template implementation */
#include "IOStreamTarget.hh"
-#include "IOStreamTarget.ih"
+//#include "IOStreamTarget.ih"
// Custom includes
-#include <errno.h>
#include <locale>
#include <sstream>
#include <boost/algorithm/string/trim.hpp>
#include <boost/tokenizer.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include "../Scheduler/ClockService.hh"
//#include "IOStreamTarget.mpp"
#define prefix_
///////////////////////////////////////////////////////////////////////////
// senf::log::IOStreamTarget
-prefix_ senf::log::IOStreamTarget::IOStreamTarget(std::ostream & os)
- : stream_ (os), tag_ (detail::getDefaultTag()), noformat_ (false), showTime_ (true),
- showStream_ (false), showLevel_ (true), showArea_ (true), timeBase_ (-1)
-{
- std::locale const & loc (datestream_.getloc());
- datestream_.imbue( std::locale(
- loc, new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S.%f-0000")) );
-
-}
-
-prefix_ void senf::log::IOStreamTarget::timeFormat(std::string const & format)
-{
- if (format.empty()) {
- noformat_ = true;
- timeBase_ = -1;
- } else {
- noformat_ = false;
- std::locale const & loc (datestream_.getloc());
- datestream_.imbue( std::locale(
- loc, new boost::posix_time::time_facet(format.c_str())) );
- }
-}
-
-////////////////////////////////////////
-// private members
-
prefix_ void senf::log::IOStreamTarget::v_write(time_type timestamp,
std::string const & stream,
std::string const & area, unsigned level,
boost::trim_right(m);
detail::quoteNonPrintable(m);
- if (tag_.empty() && !showTime_ && !showStream_ && !showLevel_ && !showArea_)
+ if (isPlainFormat())
stream_ << m << std::endl;
else {
+ std::string const & prf (prefix(timestamp, stream, area, level));
+
typedef boost::char_separator<char> Separator;
typedef boost::tokenizer<Separator> Tokenizer;
Separator separator ("\n");
Tokenizer::iterator i (tokenizer.begin());
Tokenizer::iterator const i_end (tokenizer.end());
- if (showTime_) {
- if (noformat_) {
- if (timeBase_ == -1) timeBase_ = timestamp;
- time_type delta (timestamp - timeBase_);
- datestream_ << std::setfill('0') << std::setw(10)
- << (delta / 1000000000ll) << '.'
- << std::setfill('0') << std::setw(9)
- << (delta % 1000000000ll);
- }
- else
- datestream_ << senf::ClockService::abstime(timestamp);
- datestream_ << ' ';
- }
- if (!tag_.empty())
- datestream_ << tag_ << ": ";
- if (showStream_)
- datestream_ << '[' << stream << "] ";
- if (showLevel_)
- datestream_ << '[' << LEVELNAMES[level] << "] ";
- if (showArea_ && area != "senf::log::DefaultArea")
- datestream_ << '[' << area << "] ";
-
for (; i != i_end; ++i)
- stream_ << datestream_.str() << *i << "\n";
+ stream_ << prf << *i << "\n";
stream_ << std::flush;
- datestream_.str("");
}
}
-///////////////////////////////////////////////////////////////////////////
-
-prefix_ void senf::log::detail::quoteNonPrintable(std::string & s)
-{
- for (std::string::iterator i (s.begin()); i != s.end(); ++i)
- if (*i < ' ' && *i != '\n')
- *i = ' ';
-}
-
-prefix_ std::string senf::log::detail::getDefaultTag()
-{
- std::stringstream ss;
- ss << ::program_invocation_short_name << '[' << ::getpid() << ']';
- return ss.str();
-}
-
///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_
//#include "IOStreamTarget.mpp"
/** \file
\brief IOStreamTarget inline non-template implementation */
-#include "IOStreamTarget.ih"
+//#include "IOStreamTarget.ih"
// Custom includes
#define prefix_ inline
///////////////////////////////cci.p///////////////////////////////////////
-prefix_ void senf::log::IOStreamTarget::showTime(bool flag)
-{
- showTime_ = flag;
-}
-
-prefix_ void senf::log::IOStreamTarget::showStream(bool flag)
-{
- showStream_ = flag;
-}
-
-prefix_ void senf::log::IOStreamTarget::showLevel(bool flag)
-{
- showLevel_ = flag;
-}
-
-prefix_ void senf::log::IOStreamTarget::showArea(bool flag)
-{
- showArea_ = flag;
-}
-
-prefix_ void senf::log::IOStreamTarget::tag(std::string const & tag)
-{
- tag_ = tag;
-}
+prefix_ senf::log::IOStreamTarget::IOStreamTarget(std::ostream & os)
+ : stream_ (os)
+{}
///////////////////////////////cci.e///////////////////////////////////////
#undef prefix_
#include <boost/utility.hpp>
#include <boost/scoped_ptr.hpp>
#include "Target.hh"
+#include "LogFormat.hh"
//#include "IOStreamTarget.mpp"
///////////////////////////////hh.p////////////////////////////////////////
\ingroup targets
*/
class IOStreamTarget
- : public Target
+ : public Target, private detail::LogFormat
{
public:
///////////////////////////////////////////////////////////////////////////
///@}
///////////////////////////////////////////////////////////////////////////
- void showTime(bool flag = true); ///< Enable or disable output of time field
- void showStream(bool flag = true); ///< Enable or disable output of stream field
- void showLevel(bool flag = true); ///< Enable or disable output of log level
- void showArea(bool flag = true); ///< Enable or disable output of log area
-
- void timeFormat(std::string const & format);
- ///< Set time format
- /**< The date formatting is set using the Boost.DateTime
- date_facet, e.g.
- \code
- target.timeFormat("%Y%m%d %H:%M:%S");
- \endcode
- If the \c timeFormat is set to the empty string, the
- time is written out as unformatted ClockService value.
-
- By default, the date-time will be written in extended
- ISO format.
- \param[in] format Date/Time format string */
-
- void tag(std::string const & tag);
+ using detail::LogFormat::showTime;
+ using detail::LogFormat::showStream;
+ using detail::LogFormat::showLevel;
+ using detail::LogFormat::showArea;
+ using detail::LogFormat::timeFormat;
+ using detail::LogFormat::tag;
protected:
void v_write(time_type timestamp, std::string const & stream,
private:
std::ostream & stream_;
- std::string tag_;
- std::stringstream datestream_;
- bool noformat_;
- bool showTime_;
- bool showStream_;
- bool showLevel_;
- bool showArea_;
-
- time_type timeBase_;
};
}}
--- /dev/null
+// $Id$
+//
+// Copyright (C) 2009
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+/** \file
+ \brief LogFormat non-inline non-template implementation */
+
+#include "LogFormat.hh"
+//#include "LogFormat.ih"
+
+// Custom includes
+#include <errno.h>
+#include <unistd.h>
+#include <locale>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include "../Scheduler/ClockService.hh"
+
+//#include "LogFormat.mpp"
+#define prefix_
+///////////////////////////////cc.p////////////////////////////////////////
+
+prefix_ senf::log::detail::LogFormat::LogFormat()
+ : tag_ (detail::getDefaultTag()), noformat_ (false), showTime_ (true),
+ showStream_ (false), showLevel_ (true), showArea_ (true), timeBase_ (-1)
+{
+ std::locale const & loc (datestream_.getloc());
+ datestream_.imbue( std::locale(
+ loc, new boost::posix_time::time_facet("%Y-%m-%d %H:%M:%S.%f-0000")) );
+}
+
+prefix_ void senf::log::detail::LogFormat::timeFormat(std::string const & format)
+{
+ if (format.empty()) {
+ noformat_ = true;
+ timeBase_ = -1;
+ } else {
+ noformat_ = false;
+ std::locale const & loc (datestream_.getloc());
+ datestream_.imbue( std::locale(
+ loc, new boost::posix_time::time_facet(format.c_str())) );
+ }
+}
+
+prefix_ std::string senf::log::detail::LogFormat::prefix(time_type timestamp,
+ std::string const & stream,
+ std::string const & area,
+ unsigned level)
+{
+ datestream_.str("");
+
+ if (showTime_) {
+ if (noformat_) {
+ if (timeBase_ == -1) timeBase_ = timestamp;
+ time_type delta (timestamp - timeBase_);
+ datestream_ << std::setfill('0') << std::setw(10)
+ << (delta / 1000000000ll) << '.'
+ << std::setfill('0') << std::setw(9)
+ << (delta % 1000000000ll);
+ }
+ else
+ datestream_ << senf::ClockService::abstime(timestamp);
+ datestream_ << ' ';
+ }
+ if (!tag_.empty())
+ datestream_ << tag_ << ": ";
+ if (showStream_)
+ datestream_ << '[' << stream << "] ";
+ if (showLevel_)
+ datestream_ << '[' << LEVELNAMES[level] << "] ";
+ if (showArea_ && area != "senf::log::DefaultArea")
+ datestream_ << '[' << area << "] ";
+
+ return datestream_.str();
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+prefix_ void senf::log::detail::quoteNonPrintable(std::string & s)
+{
+ for (std::string::iterator i (s.begin()); i != s.end(); ++i)
+ if (*i < ' ' && *i != '\n')
+ *i = '?';
+}
+
+prefix_ std::string senf::log::detail::getDefaultTag()
+{
+ std::stringstream ss;
+ ss << ::program_invocation_short_name << '[' << ::getpid() << ']';
+ return ss.str();
+}
+
+///////////////////////////////cc.e////////////////////////////////////////
+#undef prefix_
+//#include "LogFormat.mpp"
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
// $Id$
//
-// Copyright (C) 2008
+// Copyright (C) 2009
// Fraunhofer Institute for Open Communication Systems (FOKUS)
// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/** \file
- \brief IOStreamTarget internal header */
+ \brief LogFormat inline non-template implementation */
-#ifndef IH_SENF_Utils_Logger_IOStreamTarget_
-#define IH_SENF_Utils_Logger_IOStreamTarget_ 1
+//#include "LogFormat.ih"
// Custom includes
-///////////////////////////////ih.p////////////////////////////////////////
+#define prefix_ inline
+///////////////////////////////cci.p///////////////////////////////////////
-namespace senf {
-namespace log {
-namespace detail {
+prefix_ void senf::log::detail::LogFormat::showTime(bool flag)
+{
+ showTime_ = flag;
+}
- void quoteNonPrintable(std::string & s);
- std::string getDefaultTag();
+prefix_ void senf::log::detail::LogFormat::showStream(bool flag)
+{
+ showStream_ = flag;
+}
-}}}
+prefix_ void senf::log::detail::LogFormat::showLevel(bool flag)
+{
+ showLevel_ = flag;
+}
-///////////////////////////////ih.e////////////////////////////////////////
-#endif
+prefix_ void senf::log::detail::LogFormat::showArea(bool flag)
+{
+ showArea_ = flag;
+}
+
+prefix_ void senf::log::detail::LogFormat::tag(std::string const & tag)
+{
+ tag_ = tag;
+}
+
+prefix_ bool senf::log::detail::LogFormat::isPlainFormat()
+ const
+{
+ return tag_.empty() && !showTime_ && !showStream_ && !showLevel_ && !showArea_;
+}
+
+///////////////////////////////cci.e///////////////////////////////////////
+#undef prefix_
\f
// Local Variables:
--- /dev/null
+// $Id$
+//
+// Copyright (C) 2009
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+// Stefan Bund <g0dil@berlios.de>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the
+// Free Software Foundation, Inc.,
+// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+/** \file
+ \brief LogFormat public header */
+
+#ifndef HH_SENF_Utils_Logger_LogFormat_
+#define HH_SENF_Utils_Logger_LogFormat_ 1
+
+// Custom includes
+#include <sstream>
+#include "Target.hh"
+
+//#include "LogFormat.mpp"
+///////////////////////////////hh.p////////////////////////////////////////
+
+namespace senf {
+namespace log {
+namespace detail {
+
+ class LogFormat
+ {
+ public:
+ LogFormat();
+
+ void showTime(bool flag = true); ///< Enable or disable output of time field
+ void showStream(bool flag = true); ///< Enable or disable output of stream field
+ void showLevel(bool flag = true); ///< Enable or disable output of log level
+ void showArea(bool flag = true); ///< Enable or disable output of log area
+
+ void timeFormat(std::string const & format);
+ ///< Set time format
+ /**< The date formatting is set using the Boost.DateTime
+ date_facet, e.g.
+ \code
+ target.timeFormat("%Y%m%d %H:%M:%S");
+ \endcode
+ If the \c timeFormat is set to the empty string, the
+ time is written out as unformatted ClockService value.
+
+ By default, the date-time will be written in extended
+ ISO format.
+ \param[in] format Date/Time format string */
+
+ void tag(std::string const & tag); ///< Set tag (log line prefix)
+
+ protected:
+ std::string prefix(time_type timestamp, std::string const & stream,
+ std::string const & area, unsigned level);
+ bool isPlainFormat() const;
+
+ private:
+ std::string tag_;
+ std::stringstream datestream_;
+ bool noformat_;
+ bool showTime_;
+ bool showStream_;
+ bool showLevel_;
+ bool showArea_;
+ time_type timeBase_;
+ };
+
+ void quoteNonPrintable(std::string & s);
+ std::string getDefaultTag();
+
+}}}
+
+///////////////////////////////hh.e////////////////////////////////////////
+#include "LogFormat.cci"
+//#include "LogFormat.ct"
+//#include "LogFormat.cti"
+#endif
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// comment-column: 40
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// End:
#include <sstream>
#include <boost/algorithm/string/trim.hpp>
#include <boost/tokenizer.hpp>
-#include "../../Socket/Protocols/INet/ConnectedUDPSocketHandle.hh"
-#include "IOStreamTarget.hh"
//#include "SyslogUDPTarget.mpp"
#define prefix_
///////////////////////////////cc.p////////////////////////////////////////
-prefix_ senf::log::SyslogUDPTarget::SyslogUDPTarget(senf::INet4Address const & target,
- int facility)
- : facility_ (facility), tag_ (detail::getDefaultTag()),
- handle_ ( senf::ConnectedUDPv4ClientSocketHandle(senf::INet4SocketAddress(target, 514u)) ),
- showStream_ (false), showLevel_ (false), showArea_ (true)
-{}
-
-prefix_ senf::log::SyslogUDPTarget::SyslogUDPTarget(senf::INet4SocketAddress const & target,
- int facility)
- : facility_ (facility), tag_ (detail::getDefaultTag()),
- handle_ ( senf::ConnectedUDPv4ClientSocketHandle(target) ),
- showStream_ (false), showLevel_ (false), showArea_ (true)
-{}
-
-prefix_ senf::log::SyslogUDPTarget::SyslogUDPTarget(senf::INet6Address const & target,
- int facility)
- : facility_ (facility), tag_ (detail::getDefaultTag()),
- handle_ ( senf::ConnectedUDPv6ClientSocketHandle(senf::INet6SocketAddress(target, 514u)) ),
- showStream_ (false), showLevel_ (false), showArea_ (true)
-{}
-
-prefix_ senf::log::SyslogUDPTarget::SyslogUDPTarget(senf::INet6SocketAddress const & target,
- int facility)
- : facility_ (facility), tag_ (detail::getDefaultTag()),
- handle_ ( senf::ConnectedUDPv6ClientSocketHandle(target) ),
- showStream_ (false), showLevel_ (false), showArea_ (true)
-{}
-
prefix_ void senf::log::SyslogUDPTarget::v_write(time_type timestamp, std::string const & stream,
std::string const & area, unsigned level,
std::string const & message)
{
- std::stringstream prefix;
-
- prefix << '<' << (facility_ | senf::log::SyslogTarget::LEVELMAP[level]) << "> ";
- if (!tag_.empty())
- prefix << tag_ << ": ";
- if (showStream_)
- prefix << '[' << stream << "] ";
- if (showLevel_)
- prefix << '[' << LEVELNAMES[level] << "] ";
- if (showArea_ && area != "senf::log::DefaultArea")
- prefix << '[' << area << "] ";
std::string m (message);
boost::trim_right(m);
detail::quoteNonPrintable(m);
+ std::stringstream prfstream;
+ prfstream << '<' << (facility_ | senf::log::SyslogTarget::LEVELMAP[level]) << "> "
+ << prefix(timestamp, stream, area, level);
+ std::string const & prf (prfstream.str());
+
typedef boost::char_separator<char> Separator;
typedef boost::tokenizer<Separator> Tokenizer;
Separator separator ("\n");
Tokenizer::iterator const i_end (tokenizer.end());
std::string line;
- unsigned sz (896-prefix.str().size());
+ unsigned sz (896-prf.size());
for (; i != i_end; ++i)
for (unsigned j (0); j < i->size(); j += sz) {
- line = prefix.str();
+ line = prf;
line += std::string(*i, j, sz);
handle_.write(line);
}
//#include "SyslogUDPTarget.ih"
// Custom includes
+#include "../../Socket/Protocols/INet/ConnectedUDPSocketHandle.hh"
#define prefix_ inline
///////////////////////////////cci.p///////////////////////////////////////
-prefix_ void senf::log::SyslogUDPTarget::showStream(bool flag)
-{
- showStream_ = flag;
-}
+prefix_ senf::log::SyslogUDPTarget::SyslogUDPTarget(senf::INet4Address const & target,
+ int facility)
+ : facility_ (facility),
+ handle_ ( senf::ConnectedUDPv4ClientSocketHandle(senf::INet4SocketAddress(target, 514u)) )
+{}
-prefix_ void senf::log::SyslogUDPTarget::showLevel(bool flag)
-{
- showLevel_ = flag;
-}
+prefix_ senf::log::SyslogUDPTarget::SyslogUDPTarget(senf::INet4SocketAddress const & target,
+ int facility)
+ : facility_ (facility),
+ handle_ ( senf::ConnectedUDPv4ClientSocketHandle(target) )
+{}
-prefix_ void senf::log::SyslogUDPTarget::showArea(bool flag)
-{
- showArea_ = flag;
-}
+prefix_ senf::log::SyslogUDPTarget::SyslogUDPTarget(senf::INet6Address const & target,
+ int facility)
+ : facility_ (facility),
+ handle_ ( senf::ConnectedUDPv6ClientSocketHandle(senf::INet6SocketAddress(target, 514u)) )
+{}
-prefix_ void senf::log::SyslogUDPTarget::tag(std::string const & tag)
-{
- tag_ = tag;
-}
+prefix_ senf::log::SyslogUDPTarget::SyslogUDPTarget(senf::INet6SocketAddress const & target,
+ int facility)
+ : facility_ (facility),
+ handle_ ( senf::ConnectedUDPv6ClientSocketHandle(target) )
+{}
///////////////////////////////cci.e///////////////////////////////////////
#undef prefix_
// Custom includes
#include "SyslogTarget.hh"
+#include "LogFormat.hh"
#include "../../Socket/Protocols/INet/INetAddressing.hh"
#include "../../Socket/ClientSocketHandle.hh"
#include "../../Socket/FramingPolicy.hh"
daemon to skip the \c HEADER part.
*/
class SyslogUDPTarget
- : public Target
+ : public Target, private detail::LogFormat
{
public:
///////////////////////////////////////////////////////////////////////////
///@}
///////////////////////////////////////////////////////////////////////////
- void showStream(bool flag = true);
- void showLevel(bool flag = true);
- void showArea(bool flag = true);
-
- void tag(std::string const & tag);
+ using detail::LogFormat::showTime;
+ using detail::LogFormat::showStream;
+ using detail::LogFormat::showLevel;
+ using detail::LogFormat::showArea;
+ using detail::LogFormat::timeFormat;
+ using detail::LogFormat::tag;
private:
void v_write(time_type timestamp, std::string const & stream,
std::string const & message);
int facility_;
- std::string tag_;
typedef senf::ClientSocketHandle< senf::MakeSocketPolicy<
senf::DatagramFramingPolicy,
senf::ConnectedCommunicationPolicy,
senf::WriteablePolicy>::policy > Handle;
Handle handle_;
- bool showStream_;
- bool showLevel_;
- bool showArea_;
};
}}
senf::INet4SocketAddress(senf::INet4Address::Loopback, 23444u));
udplog.tag("");
+ udplog.showTime(false);
+ udplog.showLevel(false);
udplog.route();
SENF_LOG(("Test message"));
BOOST_CHECK_EQUAL( server.read(), "<13> Test message" );
BOOST_CHECK_EQUAL( server.read(), "<13> Line 2" );
+ udplog.timeFormat("");
+ udplog.showTime();
SENF_LOG(("Very long message: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
- BOOST_CHECK_EQUAL( server.read(), "<13> Very long message: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" );
- BOOST_CHECK_EQUAL( server.read(), "<13> xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" );
+ BOOST_CHECK_EQUAL( server.read(), "<13> 0000000000.000000000 Very long message: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" );
+ BOOST_CHECK_EQUAL( server.read(), "<13> 0000000000.000000000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" );
}
///////////////////////////////cc.e////////////////////////////////////////