Skip to content

Commit

Permalink
logging
Browse files Browse the repository at this point in the history
  • Loading branch information
Lawliet828 committed Apr 7, 2024
1 parent 904ff7b commit 3e16e43
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 169 deletions.
3 changes: 0 additions & 3 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,3 @@ mkdir -p $BUILD_DIR/$BUILD_TYPE-cpp17 \
# Use the following command to run all the unit tests
# at the dir $BUILD_DIR/$BUILD_TYPE :
# CTEST_OUTPUT_ON_FAILURE=TRUE make test

# cd $SOURCE_DIR && doxygen

156 changes: 49 additions & 107 deletions muduo/base/Logging.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,47 +5,27 @@

#include "muduo/base/Logging.h"

#include "muduo/base/CurrentThread.h"
#include "muduo/base/Timestamp.h"
#include "muduo/base/TimeZone.h"

#include <errno.h>
#include <stdio.h>
#include <string.h>

#include <sstream>

namespace muduo
{
#include "muduo/base/CurrentThread.h"
#include "muduo/base/TimeZone.h"
#include "muduo/base/Timestamp.h"

/*
class LoggerImpl
{
public:
typedef Logger::LogLevel LogLevel;
LoggerImpl(LogLevel level, int old_errno, const char* file, int line);
void finish();
Timestamp time_;
LogStream stream_;
LogLevel level_;
int line_;
const char* fullname_;
const char* basename_;
};
*/
namespace muduo {

__thread char t_errnobuf[512];
__thread char t_time[64];
__thread time_t t_lastSecond;

const char* strerror_tl(int savedErrno)
{
const char* strerror_tl(int savedErrno) {
return strerror_r(savedErrno, t_errnobuf, sizeof t_errnobuf);
}

Logger::LogLevel initLogLevel()
{
Logger::LogLevel initLogLevel() {
if (::getenv("MUDUO_LOG_TRACE"))
return Logger::TRACE;
else if (::getenv("MUDUO_LOG_DEBUG"))
Expand All @@ -67,43 +47,33 @@ const char* LogLevelName[Logger::NUM_LOG_LEVELS] =
};

// helper class for known string length at compile time
class T
{
class T {
public:
T(const char* str, unsigned len)
:str_(str),
len_(len)
{
T(const char* str, unsigned len) : str_(str), len_(len) {
assert(strlen(str) == len_);
}

const char* str_;
const unsigned len_;
};

inline LogStream& operator<<(LogStream& s, T v)
{
inline LogStream& operator<<(LogStream& s, T v) {
s.append(v.str_, v.len_);
return s;
}

inline LogStream& operator<<(LogStream& s, const Logger::SourceFile& v)
{
inline LogStream& operator<<(LogStream& s, const Logger::SourceFile& v) {
s.append(v.data_, v.size_);
return s;
}

void defaultOutput(const char* msg, int len)
{
void defaultOutput(const char* msg, int len) {
size_t n = fwrite(msg, 1, len, stdout);
//FIXME check n
// FIXME check n
(void)n;
}

void defaultFlush()
{
fflush(stdout);
}
void defaultFlush() { fflush(stdout); }

Logger::OutputFunc g_output = defaultOutput;
Logger::FlushFunc g_flush = defaultFlush;
Expand All @@ -113,115 +83,87 @@ TimeZone g_logTimeZone;

using namespace muduo;

Logger::Impl::Impl(LogLevel level, int savedErrno, const SourceFile& file, int line)
: time_(Timestamp::now()),
stream_(),
level_(level),
line_(line),
basename_(file)
{
Logger::Impl::Impl(LogLevel level, int savedErrno, const SourceFile& file,
int line)
: time_(Timestamp::now()),
stream_(),
level_(level),
line_(line),
basename_(file) {
formatTime();
CurrentThread::tid();
stream_ << T(CurrentThread::tidString(), CurrentThread::tidStringLength());
stream_ << T(LogLevelName[level], 6);
if (savedErrno != 0)
{
if (savedErrno != 0) {
stream_ << strerror_tl(savedErrno) << " (errno=" << savedErrno << ") ";
}
}

void Logger::Impl::formatTime()
{
void Logger::Impl::formatTime() {
int64_t microSecondsSinceEpoch = time_.microSecondsSinceEpoch();
time_t seconds = static_cast<time_t>(microSecondsSinceEpoch / Timestamp::kMicroSecondsPerSecond);
int microseconds = static_cast<int>(microSecondsSinceEpoch % Timestamp::kMicroSecondsPerSecond);
if (seconds != t_lastSecond)
{
time_t seconds = static_cast<time_t>(microSecondsSinceEpoch /
Timestamp::kMicroSecondsPerSecond);
int microseconds = static_cast<int>(microSecondsSinceEpoch %
Timestamp::kMicroSecondsPerSecond);
if (seconds != t_lastSecond) {
t_lastSecond = seconds;
struct tm tm_time;
if (g_logTimeZone.valid())
{
if (g_logTimeZone.valid()) {
tm_time = g_logTimeZone.toLocalTime(seconds);
}
else
{
::gmtime_r(&seconds, &tm_time); // FIXME TimeZone::fromUtcTime
} else {
::gmtime_r(&seconds, &tm_time); // FIXME TimeZone::fromUtcTime
}

int len = snprintf(t_time, sizeof(t_time), "%4d%02d%02d %02d:%02d:%02d",
tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday,
tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec);
assert(len == 17); (void)len;
int len =
snprintf(t_time, sizeof(t_time), "%4d%02d%02d %02d:%02d:%02d",
tm_time.tm_year + 1900, tm_time.tm_mon + 1, tm_time.tm_mday,
tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec);
assert(len == 17);
(void)len;
}

if (g_logTimeZone.valid())
{
if (g_logTimeZone.valid()) {
Fmt us(".%06d ", microseconds);
assert(us.length() == 8);
stream_ << T(t_time, 17) << T(us.data(), 8);
}
else
{
} else {
Fmt us(".%06dZ ", microseconds);
assert(us.length() == 9);
stream_ << T(t_time, 17) << T(us.data(), 9);
}
}

void Logger::Impl::finish()
{
void Logger::Impl::finish() {
stream_ << " - " << basename_ << ':' << line_ << '\n';
}

Logger::Logger(SourceFile file, int line)
: impl_(INFO, 0, file, line)
{
}
Logger::Logger(SourceFile file, int line) : impl_(INFO, 0, file, line) {}

Logger::Logger(SourceFile file, int line, LogLevel level, const char* func)
: impl_(level, 0, file, line)
{
: impl_(level, 0, file, line) {
impl_.stream_ << func << ' ';
}

Logger::Logger(SourceFile file, int line, LogLevel level)
: impl_(level, 0, file, line)
{
}
: impl_(level, 0, file, line) {}

Logger::Logger(SourceFile file, int line, bool toAbort)
: impl_(toAbort?FATAL:ERROR, errno, file, line)
{
}
: impl_(toAbort ? FATAL : ERROR, errno, file, line) {}

Logger::~Logger()
{
Logger::~Logger() {
impl_.finish();
const LogStream::Buffer& buf(stream().buffer());
g_output(buf.data(), buf.length());
if (impl_.level_ == FATAL)
{
if (impl_.level_ == FATAL) {
g_flush();
abort();
}
}

void Logger::setLogLevel(Logger::LogLevel level)
{
g_logLevel = level;
}
void Logger::setLogLevel(Logger::LogLevel level) { g_logLevel = level; }

void Logger::setOutput(OutputFunc out)
{
g_output = out;
}
void Logger::setOutput(OutputFunc out) { g_output = out; }

void Logger::setFlush(FlushFunc flush)
{
g_flush = flush;
}
void Logger::setFlush(FlushFunc flush) { g_flush = flush; }

void Logger::setTimeZone(const TimeZone& tz)
{
g_logTimeZone = tz;
}
void Logger::setTimeZone(const TimeZone& tz) { g_logTimeZone = tz; }
Loading

0 comments on commit 3e16e43

Please sign in to comment.