spdlog同时输出到控制台和文件中,可设置文件大小及数目,define方式

因为自己想要个题目那种效果的,又没找到很符合的博客,就整合了下大佬们的博客封了个,具体的内容都放到代码注释里了,我这个目前在windows下只能将log文件创建到exe所处的目录中,暂时仍未解决该问题,欢迎大佬指正(已解决,直接将文件名设置为带路径的即可)

#ifndef __MY_LOG__
#define __MY_LOG__

#include <iostream>
#include <string>
#include <sstream>
#include <sys/stat.h>
#include <sys/types.h>


#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/logger.h"

#include "spdlog/sinks/stdout_sinks.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/common.h"
#include "spdlog/sinks/rotating_file_sink.h"


using namespace spdlog;


#define LOG_TRACE(...)       SPDLOG::getInstance().logger().get()->trace(__VA_ARGS__)
#define LOG_DEBUG(...)       SPDLOG::getInstance().logger().get()->debug(__VA_ARGS__)
#define LOG_INFO(...)        SPDLOG::getInstance().logger().get()->info(__VA_ARGS__)
#define LOG_WARN(...)        SPDLOG::getInstance().logger().get()->warn(__VA_ARGS__)
#define LOG_ERROR(...)       SPDLOG::getInstance().logger().get()->error(__VA_ARGS__)
#define LOG_CRITICAL(...)    SPDLOG::getInstance().logger().get()->critical(__VA_ARGS__)

// spdlog打印信息格式
/*

LOG_WARN("Easy padding in numbers like {:08d}", 12);
//  [2021-04-07 23:49:24.916] [warning] Easy padding in numbers like 00000012

LOG_CRITICAL("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);
//  [2021-04-07 23:49:24.916] [critical] Support for int: 42;  hex: 2a;  oct: 52; bin: 101010

LOG_INFO("Support for floats {1:06.4f}", 1.23456, 9.8754321);
//  [2021-04-07 23:49:24.916] [info] Support for floats 9.8754    

LOG_INFO("Positional args are {1} {0}..", "too", "supported");
//  [2021-04-07 23:49:24.916] [info] Positional args are supported too..

LOG_INFO("{:>8} aligned, {:<8} aligned", "right", "left");
//  [2021-04-07 23:49:24.916] [info]    right aligned, left     aligned

*/


/*
使用时先执行init方法,参数
std::string logger_name                  :生成日志文件的名称,默认为log
std::size_t max_size                      :单个日志文件的大小,默认为10mb
std::size_t max_files                     :最大日志数目,默认为10
*/
class SPDLOG
{
private:
	SPDLOG() = default;
	std::shared_ptr<spdlog::logger> logger_ptr_;

public:
	static SPDLOG& getInstance()
	{
		static SPDLOG instance;
		return instance;
	}
	void inline init(std::string logger_name = "log", std::size_t max_size = 1024*1024*10, std::size_t max_files = 10);
	std::shared_ptr<spdlog::logger> logger() { return logger_ptr_; }
};


void inline SPDLOG::init(std::string logger_name, std::size_t max_size, std::size_t max_files)
{
	try {

		/* 通过multi-sink的方式创建复合logger,实现方式为:先分别创建文件sink和控制台sink,并将两者放入sink 向量中,组成一个复合logger */

		/* file sink */
		auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logger_name, max_size, max_files);
		file_sink->set_level(spdlog::level::trace);
		file_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [%t] %v");

		/* 控制台sink */
		auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
		console_sink->set_level(spdlog::level::trace);
		console_sink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [%t] %v");

		/* Sink组合 */
		std::vector<spdlog::sink_ptr> sinks;
		sinks.push_back(console_sink);
		sinks.push_back(file_sink);
		logger_ptr_ = std::make_shared<spdlog::logger>("multi-sink", begin(sinks), end(sinks));

		std::cout << "SPDLOG: create spdlog success!" << std::endl;
	}
	catch (const spdlog::spdlog_ex& ex) {
		perror("spdlog init error.");
	}
}

#endif


### 回答1: 处理大型文件时,我们需要注意内的使用,因为将整个文件读入内可能会导致内溢出。因此,我们需要采用逐行读取的方式来处理大型文件。 以下是一个简单的代码示例,演示如何使用C++逐行读取40G的txt文件,并将数据进行升序排序,最后将结果输出到指定txt文件。 ```c++ #include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { string input_file = "input.txt"; string output_file = "output.txt"; ifstream input_stream(input_file); ofstream output_stream(output_file); if (!input_stream) { cout << "Failed to open input file!" << endl; return 1; } if (!output_stream) { cout << "Failed to open output file!" << endl; return 1; } vector<int> data; string line; while (getline(input_stream, line)) { int num = stoi(line); data.push_back(num); } input_stream.close(); sort(data.begin(), data.end()); for (int i = 0; i < data.size(); i++) { output_stream << data[i] << endl; } output_stream.close(); return 0; } ``` 在此示例,我们首先打开输入和输出文件的流。然后,我们使用 `getline` 函数逐行读取输入文件,并将每一行转换为整数储在一个 `vector` 。我们使用 `sort` 函数对 `vector` 的数据进行升序排序。最后,我们逐行将排序后的数据写入输出文件,并关闭输入和输出流。 这样,我们就可以使用上述代码来处理大小为40G的txt文件,并将排序后的结果输出到指定的txt文件。请注意,由于文件较大,处理时间可能会比较长。 ### 回答2: 使用C语言读取大小为40G的txt文件并进行升序排序,并输出到指定txt文件,可以分为以下步骤: 1. 打开源文件和目标文件 使用C语言文件操作函数,如fopen函数,来打开源文件和目标文件。其,源文件用于读取数据,目标文件用于保排序后的数据。 2. 分批读取源文件数据 由于文件较大,无法一次性读取。因此,可以采取分批读取的方式,逐行或逐块读取源文件的数据。 3. 将数据储到内 创建一个数据结构(如数组、链表等)来储读取的数据,以便进行排序操作。根据数据量大小和计算机性能,可以选择合适的数据结构。 4. 对数据进行排序 使用常见的排序算法(如快速排序、归并排序、堆排序等)对内的数据进行升序排序。 5. 将排序后的数据写入目标文件 将排序后的数据逐行或逐块写入目标文件,使用C语言文件操作函数,如fwrite函数。 6. 关闭文件 在程序完成后,应及时关闭打开的文件,使用C语言的fclose函数。 需要注意的是,由于40G的文件较大,处理时间可能较长,因此可能需要考虑到处理的效率和性能优化的问题。可以使用多线程或其他技术手段进行优化。另外,为了保证程序的稳定性和可靠性,还需考虑内的管理和错误处理的情况。 ### 回答3: 要使用C语言读取和处理40GB大小的txt文件并进行排序,涉及到大量的内管理和文件操作。下面是一个简单的示例代码,可以帮助你完成这个任务。 ```c #include<stdio.h> #include<stdlib.h> #define BUFFER_SIZE 1000000 // 比较函数,用于qsort函数排序时的比较 int compare(const void *a, const void *b) { return (*(int *)a - *(int *)b); } int main() { FILE *inputFile, *outputFile; char inputFileName[] = "input.txt"; // 输入文件名 char outputFileName[] = "output.txt"; // 输出文件名 // 打开输入文件 inputFile = fopen(inputFileName, "r"); if (inputFile == NULL) { printf("无法打开输入文件。\n"); return 1; } // 打开输出文件 outputFile = fopen(outputFileName, "w"); if (outputFile == NULL) { printf("无法打开输出文件。\n"); fclose(inputFile); return 1; } // 读取输入文件的数据到内,并进行排序 int *data = malloc(BUFFER_SIZE * sizeof(int)); int i, count = 0; while (fscanf(inputFile, "%d", &data[count]) != EOF) { count++; if (count == BUFFER_SIZE) { // 当内的数据达到缓冲区的上限时,进行排序 qsort(data, count, sizeof(int), compare); // 将排序后的数据写入输出文件 for (i = 0; i < count; i++) { fprintf(outputFile, "%d ", data[i]); } count = 0; // 重置计数器,准备下一批数据 } } // 对剩余的数据进行排序并写入输出文件 qsort(data, count, sizeof(int), compare); for (i = 0; i < count; i++) { fprintf(outputFile, "%d ", data[i]); } // 释放内和关闭文件 free(data); fclose(inputFile); fclose(outputFile); printf("文件排序和输出完成。\n"); return 0; } ``` 这个代码使用缓冲区的方式读取输入文件,每当缓冲区满了之后,将缓冲区的数据进行排序,然后写入输出文件。最终会将所有的数据进行升序排序,并输出到指定的txt文件。 请注意,这只是一个简单的示例代码,并没有对错误处理做完整的处理,也没有考虑文件何时结束等情况。在实际应用,你可能还需要添加错误处理和其他功能来适应具体的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值