xref: /aosp_15_r20/external/libbrillo/brillo/syslog_logging.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #include "brillo/syslog_logging.h"
6*1a96fba6SXin Li 
7*1a96fba6SXin Li #include <syslog.h>
8*1a96fba6SXin Li #include <unistd.h>
9*1a96fba6SXin Li 
10*1a96fba6SXin Li #include <string>
11*1a96fba6SXin Li 
12*1a96fba6SXin Li // syslog.h and base/logging.h both try to #define LOG_INFO and LOG_WARNING.
13*1a96fba6SXin Li // We need to #undef at least these two before including base/logging.h.  The
14*1a96fba6SXin Li // others are included to be consistent.
15*1a96fba6SXin Li namespace {
16*1a96fba6SXin Li const int kSyslogDebug    = LOG_DEBUG;
17*1a96fba6SXin Li const int kSyslogInfo     = LOG_INFO;
18*1a96fba6SXin Li const int kSyslogWarning  = LOG_WARNING;
19*1a96fba6SXin Li const int kSyslogError    = LOG_ERR;
20*1a96fba6SXin Li const int kSyslogCritical = LOG_CRIT;
21*1a96fba6SXin Li 
22*1a96fba6SXin Li #undef LOG_INFO
23*1a96fba6SXin Li #undef LOG_WARNING
24*1a96fba6SXin Li #undef LOG_ERR
25*1a96fba6SXin Li #undef LOG_CRIT
26*1a96fba6SXin Li }  // namespace
27*1a96fba6SXin Li 
28*1a96fba6SXin Li #include <base/logging.h>
29*1a96fba6SXin Li 
30*1a96fba6SXin Li static std::string s_ident;
31*1a96fba6SXin Li static std::string s_accumulated;
32*1a96fba6SXin Li static bool s_accumulate;
33*1a96fba6SXin Li static bool s_log_to_syslog;
34*1a96fba6SXin Li static bool s_log_to_stderr;
35*1a96fba6SXin Li static bool s_log_header;
36*1a96fba6SXin Li 
HandleMessage(int severity,const char *,int,size_t message_start,const std::string & message)37*1a96fba6SXin Li static bool HandleMessage(int severity,
38*1a96fba6SXin Li                           const char* /* file */,
39*1a96fba6SXin Li                           int /* line */,
40*1a96fba6SXin Li                           size_t message_start,
41*1a96fba6SXin Li                           const std::string& message) {
42*1a96fba6SXin Li   switch (severity) {
43*1a96fba6SXin Li     case logging::LOG_INFO:
44*1a96fba6SXin Li       severity = kSyslogInfo;
45*1a96fba6SXin Li       break;
46*1a96fba6SXin Li 
47*1a96fba6SXin Li     case logging::LOG_WARNING:
48*1a96fba6SXin Li       severity = kSyslogWarning;
49*1a96fba6SXin Li       break;
50*1a96fba6SXin Li 
51*1a96fba6SXin Li     case logging::LOG_ERROR:
52*1a96fba6SXin Li       severity = kSyslogError;
53*1a96fba6SXin Li       break;
54*1a96fba6SXin Li 
55*1a96fba6SXin Li     case logging::LOG_FATAL:
56*1a96fba6SXin Li       severity = kSyslogCritical;
57*1a96fba6SXin Li       break;
58*1a96fba6SXin Li 
59*1a96fba6SXin Li     default:
60*1a96fba6SXin Li       severity = kSyslogDebug;
61*1a96fba6SXin Li       break;
62*1a96fba6SXin Li   }
63*1a96fba6SXin Li 
64*1a96fba6SXin Li   const char* str;
65*1a96fba6SXin Li   if (s_log_header) {
66*1a96fba6SXin Li     str = message.c_str();
67*1a96fba6SXin Li   } else {
68*1a96fba6SXin Li     str = message.c_str() + message_start;
69*1a96fba6SXin Li   }
70*1a96fba6SXin Li 
71*1a96fba6SXin Li   if (s_log_to_syslog)
72*1a96fba6SXin Li     syslog(severity, "%s", str);
73*1a96fba6SXin Li   if (s_accumulate)
74*1a96fba6SXin Li     s_accumulated.append(str);
75*1a96fba6SXin Li   return !s_log_to_stderr && severity != kSyslogCritical;
76*1a96fba6SXin Li }
77*1a96fba6SXin Li 
78*1a96fba6SXin Li namespace brillo {
SetLogFlags(int log_flags)79*1a96fba6SXin Li void SetLogFlags(int log_flags) {
80*1a96fba6SXin Li   s_log_to_syslog = (log_flags & kLogToSyslog) != 0;
81*1a96fba6SXin Li   s_log_to_stderr = (log_flags & kLogToStderr) != 0;
82*1a96fba6SXin Li   if ((log_flags & kLogToStderrIfTty) && isatty(0))
83*1a96fba6SXin Li     s_log_to_stderr = true;
84*1a96fba6SXin Li   s_log_header = (log_flags & kLogHeader) != 0;
85*1a96fba6SXin Li }
GetLogFlags()86*1a96fba6SXin Li int GetLogFlags() {
87*1a96fba6SXin Li   int flags = 0;
88*1a96fba6SXin Li   flags |= (s_log_to_syslog) ? kLogToSyslog : 0;
89*1a96fba6SXin Li   flags |= (s_log_to_stderr) ? kLogToStderr : 0;
90*1a96fba6SXin Li   flags |= (s_log_header) ? kLogHeader : 0;
91*1a96fba6SXin Li   return flags;
92*1a96fba6SXin Li }
InitLog(int init_flags)93*1a96fba6SXin Li void InitLog(int init_flags) {
94*1a96fba6SXin Li   logging::LoggingSettings settings;
95*1a96fba6SXin Li   settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
96*1a96fba6SXin Li   logging::InitLogging(settings);
97*1a96fba6SXin Li 
98*1a96fba6SXin Li   const bool kOptionPID = false;
99*1a96fba6SXin Li   const bool kOptionTID = false;
100*1a96fba6SXin Li   const bool kOptionTimestamp = false;
101*1a96fba6SXin Li   const bool kOptionTickcount = false;
102*1a96fba6SXin Li   logging::SetLogItems(
103*1a96fba6SXin Li       kOptionPID, kOptionTID, kOptionTimestamp, kOptionTickcount);
104*1a96fba6SXin Li   logging::SetLogMessageHandler(HandleMessage);
105*1a96fba6SXin Li   SetLogFlags(init_flags);
106*1a96fba6SXin Li }
OpenLog(const char * ident,bool log_pid)107*1a96fba6SXin Li void OpenLog(const char* ident, bool log_pid) {
108*1a96fba6SXin Li   s_ident = ident;
109*1a96fba6SXin Li   openlog(s_ident.c_str(), log_pid ? LOG_PID : 0, LOG_USER);
110*1a96fba6SXin Li }
LogToString(bool enabled)111*1a96fba6SXin Li void LogToString(bool enabled) {
112*1a96fba6SXin Li   s_accumulate = enabled;
113*1a96fba6SXin Li }
GetLog()114*1a96fba6SXin Li std::string GetLog() {
115*1a96fba6SXin Li   return s_accumulated;
116*1a96fba6SXin Li }
ClearLog()117*1a96fba6SXin Li void ClearLog() {
118*1a96fba6SXin Li   s_accumulated.clear();
119*1a96fba6SXin Li }
FindLog(const char * string)120*1a96fba6SXin Li bool FindLog(const char* string) {
121*1a96fba6SXin Li   return s_accumulated.find(string) != std::string::npos;
122*1a96fba6SXin Li }
123*1a96fba6SXin Li }  // namespace brillo
124