void initialize( const string& _argv0, const Flags& flags, bool installFailureSignalHandler) { static Once* initialized = new Once(); if (initialized->once()) { return; } argv0 = _argv0; if (flags.logging_level != "INFO" && flags.logging_level != "WARNING" && flags.logging_level != "ERROR") { EXIT(EXIT_FAILURE) << "'" << flags.logging_level << "' is not a valid logging level. Possible values for" << " 'logging_level' flag are: 'INFO', 'WARNING', 'ERROR'."; } FLAGS_minloglevel = getLogSeverity(flags.logging_level); if (flags.log_dir.isSome()) { Try<Nothing> mkdir = os::mkdir(flags.log_dir.get()); if (mkdir.isError()) { EXIT(EXIT_FAILURE) << "Could not initialize logging: Failed to create directory " << flags.log_dir.get() << ": " << mkdir.error(); } FLAGS_log_dir = flags.log_dir.get(); // Do not log to stderr instead of log files. FLAGS_logtostderr = false; } else { // Log to stderr instead of log files. FLAGS_logtostderr = true; } // Log everything to stderr IN ADDITION to log files unless // otherwise specified. if (flags.quiet) { FLAGS_stderrthreshold = 3; // FATAL. // FLAGS_stderrthreshold is ignored when logging to stderr instead // of log files. Setting the minimum log level gets around this issue. if (FLAGS_logtostderr) { FLAGS_minloglevel = 3; // FATAL. } } else { FLAGS_stderrthreshold = FLAGS_minloglevel; } FLAGS_logbufsecs = flags.logbufsecs; #ifdef __linux__ // Do not drop in-memory buffers of log contents. When set to true, this flag // can significantly slow down the master. The slow down is attributed to // several hundred `posix_fadvise(..., POSIX_FADV_DONTNEED)` calls per second // to advise the kernel to drop in-memory buffers related to log contents. // We set this flag to 'false' only if the corresponding environment variable // is not set. if (os::getenv("GLOG_drop_log_memory").isNone()) { FLAGS_drop_log_memory = false; } #endif google::InitGoogleLogging(argv0.c_str()); if (flags.log_dir.isSome()) { // Log this message in order to create the log file; this is because GLOG // creates the log file once the first log message occurs; also recreate // the file if it has been created on a previous run. LOG_AT_LEVEL(FLAGS_minloglevel) << google::GetLogSeverityName(FLAGS_minloglevel) << " level logging started!"; } VLOG(1) << "Logging to " << (flags.log_dir.isSome() ? flags.log_dir.get() : "STDERR"); if (installFailureSignalHandler) { // glog on Windows does not support `InstallFailureSignalHandler`. #ifndef __WINDOWS__ // Handles SIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, SIGTERM // by default. google::InstallFailureSignalHandler(); // The code below sets the SIGTERM signal handler to the `handle` function // declared above. While this is useful on POSIX systems, SIGTERM is // generated and handled differently on Windows[1], so this code would // not work. // [1] https://msdn.microsoft.com/en-us/library/xdkz3x12.aspx // Set up our custom signal handlers. struct sigaction action; action.sa_sigaction = handler; // Do not block additional signals while in the handler. sigemptyset(&action.sa_mask); // The SA_SIGINFO flag tells sigaction() to use // the sa_sigaction field, not sa_handler. action.sa_flags = SA_SIGINFO; // We also do not want SIGTERM to dump a stacktrace, as this // can imply that we crashed, when we were in fact terminated // by user request. if (sigaction(SIGTERM, &action, nullptr) < 0) { PLOG(FATAL) << "Failed to set sigaction"; } #endif // __WINDOWS__ } initialized->done(); }
void initialize( const string& _argv0, const Flags& flags, bool installFailureSignalHandler) { static Once* initialized = new Once(); if (initialized->once()) { return; } argv0 = _argv0; if (flags.logging_level != "INFO" && flags.logging_level != "WARNING" && flags.logging_level != "ERROR") { EXIT(1) << "'" << flags.logging_level << "' is not a valid logging level." " Possible values for 'logging_level' flag are: " " 'INFO', 'WARNING', 'ERROR'."; } FLAGS_minloglevel = getLogSeverity(flags.logging_level); if (flags.log_dir.isSome()) { Try<Nothing> mkdir = os::mkdir(flags.log_dir.get()); if (mkdir.isError()) { EXIT(1) << "Could not initialize logging: Failed to create directory " << flags.log_dir.get() << ": " << mkdir.error(); } FLAGS_log_dir = flags.log_dir.get(); // Do not log to stderr instead of log files. FLAGS_logtostderr = false; } else { // Log to stderr instead of log files. FLAGS_logtostderr = true; } // Log everything to stderr IN ADDITION to log files unless // otherwise specified. if (flags.quiet) { FLAGS_stderrthreshold = 3; // FATAL. // FLAGS_stderrthreshold is ignored when logging to stderr instead // of log files. Setting the minimum log level gets around this issue. if (FLAGS_logtostderr) { FLAGS_minloglevel = 3; // FATAL. } } else { FLAGS_stderrthreshold = FLAGS_minloglevel; } FLAGS_logbufsecs = flags.logbufsecs; google::InitGoogleLogging(argv0.c_str()); if (flags.log_dir.isSome()) { // Log this message in order to create the log file; this is because GLOG // creates the log file once the first log message occurs; also recreate // the file if it has been created on a previous run. LOG_AT_LEVEL(FLAGS_minloglevel) << google::GetLogSeverityName(FLAGS_minloglevel) << " level logging started!"; } VLOG(1) << "Logging to " << (flags.log_dir.isSome() ? flags.log_dir.get() : "STDERR"); if (installFailureSignalHandler) { // Handles SIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, SIGTERM // by default. google::InstallFailureSignalHandler(); // Set up our custom signal handlers. struct sigaction action; action.sa_sigaction = handler; // Do not block additional signals while in the handler. sigemptyset(&action.sa_mask); // The SA_SIGINFO flag tells sigaction() to use // the sa_sigaction field, not sa_handler. action.sa_flags = SA_SIGINFO; // Set up the SIGPIPE signal handler to escalate to SIGABRT // in order to have the glog handler catch it and print all // of its lovely information. if (sigaction(SIGPIPE, &action, NULL) < 0) { PLOG(FATAL) << "Failed to set sigaction"; } // We also do not want SIGTERM to dump a stacktrace, as this // can imply that we crashed, when we were in fact terminated // by user request. if (sigaction(SIGTERM, &action, NULL) < 0) { PLOG(FATAL) << "Failed to set sigaction"; } } initialized->done(); }