ZCLibLog
载入中...
搜索中...
未找到
csnprintf.hpp
浏览该文件的文档.
1// Copyright 2026 CZF-H
2// Licensed under the Apache License, Version 2.0
3
4//
5// Created by wanjiangzhi on 2026/3/30.
6//
7
8#ifndef ZCLIBLOG_FORMATTERS_CSNPRINTF_HPP
9#define ZCLIBLOG_FORMATTERS_CSNPRINTF_HPP
10
11#include "basic_formatter.hpp"
13#include <ctime>
14#include <cstdio>
15#include <array>
16
17// NOLINTNEXTLINE
18namespace ZCLibLog {
19 namespace formatters {
26 template<typename... Args>
27 static std::string do_format(FLogPack pack, const char* fmt, Args&&... args) {
28 thread_local std::array<char, 4096> buffer;
29 int len{};
30
31 std::string f_msg;
32 if (sizeof...(args) == 0) {
33 f_msg = fmt;
34 }
35 else {
36 len = std::snprintf(buffer.data(), buffer.size(), fmt, std::forward<Args>(args)...);
37 if (len < 0) return {};
38 if (len >= static_cast<int>(buffer.size())) len = buffer.size() - 1;
39 f_msg = std::string(buffer.data(), len);
40 }
41 auto t = static_cast<std::time_t>(pack.time / 1000);
42 const auto ms = static_cast<short>(pack.time % 1000);
43 std::tm tm{};
44
45 #if defined(_WIN32)
46 localtime_s(&tm, &t);
47 #elif defined(__linux__) || defined(__APPLE__) || defined(__unix__)
48 localtime_r(&t, &tm);
49 #else
50 tm = *std::localtime(&t);
51 #endif
52
53 thread_local std::array<char, 64> time;
54 std::strftime(time.data(), time.size(), "%Y-%m-%d %H:%M:%S", &tm);
55 thread_local std::array<char, 80> ms_time;
56 std::snprintf(ms_time.data(), ms_time.size(), "%s.%03d", time.data(), ms);
57
58 auto log_level = "OUT"; // fallback
59 switch (pack.level) {
60 case LogLevel::TRACE: log_level = "TRACE"; break;
61 case LogLevel::DEBUG: log_level = "DEBUG"; break;
62 case LogLevel::INFO: log_level = "INFO"; break;
63 case LogLevel::WARN: log_level = "WARN"; break;
64 case LogLevel::ERROR: log_level = "ERROR"; break;
65 case LogLevel::FATAL: log_level = "FATAL"; break;
66
67 default: break;
68 }
69
70 len = std::snprintf(buffer.data(), buffer.size(), "%s [%s] [%s] %s", ms_time.data(), pack.name->c_str(), log_level, f_msg.c_str());
71 if (len < 0) return {};
72 if (len >= static_cast<int>(buffer.size())) len = buffer.size() - 1;
73 return {buffer.data(), buffer.data() + len};
74 }
75 };
76 }
77}
78
79#endif //ZCLIBLOG_FORMATTERS_CSNPRINTF_HPP
ZCLibLog的命名空间
Definition android_log.hpp:16
FLogPack FLogPack
简化写法
Definition logger_types.hpp:217
传统格式化API
Definition traditional.hpp:20
基于C语言"snprintf"的格式化接口
Definition csnprintf.hpp:25
static std::string do_format(FLogPack pack, const char *fmt, Args &&... args)
Definition csnprintf.hpp:27