Revert "Add vmodule support to TF OSS logging."

This reverts commit 072b0c9c55.
This commit is contained in:
Yun Peng 2017-09-04 17:51:52 +02:00 committed by Martin Wicke
parent 1209491913
commit 155b45698a
5 changed files with 10 additions and 247 deletions

View File

@ -2156,8 +2156,6 @@ tf_cc_tests(
"platform/port_test.cc",
"platform/profile_utils/cpu_utils_test.cc",
"platform/subprocess_test.cc",
"platform/vmodule_benchmark_test.cc",
"platform/vmodule_test.cc",
],
deps = [
":lib",

View File

@ -14,7 +14,6 @@ limitations under the License.
==============================================================================*/
#include "tensorflow/core/platform/default/logging.h"
#include "tensorflow/core/lib/core/stringpiece.h"
#include "tensorflow/core/platform/env_time.h"
#include "tensorflow/core/platform/macros.h"
@ -25,12 +24,8 @@ limitations under the License.
#endif
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <string>
#include <unordered_map>
namespace tensorflow {
namespace internal {
@ -88,11 +83,11 @@ void LogMessage::GenerateLogMessage() {
const size_t time_buffer_size = 30;
char time_buffer[time_buffer_size];
strftime(time_buffer, time_buffer_size, "%Y-%m-%d %H:%M:%S",
localtime(&now_seconds));
localtime(&now_seconds));
// TODO(jeff,sanjay): Replace this with something that logs through the env.
fprintf(stderr, "%s.%06d: %c %s:%d] %s\n", time_buffer, micros_remainder,
"IWEF"[severity_], fname_, line_, str().c_str());
"IWEF"[severity_], fname_, line_, str().c_str());
}
#endif
@ -129,48 +124,6 @@ int64 MinVLogLevelFromEnv() {
return LogLevelStrToInt(tf_env_var_val);
}
using VmoduleMap = std::unordered_map<StringPiece, int, StringPiece::Hasher>;
// Returns a mapping from module name to VLOG level, derived from the
// TF_CPP_VMOUDLE environment variable; ownership is transferred to the caller.
VmoduleMap* VmoduleRecordsFromEnv() {
// The value of the env var is supposed to be of the form:
// "foo=1,bar=2,baz=3"
const char* tf_env_var_val = getenv("TF_CPP_VMODULE");
auto* result = new VmoduleMap();
if (tf_env_var_val == nullptr) return result;
while (true) {
const char* eq = strchr(tf_env_var_val, '=');
if (eq == nullptr) break;
const char* after_eq = eq + 1;
// Comma either points at the next comma delimiter, or at a null terminator.
// We check that the integer we parse ends at this delimiter.
const char* comma = strchr(after_eq, ',');
const char* new_tf_env_var_val;
if (comma == nullptr) {
comma = strchr(after_eq, '\0');
new_tf_env_var_val = comma;
} else {
new_tf_env_var_val = comma + 1;
}
char* endptr = nullptr;
int level = strtol(after_eq, &endptr, 10);
if (endptr != comma) {
fprintf(stderr,
"warning: could not parse integer in vmodule specification in "
"\"%s\".\n",
after_eq);
break;
}
StringPiece module(tf_env_var_val, eq - tf_env_var_val);
tf_env_var_val = new_tf_env_var_val;
(*result)[module] = level;
}
return result;
}
} // namespace
LogMessage::~LogMessage() {
@ -184,19 +137,6 @@ int64 LogMessage::MinVLogLevel() {
return min_vlog_level;
}
bool LogMessage::VmoduleActivated(const char* fname, int lvl) {
static VmoduleMap* vmodule_records = VmoduleRecordsFromEnv();
const char* last_slash = strrchr(fname, '/');
const char* module_start = last_slash == nullptr ? fname : last_slash + 1;
const char* dot_after = strchr(module_start, '.');
const char* module_limit =
dot_after == nullptr ? strchr(fname, '\0') : dot_after;
StringPiece module(module_start, module_limit - module_start);
auto it = vmodule_records->find(module);
if (it == vmodule_records->end()) return false;
return it->second >= lvl;
}
LogMessageFatal::LogMessageFatal(const char* file, int line)
: LogMessage(file, line, FATAL) {}
LogMessageFatal::~LogMessageFatal() {

View File

@ -46,16 +46,6 @@ class LogMessage : public std::basic_ostringstream<char> {
// but VLOG(3) will not. Defaults to 0.
static int64 MinVLogLevel();
// Returns whether VLOG level lvl is activated for the file fname.
//
// E.g. if the environment variable TF_CPP_VMODULE contains foo=3 and fname is
// foo.cc and lvl is <= 3, this will return true.
//
// It is expected that the result of this query will be cached in the VLOG-ing
// call site to avoid repeated lookups. This routine performs a hash-map
// access against the VLOG-ing specification provided by the env var.
static bool VmoduleActivated(const char* fname, int lvl);
protected:
void GenerateLogMessage();
@ -86,38 +76,18 @@ class LogMessageFatal : public LogMessage {
#define LOG(severity) _TF_LOG_##severity
#if defined(IS_MOBILE_PLATFORM)
#ifdef IS_MOBILE_PLATFORM
// Turn VLOG off when under mobile devices for considerations of binary size.
#define _VLOG_IS_ON(lvl, file) ((lvl) <= 0)
#elif defined(PLATFORM_WINDOWS)
// TODO(b/64279502) The _VLOG_IS_ON definition below appears to cause MSVC to
// fatal error, so we fall back to the vmodule-less implementation for now.
#define _VLOG_IS_ON(lvl, file) \
((lvl) <= ::tensorflow::internal::LogMessage::MinVLogLevel())
#define VLOG_IS_ON(lvl) ((lvl) <= 0)
#else
// Otherwise, set TF_CPP_MIN_VLOG_LEVEL environment to update minimum log level
// of VLOG, or TF_CPP_VMODULE to set the minimum log level for individual
// translation units.
#define _VLOG_IS_ON(lvl, file) \
(([](int level, const char* fname) { \
if (level <= ::tensorflow::internal::LogMessage::MinVLogLevel()) \
return true; \
static bool vmodule_activated = \
::tensorflow::internal::LogMessage::VmoduleActivated(fname, level); \
return vmodule_activated; \
})(lvl, file))
// Otherwise, Set TF_CPP_MIN_VLOG_LEVEL environment to update minimum log level
// of VLOG
#define VLOG_IS_ON(lvl) \
((lvl) <= ::tensorflow::internal::LogMessage::MinVLogLevel())
#endif
#define VLOG_IS_ON(lvl) _VLOG_IS_ON(lvl, __FILE__)
#define VLOG(lvl) \
if (TF_PREDICT_FALSE(_VLOG_IS_ON(lvl, __FILE__))) \
#define VLOG(lvl) \
if (TF_PREDICT_FALSE(VLOG_IS_ON(lvl))) \
::tensorflow::internal::LogMessage(__FILE__, __LINE__, tensorflow::INFO)
// CHECK dies with a fatal error if condition is not true. It is *not*

View File

@ -1,28 +0,0 @@
/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
Licensed 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 "tensorflow/core/platform/logging.h"
#include "tensorflow/core/platform/test_benchmark.h"
namespace tensorflow {
static void BM_DisabledVlog(int iters) {
for (int i = 0; i < iters; ++i) {
VLOG(1) << "Testing VLOG(1)!";
}
}
BENCHMARK(BM_DisabledVlog);
} // namespace tensorflow

View File

@ -1,117 +0,0 @@
/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
Licensed 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.
==============================================================================*/
// Test that popens a child process with the VLOG-ing environment variable set
// for the logging framework, and observes VLOG_IS_ON and VLOG macro output.
#include "tensorflow/core/platform/logging.h"
#include "tensorflow/core/platform/platform.h"
#include "tensorflow/core/platform/test.h"
#include <string.h>
namespace tensorflow {
namespace {
int RealMain(const char* argv0, bool do_vlog) {
if (do_vlog) {
#if !defined(PLATFORM_GOOGLE)
// Note, we only test this when !defined(PLATFORM_GOOGLE) because
// VmoduleActivated doesn't exist in that implementation.
//
// Also, we call this internal API to simulate what would happen if
// differently-named translation units attempted to VLOG, so we don't need
// to create dummy translation unit files.
bool ok = internal::LogMessage::VmoduleActivated("vmodule_test.cc", 7) &&
internal::LogMessage::VmoduleActivated("shoobadooba.h", 3);
if (!ok) {
fprintf(stderr, "vmodule activated levels not as expected.\n");
return EXIT_FAILURE;
}
#endif
// Print info on which VLOG levels are activated.
fprintf(stderr, "VLOG_IS_ON(8)? %d\n", VLOG_IS_ON(8));
fprintf(stderr, "VLOG_IS_ON(7)? %d\n", VLOG_IS_ON(7));
fprintf(stderr, "VLOG_IS_ON(6)? %d\n", VLOG_IS_ON(6));
// Do some VLOG-ing.
VLOG(8) << "VLOG(8)";
VLOG(7) << "VLOG(7)";
VLOG(6) << "VLOG(6)";
LOG(INFO) << "INFO";
return EXIT_SUCCESS;
}
// Popen the child process.
std::string command = std::string(argv0);
#if defined(PLATFORM_GOOGLE)
command = command + " do_vlog --vmodule=vmodule_test=7 --alsologtostderr";
#else
command =
"TF_CPP_VMODULE=vmodule_test=7,shoobadooba=3 " + command + " do_vlog";
#endif
command += " 2>&1";
fprintf(stderr, "Running: \"%s\"\n", command.c_str());
FILE* f = popen(command.c_str(), "r");
if (f == nullptr) {
fprintf(stderr, "Failed to popen child: %s\n", strerror(errno));
return EXIT_FAILURE;
}
// Read data from the child's stdout.
constexpr int kBufferSizeBytes = 4096;
char buffer[kBufferSizeBytes];
size_t result = fread(buffer, sizeof(buffer[0]), kBufferSizeBytes - 1, f);
if (result == 0) {
fprintf(stderr, "Failed to read from child stdout: %zu %s\n", result,
strerror(errno));
return EXIT_FAILURE;
}
buffer[result] = '\0';
int status = pclose(f);
if (status == -1) {
fprintf(stderr, "Failed to close popen child: %s\n", strerror(errno));
return EXIT_FAILURE;
}
// Check output is as expected.
const char kExpected[] =
"VLOG_IS_ON(8)? 0\nVLOG_IS_ON(7)? 1\nVLOG_IS_ON(6)? 1\n";
if (strstr(buffer, kExpected) == nullptr) {
fprintf(stderr, "error: unexpected output from child: \"%.*s\"\n",
kBufferSizeBytes, buffer);
return EXIT_FAILURE;
}
bool ok = strstr(buffer, "VLOG(7)\n") != nullptr &&
strstr(buffer, "VLOG(6)\n") != nullptr &&
strstr(buffer, "VLOG(8)\n") == nullptr;
if (!ok) {
fprintf(stderr, "error: VLOG output not as expected: \"%.*s\"\n",
kBufferSizeBytes, buffer);
return EXIT_FAILURE;
}
// Success!
return EXIT_SUCCESS;
}
} // namespace
} // namespace tensorflow
int main(int argc, char** argv) {
testing::InitGoogleTest(&argc, argv);
bool do_vlog = argc >= 2 && strcmp(argv[1], "do_vlog") == 0;
return tensorflow::RealMain(argv[0], do_vlog);
}