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