1a69a01cdSopenharmony_ci/* 2a69a01cdSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3a69a01cdSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4a69a01cdSopenharmony_ci * you may not use this file except in compliance with the License. 5a69a01cdSopenharmony_ci * You may obtain a copy of the License at 6a69a01cdSopenharmony_ci * 7a69a01cdSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8a69a01cdSopenharmony_ci * 9a69a01cdSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10a69a01cdSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11a69a01cdSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12a69a01cdSopenharmony_ci * See the License for the specific language governing permissions and 13a69a01cdSopenharmony_ci * limitations under the License. 14a69a01cdSopenharmony_ci */ 15a69a01cdSopenharmony_ci#ifndef TEST_WUKONG_WUKONG_LOGGER_H 16a69a01cdSopenharmony_ci#define TEST_WUKONG_WUKONG_LOGGER_H 17a69a01cdSopenharmony_ci 18a69a01cdSopenharmony_ci#include <condition_variable> 19a69a01cdSopenharmony_ci#include <mutex> 20a69a01cdSopenharmony_ci#include <queue> 21a69a01cdSopenharmony_ci#include <stdio.h> 22a69a01cdSopenharmony_ci#include <string> 23a69a01cdSopenharmony_ci#include <thread> 24a69a01cdSopenharmony_ci 25a69a01cdSopenharmony_ci#include "singleton.h" 26a69a01cdSopenharmony_ci#include "thread_ex.h" 27a69a01cdSopenharmony_ci 28a69a01cdSopenharmony_cinamespace OHOS { 29a69a01cdSopenharmony_cinamespace WuKong { 30a69a01cdSopenharmony_cienum LOG_LEVEL { 31a69a01cdSopenharmony_ci LOG_LEVEL_TRACK = 0, 32a69a01cdSopenharmony_ci LOG_LEVEL_DEBUG, 33a69a01cdSopenharmony_ci LOG_LEVEL_INFO, 34a69a01cdSopenharmony_ci LOG_LEVEL_WARN, 35a69a01cdSopenharmony_ci LOG_LEVEL_ERROR, 36a69a01cdSopenharmony_ci}; 37a69a01cdSopenharmony_ci 38a69a01cdSopenharmony_cienum WK_LOG_OUTPUT_TYPE { 39a69a01cdSopenharmony_ci STD_OUTPUT = 0x0001, 40a69a01cdSopenharmony_ci FILE_OUTPUT = 0x0002, 41a69a01cdSopenharmony_ci HILOG_OUTPUT = 0x0004, 42a69a01cdSopenharmony_ci}; 43a69a01cdSopenharmony_ci 44a69a01cdSopenharmony_ciclass WuKongLogger : public DelayedSingleton<WuKongLogger> { 45a69a01cdSopenharmony_cipublic: 46a69a01cdSopenharmony_ci /** 47a69a01cdSopenharmony_ci * @brief logger start 48a69a01cdSopenharmony_ci */ 49a69a01cdSopenharmony_ci void SetLevel(LOG_LEVEL level) 50a69a01cdSopenharmony_ci { 51a69a01cdSopenharmony_ci outputLevel_ = level; 52a69a01cdSopenharmony_ci } 53a69a01cdSopenharmony_ci /** 54a69a01cdSopenharmony_ci * @brief logger start 55a69a01cdSopenharmony_ci */ 56a69a01cdSopenharmony_ci bool Start(); 57a69a01cdSopenharmony_ci /** 58a69a01cdSopenharmony_ci * @brief logger stop 59a69a01cdSopenharmony_ci */ 60a69a01cdSopenharmony_ci void Stop(); 61a69a01cdSopenharmony_ci /** 62a69a01cdSopenharmony_ci * @brief print log 63a69a01cdSopenharmony_ci * @param level logger level 64a69a01cdSopenharmony_ci * @param format log string format 65a69a01cdSopenharmony_ci */ 66a69a01cdSopenharmony_ci void Print(LOG_LEVEL level, const char *format, ...); 67a69a01cdSopenharmony_ci 68a69a01cdSopenharmony_ci static std::shared_ptr<WuKongLogger> GetInstance(); 69a69a01cdSopenharmony_ci LOG_LEVEL GetLogLevel() 70a69a01cdSopenharmony_ci { 71a69a01cdSopenharmony_ci return outputLevel_; 72a69a01cdSopenharmony_ci } 73a69a01cdSopenharmony_ci 74a69a01cdSopenharmony_ci DECLARE_DELAYED_SINGLETON(WuKongLogger); 75a69a01cdSopenharmony_ci 76a69a01cdSopenharmony_ciprivate: 77a69a01cdSopenharmony_ci class PrinterThread : public OHOS::Thread { 78a69a01cdSopenharmony_ci /** 79a69a01cdSopenharmony_ci * @brief read queue and print log to file 80a69a01cdSopenharmony_ci */ 81a69a01cdSopenharmony_ci bool Run() override; 82a69a01cdSopenharmony_ci }; 83a69a01cdSopenharmony_ci 84a69a01cdSopenharmony_ci class LogInfo { 85a69a01cdSopenharmony_ci public: 86a69a01cdSopenharmony_ci std::string logStr_; 87a69a01cdSopenharmony_ci LOG_LEVEL level_; 88a69a01cdSopenharmony_ci }; 89a69a01cdSopenharmony_ci 90a69a01cdSopenharmony_ci // current logger level 91a69a01cdSopenharmony_ci LOG_LEVEL outputLevel_ = LOG_LEVEL_INFO; 92a69a01cdSopenharmony_ci 93a69a01cdSopenharmony_ci // current output setting 94a69a01cdSopenharmony_ci uint32_t outputType_ = STD_OUTPUT | FILE_OUTPUT | HILOG_OUTPUT; 95a69a01cdSopenharmony_ci 96a69a01cdSopenharmony_ci // current process disk filename 97a69a01cdSopenharmony_ci std::string logFileName_ = ""; 98a69a01cdSopenharmony_ci 99a69a01cdSopenharmony_ci // Queue lock 100a69a01cdSopenharmony_ci std::mutex mtxQueue_; 101a69a01cdSopenharmony_ci std::queue<LogInfo> bufferQueue_; 102a69a01cdSopenharmony_ci 103a69a01cdSopenharmony_ci // log printer thread. 104a69a01cdSopenharmony_ci bool printerRunning_ = false; 105a69a01cdSopenharmony_ci PrinterThread logPrinter_; 106a69a01cdSopenharmony_ci std::mutex mtxThreadWait_; 107a69a01cdSopenharmony_ci std::condition_variable cvWaitPrint_; 108a69a01cdSopenharmony_ci static std::mutex wukongMutex_; 109a69a01cdSopenharmony_ci static std::shared_ptr<WuKongLogger> wukongInstance_; 110a69a01cdSopenharmony_ci}; 111a69a01cdSopenharmony_ci} // namespace WuKong 112a69a01cdSopenharmony_ci} // namespace OHOS 113a69a01cdSopenharmony_ci 114a69a01cdSopenharmony_ci#endif // TEST_WUKONG_WUKONG_LOGGER_H 115