1// Copyright (C) 2011 The Libphonenumber Authors 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// Author: Philippe Liard 16 17#ifndef I18N_PHONENUMBERS_LOGGER_H_ 18#define I18N_PHONENUMBERS_LOGGER_H_ 19 20#include <cstdio> 21#include <string> 22 23namespace i18n { 24namespace phonenumbers { 25 26using std::string; 27 28enum { 29 LOG_FATAL = 1, 30 LOG_ERROR, 31 LOG_WARNING, 32 LOG_INFO, 33 LOG_DEBUG, 34}; 35 36enum { 37 DFATAL = LOG_FATAL, 38// ERROR seems to be defined on MSVC, therefore don't overwrite it. 39#ifndef ERROR 40 ERROR = LOG_ERROR, 41#endif 42 WARNING = LOG_WARNING, 43}; 44 45// Subclass this abstract class to override the way logging is handled in the 46// library. You can then call the PhoneNumberUtil::SetLogger() method. 47class Logger { 48 public: 49 Logger() : level_(LOG_ERROR) {} 50 virtual ~Logger() {} 51 52 // Writes the message level to the underlying output stream. 53 virtual void WriteLevel() {} 54 // Writes the provided message to the underlying output stream. 55 virtual void WriteMessage(const string& msg) = 0; 56 57 // Note that if set_verbosity_level has been used to set the level to a value 58 // that is not represented by an enum, the result here will be a log 59 // level that is higher than LOG_DEBUG. 60 inline int level() const { 61 return level_; 62 } 63 64 inline void set_level(int level) { 65 level_ = level; 66 } 67 68 // If you want to see verbose logs in addition to other logs, use this method. 69 // This will result in all log messages at the levels above being shown, along 70 // with calls to VLOG with the verbosity level set to this level or lower. 71 // For example, set_verbosity_level(2) will show calls of VLOG(1) and VLOG(2) 72 // but not VLOG(3), along with all calls to LOG(). 73 inline void set_verbosity_level(int verbose_logs_level) { 74 set_level(LOG_DEBUG + verbose_logs_level); 75 } 76 77 static inline Logger* set_logger_impl(Logger* logger) { 78 impl_ = logger; 79 return logger; 80 } 81 82 static inline Logger* mutable_logger_impl() { 83 return impl_; 84 } 85 86 private: 87 static Logger* impl_; 88 int level_; 89}; 90 91// Logger that does not log anything. It could be useful to "mute" the 92// phonenumber library. 93class NullLogger : public Logger { 94 public: 95 virtual ~NullLogger() {} 96 97 virtual void WriteMessage(const string& /* msg */) {} 98}; 99 100} // namespace phonenumbers 101} // namespace i18n 102 103#endif // I18N_PHONENUMBERS_LOGGER_ADAPTER_H_ 104