123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- //
- // Copyright 2022 The Abseil Authors.
- //
- // 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
- //
- // https://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 "absl/log/internal/flags.h"
- #include <stddef.h>
- #include <algorithm>
- #include <cstdlib>
- #include <string>
- #include "absl/base/attributes.h"
- #include "absl/base/config.h"
- #include "absl/base/log_severity.h"
- #include "absl/flags/flag.h"
- #include "absl/flags/marshalling.h"
- #include "absl/log/globals.h"
- #include "absl/log/internal/config.h"
- #include "absl/log/internal/vlog_config.h"
- #include "absl/strings/numbers.h"
- #include "absl/strings/string_view.h"
- namespace absl {
- ABSL_NAMESPACE_BEGIN
- namespace log_internal {
- namespace {
- void SyncLoggingFlags() {
- absl::SetFlag(&FLAGS_minloglevel, static_cast<int>(absl::MinLogLevel()));
- absl::SetFlag(&FLAGS_log_prefix, absl::ShouldPrependLogPrefix());
- }
- bool RegisterSyncLoggingFlags() {
- log_internal::SetLoggingGlobalsListener(&SyncLoggingFlags);
- return true;
- }
- ABSL_ATTRIBUTE_UNUSED const bool unused = RegisterSyncLoggingFlags();
- template <typename T>
- T GetFromEnv(const char* varname, T dflt) {
- const char* val = ::getenv(varname);
- if (val != nullptr) {
- std::string err;
- ABSL_INTERNAL_CHECK(absl::ParseFlag(val, &dflt, &err), err.c_str());
- }
- return dflt;
- }
- constexpr absl::LogSeverityAtLeast StderrThresholdDefault() {
- return absl::LogSeverityAtLeast::kError;
- }
- } // namespace
- } // namespace log_internal
- ABSL_NAMESPACE_END
- } // namespace absl
- ABSL_FLAG(int, stderrthreshold,
- static_cast<int>(absl::log_internal::StderrThresholdDefault()),
- "Log messages at or above this threshold level are copied to stderr.")
- .OnUpdate([] {
- absl::log_internal::RawSetStderrThreshold(
- static_cast<absl::LogSeverityAtLeast>(
- absl::GetFlag(FLAGS_stderrthreshold)));
- });
- ABSL_FLAG(int, minloglevel, static_cast<int>(absl::LogSeverityAtLeast::kInfo),
- "Messages logged at a lower level than this don't actually "
- "get logged anywhere")
- .OnUpdate([] {
- absl::log_internal::RawSetMinLogLevel(
- static_cast<absl::LogSeverityAtLeast>(
- absl::GetFlag(FLAGS_minloglevel)));
- });
- ABSL_FLAG(std::string, log_backtrace_at, "",
- "Emit a backtrace when logging at file:linenum.")
- .OnUpdate([] {
- const std::string log_backtrace_at =
- absl::GetFlag(FLAGS_log_backtrace_at);
- if (log_backtrace_at.empty()) {
- absl::ClearLogBacktraceLocation();
- return;
- }
- const size_t last_colon = log_backtrace_at.rfind(':');
- if (last_colon == log_backtrace_at.npos) {
- absl::ClearLogBacktraceLocation();
- return;
- }
- const absl::string_view file =
- absl::string_view(log_backtrace_at).substr(0, last_colon);
- int line;
- if (!absl::SimpleAtoi(
- absl::string_view(log_backtrace_at).substr(last_colon + 1),
- &line)) {
- absl::ClearLogBacktraceLocation();
- return;
- }
- absl::SetLogBacktraceLocation(file, line);
- });
- ABSL_FLAG(bool, log_prefix, true,
- "Prepend the log prefix to the start of each log line")
- .OnUpdate([] {
- absl::log_internal::RawEnableLogPrefix(absl::GetFlag(FLAGS_log_prefix));
- });
- ABSL_FLAG(int, v, 0,
- "Show all VLOG(m) messages for m <= this. Overridable by --vmodule.")
- .OnUpdate([] {
- absl::log_internal::UpdateGlobalVLogLevel(absl::GetFlag(FLAGS_v));
- });
- ABSL_FLAG(
- std::string, vmodule, "",
- "per-module log verbosity level."
- " Argument is a comma-separated list of <module name>=<log level>."
- " <module name> is a glob pattern, matched against the filename base"
- " (that is, name ignoring .cc/.h./-inl.h)."
- " A pattern without slashes matches just the file name portion, otherwise"
- " the whole file path below the workspace root"
- " (still without .cc/.h./-inl.h) is matched."
- " ? and * in the glob pattern match any single or sequence of characters"
- " respectively including slashes."
- " <log level> overrides any value given by --v.")
- .OnUpdate([] {
- absl::log_internal::UpdateVModule(absl::GetFlag(FLAGS_vmodule));
- });
|