blob: a9721e9b8a79ea803e3d78d35f9086b2f2fe0b3e [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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
*
* http://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.
*/
#ifndef LogDefines_h
#define LogDefines_h
#include <cstring>
#include <string>
#ifdef __ANDROID__
#include <android/log.h>
#endif
#include <mutex>
namespace WeexCore {
enum class LogLevel : int {
All = 0,
Verbose,
Debug,
Info,
Warn,
Error,
Tlog,
Wtf,
Off,
Performance,
};
void PrintLog(LogLevel level,
const char *tag,
const char *file,
unsigned long line,
const char *format,
...);
}
namespace weex {
namespace base {
class LogBase {
public:
virtual bool log(WeexCore::LogLevel level,
const char *tag,
const char *file,
unsigned long line,
const char *log) = 0;
LogBase() : printLevel(WeexCore::LogLevel::Error), m_debugMode(false), m_perfMode(false) {};
inline void setDebugMode(bool isDebug) {
if (isDebug) {
printLevel = WeexCore::LogLevel::Debug;
} else {
printLevel = WeexCore::LogLevel::Error;
}
m_debugMode = isDebug;
}
inline bool is_debug_mode() { return m_debugMode; }
inline void setPerfMode(bool isPerf) {
m_perfMode = isPerf;
}
inline bool is_perf_mode() { return m_perfMode; }
inline void setPrintLevel(WeexCore::LogLevel l) {
printLevel = l;
}
inline WeexCore::LogLevel print_level() { return printLevel; }
inline bool shouldPrint(WeexCore::LogLevel l) {
if (m_perfMode && l == WeexCore::LogLevel::Performance) {
return true;
}
return l != WeexCore::LogLevel::Performance && l >= printLevel;
}
private:
WeexCore::LogLevel printLevel = WeexCore::LogLevel::Error;
bool m_perfMode = false;
bool m_debugMode = false;
};
class LogImplement {
public:
static LogImplement *getLog() {
static std::once_flag once_flag;
std::call_once(once_flag, []() { g_instance = new LogImplement(); });
return g_instance;
}
void setLogImplement(weex::base::LogBase *logVirtual) {
m_log = logVirtual;
}
inline void setPrintLevel(WeexCore::LogLevel level) {
if (m_log) {
m_log->setPrintLevel(level);
}
}
inline void setDebugMode(bool debugFlag) {
if (m_log) {
m_log->setDebugMode(debugFlag);
}
}
inline bool debugMode() {
if (m_log)
return m_log->is_debug_mode();
return false;
}
inline bool perfMode() {
if (m_log)
return m_log->is_perf_mode();
return false;
}
inline void setPerfMode(bool perfFlag) {
if (m_log)
m_log->setPerfMode(perfFlag);
}
inline bool can_print_log(WeexCore::LogLevel l) {
if (m_log)
return m_log->shouldPrint(l);
return false;
}
bool log(WeexCore::LogLevel level,
const char *tag,
const char *file,
unsigned long line,
const char *log) {
if (m_log == nullptr) {
return false;
}
if (file == nullptr
|| log == nullptr) {
return true;
}
if (!m_log->shouldPrint(level)) {
return true;
}
return m_log->log(level, tag, file, line, log);
}
private:
weex::base::LogBase *m_log;
static LogImplement *g_instance;
LogImplement() : m_log(nullptr) {}
};
}
}
#if defined(LOGE)
#undef LOGE
#endif
#if defined(LOGW)
#undef LOGW
#endif
#if defined(LOGI)
#undef LOGI
#endif
#if defined(LOGD)
#undef LOGD
#endif
#if defined(LOGV)
#undef LOGV
#endif
#define WEEX_CORE_LOG_TAG "WeexCore"
#define WEEX_CORE_FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
#define WEEX_CORE_LOG(level, TAG, format, ...) \
do{ \
if(weex::base::LogImplement::getLog()->can_print_log((level))) \
WeexCore::PrintLog((level), TAG, WEEX_CORE_FILENAME, __LINE__, (format), ##__VA_ARGS__);\
}while(0);\
#define LOGE_TAG(TAG, format, ...) WEEX_CORE_LOG(WeexCore::LogLevel::Error, TAG, format, ##__VA_ARGS__)
#define LOGE(format, ...) LOGE_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
#define LOGW_TAG(TAG, format, ...) WEEX_CORE_LOG(WeexCore::LogLevel::Warn, TAG, format, ##__VA_ARGS__)
#define LOGW(format, ...) LOGW_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
#define LOGI_TAG(TAG, format, ...) WEEX_CORE_LOG(WeexCore::LogLevel::Info, TAG, format, ##__VA_ARGS__)
#define LOGI(format, ...) LOGI_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
#define LOG_Performance(INSTANCE_ID, format, ...) WEEX_CORE_LOG(WeexCore::LogLevel::Performance, INSTANCE_ID, format, ##__VA_ARGS__)
#define LOG_TLOG(TAG, format, ...) WEEX_CORE_LOG(WeexCore::LogLevel::Tlog, TAG, format, ##__VA_ARGS__)
#ifdef __ANDROID__
#define LOGE_FOR_DEBUG(TAG, format, ...) __android_log_print(ANDROID_LOG_ERROR,TAG,format,##__VA_ARGS__)
#endif
#ifdef DEBUG
#define LOGD_TAG(TAG, format, ...) WEEX_CORE_LOG(WeexCore::LogLevel::Debug, TAG, format, ##__VA_ARGS__)
#define LOGD(format, ...) LOGD_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
#else
#define LOGD_TAG(TAG, format, ...) ((void) 0)
#define LOGD(format, ...) ((void) 0)
#endif
#define LOGV LOGD
#define LOGV_TAG LOGD_TAG
#define LOG_LINE ((void) 0)
#ifndef DISALLOW_COPY_AND_ASSIGN
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&) = delete; \
void operator=(const TypeName&) = delete
#endif
#endif /* LogDefines_h */