src/utils/logging.cc (116 lines of code) (raw):

/************************************************************ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "singa/utils/logging.h" #include <stdlib.h> #include <sys/types.h> #ifdef _MSC_VER #include <io.h> #else #include <unistd.h> #endif namespace singa { FILE* log_file[NUM_SEVERITIES] = {}; bool not_log_stderr[NUM_SEVERITIES] = {}; void InitLogging(const char* argv) { #ifdef USE_GLOG google::InitGoogleLogging(argv); #else LogToStderr(); #endif } void LogToStderr() { #ifdef USE_GLOG google::LogToStderr(); #else for (int i = 0; i < NUM_SEVERITIES; ++i) { log_file[i] = nullptr; not_log_stderr[i] = false; } #endif } void SetStderrLogging(int severity) { #ifdef USE_GLOG google::SetStderrLogging(severity); #else for (int i = 0; i < NUM_SEVERITIES; ++i) { not_log_stderr[i] = i >= severity ? false : true; } #endif } void SetLogDestination(int severity, const char* path) { #ifdef USE_GLOG google::SetLogDestination(severity, path); #else log_file[severity] = fopen(path, "a"); if (severity < ERROR) not_log_stderr[severity] = true; #endif } #ifndef USE_GLOG namespace logging { LogMessage::LogMessage(const char* fname, int line, int severity) : fname_(fname), line_(line), severity_(severity) {} inline pid_t GetPID() { return getpid(); } inline pid_t GetTID() { return (pid_t)(uintptr_t)pthread_self(); } void LogMessage::GenerateLogMessage() { time_t rw_time = time(nullptr); struct tm tm_time; localtime_r(&rw_time, &tm_time); // log to a file for (int i = severity_; i >= 0; --i) if (log_file[i]) DoLogging(log_file[i], tm_time); // log to stderr if (!not_log_stderr[severity_]) DoLogging(stderr, tm_time); } void LogMessage::DoLogging(FILE* file, const struct tm& tm_time) { fprintf(file, "[%c d%02d%02d t%02d:%02d:%02d p%05d:%03d %s:%d] %s\n", "IWEF"[severity_], 1 + tm_time.tm_mon, tm_time.tm_mday, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, GetPID(), static_cast<unsigned>(GetTID() % 1000), fname_, line_, str().c_str()); } LogMessage::~LogMessage() { GenerateLogMessage(); } LogMessageFatal::LogMessageFatal(const char* file, int line) : LogMessage(file, line, FATAL) {} LogMessageFatal::~LogMessageFatal() { // abort() ensures we don't return GenerateLogMessage(); abort(); } template <> void MakeCheckOpValueString(std::ostream* os, const char& v) { if (v >= 32 && v <= 126) { (*os) << "'" << v << "'"; } else { (*os) << "char value " << (short)v; } } template <> void MakeCheckOpValueString(std::ostream* os, const signed char& v) { if (v >= 32 && v <= 126) { (*os) << "'" << v << "'"; } else { (*os) << "signed char value " << (short)v; } } template <> void MakeCheckOpValueString(std::ostream* os, const unsigned char& v) { if (v >= 32 && v <= 126) { (*os) << "'" << v << "'"; } else { (*os) << "unsigned char value " << (unsigned short)v; } } template <> void MakeCheckOpValueString(std::ostream* os, const std::nullptr_t& p) { (*os) << "nullptr"; } CheckOpMessageBuilder::CheckOpMessageBuilder(const char* exprtext) : stream_(new std::ostringstream) { *stream_ << "Check failed: " << exprtext << " ("; } CheckOpMessageBuilder::~CheckOpMessageBuilder() { delete stream_; } std::ostream* CheckOpMessageBuilder::ForVar2() { *stream_ << " vs. "; return stream_; } string* CheckOpMessageBuilder::NewString() { *stream_ << ")"; return new string(stream_->str()); } } // namespace logging #endif } // namespace singa