1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
/*
* SRT - Secure, Reliable, Transport
* Copyright (c) 2018 Haivision Systems Inc.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
*/
/*****************************************************************************
written by
Haivision Systems Inc.
*****************************************************************************/
#include "srt_compat.h"
#include "logging.h"
using namespace std;
namespace srt_logging
{
#if ENABLE_LOGGING
LogDispatcher::Proxy::Proxy(LogDispatcher& guy) : that(guy), that_enabled(that.CheckEnabled())
{
if (that_enabled)
{
i_file = "";
i_line = 0;
flags = that.src_config->flags;
// Create logger prefix
that.CreateLogLinePrefix(os);
}
}
LogDispatcher::Proxy LogDispatcher::operator()()
{
return Proxy(*this);
}
void LogDispatcher::CreateLogLinePrefix(std::ostringstream& serr)
{
using namespace std;
using namespace srt;
SRT_STATIC_ASSERT(ThreadName::BUFSIZE >= sizeof("hh:mm:ss.") * 2, // multiply 2 for some margin
"ThreadName::BUFSIZE is too small to be used for strftime");
char tmp_buf[ThreadName::BUFSIZE];
if ( !isset(SRT_LOGF_DISABLE_TIME) )
{
// Not necessary if sending through the queue.
timeval tv;
gettimeofday(&tv, NULL);
struct tm tm = SysLocalTime((time_t) tv.tv_sec);
if (strftime(tmp_buf, sizeof(tmp_buf), "%X.", &tm))
{
serr << tmp_buf << setw(6) << setfill('0') << tv.tv_usec;
}
}
string out_prefix;
if ( !isset(SRT_LOGF_DISABLE_SEVERITY) )
{
out_prefix = prefix;
}
// Note: ThreadName::get needs a buffer of size min. ThreadName::BUFSIZE
if ( !isset(SRT_LOGF_DISABLE_THREADNAME) && ThreadName::get(tmp_buf) )
{
serr << "/" << tmp_buf << out_prefix << ": ";
}
else
{
serr << out_prefix << ": ";
}
}
std::string LogDispatcher::Proxy::ExtractName(std::string pretty_function)
{
if ( pretty_function == "" )
return "";
size_t pos = pretty_function.find('(');
if ( pos == std::string::npos )
return pretty_function; // return unchanged.
pretty_function = pretty_function.substr(0, pos);
// There are also template instantiations where the instantiating
// parameters are encrypted inside. Therefore, search for the first
// open < and if found, search for symmetric >.
int depth = 1;
pos = pretty_function.find('<');
if ( pos != std::string::npos )
{
size_t end = pos+1;
for(;;)
{
++pos;
if ( pos == pretty_function.size() )
{
--pos;
break;
}
if ( pretty_function[pos] == '<' )
{
++depth;
continue;
}
if ( pretty_function[pos] == '>' )
{
--depth;
if ( depth <= 0 )
break;
continue;
}
}
std::string afterpart = pretty_function.substr(pos+1);
pretty_function = pretty_function.substr(0, end) + ">" + afterpart;
}
// Now see how many :: can be found in the name.
// If this occurs more than once, take the last two.
pos = pretty_function.rfind("::");
if ( pos == std::string::npos || pos < 2 )
return pretty_function; // return whatever this is. No scope name.
// Find the next occurrence of :: - if found, copy up to it. If not,
// return whatever is found.
pos -= 2;
pos = pretty_function.rfind("::", pos);
if ( pos == std::string::npos )
return pretty_function; // nothing to cut
return pretty_function.substr(pos+2);
}
#endif
} // (end namespace srt_logging)
|