You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OJproject/src/my-online-judge-master/MYOJ/comm/Log.hpp

133 lines
3.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include <string>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdarg.h>
enum PrintMethods
{
Screen = 1,
Onefile,
Classfile
};
enum LogLevel
{
Info = 0,
Debug,
Warning,
Error,
Fatal
};
std::string defaultPath = "./Log/";
class Log
{
public:
// 初始化日志默认向屏幕上输出输出文件路径默认设置为当前路径下Log.txt文件
Log(const int printMethod = Screen, const std::string &path = defaultPath)
: _path(path), _printMethod(printMethod)
{
}
// 改变日志的输出方式
void Enable(int newMethod)
{
_printMethod = newMethod;
}
std::string LevelToString(int level)
{
switch (level)
{
case Info:
return "Info";
break;
case Debug:
return "Debug";
break;
case Warning:
return "Warning";
break;
case Error:
return "Error";
break;
case Fatal:
return "Fatal";
break;
default:
return "None";
break;
}
}
void PrintLog(const std::string &LogMessage, int level)
{
switch (_printMethod)
{
case Screen:
printf("%s", LogMessage.c_str());
break;
case Onefile:
printOnefile("log.txt", LogMessage);
break;
case Classfile:
printClassFile(LogMessage, level);
break;
default:
break;
}
}
void printOnefile(const std::string &logName, const std::string &LogMessage)
{
std::string fileName = _path;
fileName += logName;
int fd = open(fileName.c_str(), O_APPEND | O_WRONLY | O_CREAT, 0666);
if (fd < 0)
{
perror("printOnefile open");
return;
}
write(fd, LogMessage.c_str(), LogMessage.size());
close(fd);
}
void printClassFile(const std::string &LogMessage, int level)
{
std::string fileName = "log.txt.";
fileName += LevelToString(level);
printOnefile(fileName, LogMessage);
}
void operator()(int level, const char *format, ...)
{
time_t t;
time(&t);
struct tm *p;
p = localtime(&t);
char leftBuffer[1024];
snprintf(leftBuffer, sizeof(leftBuffer) - 1, "[%s][%d-%d-%d %d:%d:%d]", LevelToString(level).c_str(),
p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
char rightBuffer[1024];
va_list ap;
va_start(ap, format);
vsnprintf(rightBuffer, sizeof(rightBuffer) - 1, format, ap);
std::string LogMessage(leftBuffer);
LogMessage += " ";
LogMessage += rightBuffer;
PrintLog(LogMessage, level);
}
private:
std::string _path;
int _printMethod;
};
Log lg;