ZCLibLog
载入中...
搜索中...
未找到
logger_base.hpp
浏览该文件的文档.
1// Copyright 2026 CZF-H
2// Licensed under the Apache License, Version 2.0
3
4//
5// Created by wanjiangzhi on 2026/4/10.
6//
7
8#ifndef ZCLIBLOG_LOGGER_BASE_HPP
9#define ZCLIBLOG_LOGGER_BASE_HPP
10
11#include "inside/logger_precompile.hpp" // NOLINT
12
13#include <algorithm>
14#include <stdexcept>
15#include <vector>
16
17// ReSharper disable CppUnusedIncludeDirective
18
20
22
24#if ZCLIBLOG_LOGGER_CONFIGURATIONS_DEFAULT_CSNPRINTF
26#endif
27
28// ReSharper enable CppUnusedIncludeDirective
29
30#if ZCLIBLOG_LOGGER_CONFIGURATIONS_LOGGER_MUTEX
31#ifndef ZCLibLog_MUTEX
32#if ZCLibLog_CPP >= 17
33#include <shared_mutex>
34#define ZCLibLog_MUTEX std::shared_mutex
35#else
36#define ZCLibLog_MUTEX std::mutex
37#endif
38#endif
39#endif
40
41namespace ZCLibLog {
47 template <
48 typename Formatter
49 #if ZCLIBLOG_LOGGER_CONFIGURATIONS_DEFAULT_CSNPRINTF
50 = formatters::csnprintf
51 #endif
52 >
53 class BaseLogger {
54 using Self = BaseLogger;
55 // ReSharper disable CppUseTypeTraitAlias
57 "Formatter must be format_api");
58 // ReSharper enable CppUseTypeTraitAlias
59 protected:
60 #if ZCLIBLOG_LOGGER_CONFIGURATIONS_LOGGER_MUTEX
61 mutable ZCLibLog_MUTEX m_mutex;
62 #endif
63
64 using executor_pair = std::pair<size_t, executor>;
65
66 std::string m_name;
67 std::vector<executor_pair> m_executors;
68 size_t m_nextID{};
69
71 public:
72 using m_formatter = Formatter;
73
75 ZCLibLog_NODISCARD const std::string& name() const noexcept {
76 return m_name;
77 }
78
81 return m_config;
82 }
83
89 ZCLibLog_NODISCARD bool be_executable(const LogLevel level) const noexcept {
90 return m_config.min_level <= level && level <= m_config.max_level;
91 }
92
95 #if ZCLIBLOG_LOGGER_CONFIGURATIONS_LOGGER_MUTEX
96 std::lock_guard<ZCLibLog_MUTEX> lock(m_mutex);
97 #endif
98 return !m_executors.empty();
99 }
100
106 size_t bind_executor(const executor& ex) {
107 if (!ex) throw std::invalid_argument("executor is nullptr");
108 #if ZCLIBLOG_LOGGER_CONFIGURATIONS_LOGGER_MUTEX
109 std::lock_guard<ZCLibLog_MUTEX> lock(m_mutex);
110 #endif
111 m_executors.emplace_back(m_nextID, ex);
112 return m_nextID++;
113 }
114
119 void debind_executor(size_t id) {
120 #if ZCLIBLOG_LOGGER_CONFIGURATIONS_LOGGER_MUTEX
121 std::lock_guard<ZCLibLog_MUTEX> lock(m_mutex);
122 #endif
123 m_executors.erase(
124 std::remove_if(
125 m_executors.begin(),
126 m_executors.end(),
127 [id](const executor_pair& p) { return p.first == id; }
128 ),
129 m_executors.end()
130 );
131 }
132
135 #if ZCLIBLOG_LOGGER_CONFIGURATIONS_LOGGER_MUTEX
136 std::lock_guard<ZCLibLog_MUTEX> lock(m_mutex);
137 #endif
138 m_executors.clear();
139 m_nextID = {};
140 }
141
142 // ReSharper disable once CppNonExplicitConvertingConstructor
150 std::string name,
151 const std::initializer_list<executor>& executor_ptrs = {},
152 const LogLevelCfg config = {}
153 ) : m_name(std::move(name)),
155 for (const auto& executor_ptr : executor_ptrs) {
156 bind_executor(executor_ptr);
157 }
158 }
159 };
160
161}
162
163#endif //ZCLIBLOG_LOGGER_BASE_HPP
基本日志器,无执行
Definition logger_base.hpp:53
LogLevelCfg m_config
Definition logger_base.hpp:70
ZCLibLog_NODISCARD bool be_executable(const LogLevel level) const noexcept
检查等级是否可执行
Definition logger_base.hpp:89
ZCLibLog_NODISCARD LogLevelCfg & config() noexcept
获取并可修改日志器的等级配置
Definition logger_base.hpp:80
void clear_executors()
清空所有执行器
Definition logger_base.hpp:134
std::pair< size_t, executor > executor_pair
Definition logger_base.hpp:64
BaseLogger(std::string name, const std::initializer_list< executor > &executor_ptrs={}, const LogLevelCfg config={})
构造同步日志器
Definition logger_base.hpp:149
Formatter m_formatter
Definition logger_base.hpp:72
size_t bind_executor(const executor &ex)
绑定执行器
Definition logger_base.hpp:106
void debind_executor(size_t id)
解绑执行器
Definition logger_base.hpp:119
ZCLibLog_NODISCARD bool has_executor() const
判断是否有执行器
Definition logger_base.hpp:94
std::vector< executor_pair > m_executors
Definition logger_base.hpp:67
ZCLibLog_NODISCARD const std::string & name() const noexcept
获取日志器的名字
Definition logger_base.hpp:75
size_t m_nextID
Definition logger_base.hpp:68
std::string m_name
Definition logger_base.hpp:66
执行器包装类
Definition logger_types.hpp:133
#define ZCLibLog_NODISCARD
Definition logger_macros.h:50
ZCLibLog的命名空间
Definition android_log.hpp:16
LogLevel
一些日志等级
Definition logger_types.hpp:35
Log等级范围
Definition logger_types.hpp:74
LogLevel max_level
配置的最高等级
Definition logger_types.hpp:78
LogLevel min_level
配置的最低等级
Definition logger_types.hpp:76
判断是否是是基于format api的formatter
Definition logger_types.hpp:252