OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <chromeos/syslog_logging.h> |
| 6 |
| 7 #include <string> |
| 8 #include <syslog.h> |
| 9 |
| 10 // syslog.h and base/logging.h both try to #define LOG_INFO and LOG_WARNING. |
| 11 // We need to #undef at least these two before including base/logging.h. The |
| 12 // others are included to be consistent. |
| 13 namespace { |
| 14 const int kSyslogInfo = LOG_INFO; |
| 15 const int kSyslogWarning = LOG_WARNING; |
| 16 const int kSyslogError = LOG_ERR; |
| 17 const int kSyslogCritical = LOG_CRIT; |
| 18 |
| 19 #undef LOG_INFO |
| 20 #undef LOG_WARNING |
| 21 #undef LOG_ERR |
| 22 #undef LOG_INFO |
| 23 } // namespace |
| 24 |
| 25 #include <base/logging.h> |
| 26 |
| 27 static std::string s_ident; |
| 28 static std::string s_accumulated; |
| 29 static bool s_accumulate; |
| 30 static bool s_log_to_syslog; |
| 31 static bool s_log_to_stderr; |
| 32 |
| 33 static bool HandleMessage(int severity, const std::string &message) { |
| 34 switch (severity) { |
| 35 case logging::LOG_INFO: |
| 36 severity = kSyslogInfo; |
| 37 break; |
| 38 |
| 39 case logging::LOG_WARNING: |
| 40 severity = kSyslogWarning; |
| 41 break; |
| 42 |
| 43 case logging::LOG_ERROR: |
| 44 case logging::LOG_ERROR_REPORT: |
| 45 severity = kSyslogError; |
| 46 break; |
| 47 |
| 48 case logging::LOG_FATAL: |
| 49 severity = kSyslogCritical; |
| 50 break; |
| 51 } |
| 52 |
| 53 // The first "] " should be the end of the header added by the logging |
| 54 // code. The meat of the message is two characters after that. |
| 55 size_t pos = message.find("] "); |
| 56 if (pos != std::string::npos && message.length() > pos + 2) { |
| 57 pos += 2; |
| 58 } else { |
| 59 pos = 0; |
| 60 } |
| 61 |
| 62 const char* str = message.c_str() + pos; |
| 63 |
| 64 if (s_log_to_syslog) |
| 65 syslog(severity, "%s", str); |
| 66 if (s_accumulate) |
| 67 s_accumulated.append(str); |
| 68 return !s_log_to_stderr; |
| 69 } |
| 70 |
| 71 namespace chromeos { |
| 72 void InitLog(int init_flags) { |
| 73 logging::InitLogging("/dev/null", |
| 74 logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG, |
| 75 logging::DONT_LOCK_LOG_FILE, |
| 76 logging::APPEND_TO_OLD_LOG_FILE); |
| 77 logging::SetLogMessageHandler(HandleMessage); |
| 78 s_log_to_syslog = (init_flags & kLogToSyslog) != 0; |
| 79 s_log_to_stderr = (init_flags & kLogToStderr) != 0; |
| 80 } |
| 81 void OpenLog(const char* ident, bool log_pid) { |
| 82 s_ident = ident; |
| 83 openlog(s_ident.c_str(), log_pid ? LOG_PID : 0, LOG_USER); |
| 84 } |
| 85 void LogToString(bool enabled) { |
| 86 s_accumulate = enabled; |
| 87 } |
| 88 std::string GetLog() { |
| 89 return s_accumulated; |
| 90 } |
| 91 void ClearLog() { |
| 92 s_accumulated.clear(); |
| 93 } |
| 94 bool FindLog(const char* string) { |
| 95 return s_accumulated.find(string) != std::string::npos; |
| 96 } |
| 97 } // namespace chromeos |
OLD | NEW |