OCCT中的日志

OCCT包含基本的日志系统,在OCCT项目中可以优先使用这个。

使用OCCT的日志系统非常简单,首先需要配置,然后直接输出日志即可,核心方法集中在Message这个类中。

日志器设置

通过以下代码可以获取全局的日志器:

1
static const occ::handle<Message_Messenger>& DefaultMessenger()

获取日志器后,可以为其设置日志打印机(既把日志输出到什么位置):

1
2
3
4
5
// 增删打印器
bool AddPrinter(const occ::handle<Message_Printer>& thePrinter);
bool RemovePrinter(const occ::handle<Message_Printer>& thePrinter);
// 更加通用的打印机修改方法:获取内部打印机双向链表
NCollection_Sequence<occ::handle<Message_Printer>>& ChangePrinters();

小例子:

1
2
Message::DefaultMessenger()->ChangePrinters().Clear();
Message::DefaultMessenger()->AddPrinter(printer);

输出日志

Message中有以下静态接口可以输出日志,本质是调用Message_Messager类的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 以下这种方式可以用<<符号来输出日志
static Message_Messenger::StreamBuffer SendFail();
static Message_Messenger::StreamBuffer SendAlarm();
static Message_Messenger::StreamBuffer SendWarning();
static Message_Messenger::StreamBuffer SendInfo();
static Message_Messenger::StreamBuffer SendTrace();

// 以下是普通的方法
static void SendFail(const TCollection_AsciiString& theMessage);
static void SendAlarm(const TCollection_AsciiString& theMessage);
static void SendWarning(const TCollection_AsciiString& theMessage);
static void SendInfo(const TCollection_AsciiString& theMessage);
static void SendTrace(const TCollection_AsciiString& theMessage);

适当封装,可以打印出时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#pragma once

#include <Message_PrinterOStream.hxx>
#include <Message.hxx>
#include <TCollection_AsciiString.hxx>
#include <string>

class Message_PrinterWithTimestamp : public Message_PrinterOStream {
public:
Message_PrinterWithTimestamp(const char* const theFileName,
const bool theDoAppend,
const Message_Gravity theTraceLevel = Message_Info);
protected:
void send(const TCollection_AsciiString& theString,
const Message_Gravity theGravity) const override;
};

class Logger {
public:
Logger() = delete;
static void init(const char* fileName, bool doAppend, Message_Gravity traceLevel);
static void Trace(const std::string& message, const char* file, int line, bool includeLocation = false);
static void Info(const std::string& message, const char* file, int line, bool includeLocation = false);
static void Warning(const std::string& message, const char* file, int line, bool includeLocation = false);
static void Alarm(const std::string& message, const char* file, int line, bool includeLocation = false);
static void Fail(const std::string& message, const char* file, int line, bool includeLocation = false);
};

#define LOG_TRACE(msg) Logger::Trace((msg), __FILE__, __LINE__)
#define LOG_INFO(msg) Logger::Info((msg), __FILE__, __LINE__)
#define LOG_WARNING(msg) Logger::Warning((msg), __FILE__, __LINE__)
#define LOG_ALARM(msg) Logger::Alarm((msg), __FILE__, __LINE__)
#define LOG_FAIL(msg) Logger::Fail((msg), __FILE__, __LINE__)

#define LOG_TRACE_LOC(msg) Logger::Trace((msg), __FILE__, __LINE__, true)
#define LOG_INFO_LOC(msg) Logger::Info((msg), __FILE__, __LINE__, true)
#define LOG_WARNING_LOC(msg) Logger::Warning((msg), __FILE__, __LINE__, true)
#define LOG_ALARM_LOC(msg) Logger::Alarm((msg), __FILE__, __LINE__, true)
#define LOG_FAIL_LOC(msg) Logger::Fail((msg), __FILE__, __LINE__, true)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "logger.h"
#include <ctime>

Message_PrinterWithTimestamp::Message_PrinterWithTimestamp(
const char* const theFileName,
const bool theDoAppend,
const Message_Gravity theTraceLevel)
: Message_PrinterOStream(theFileName, theDoAppend, theTraceLevel) {}

void Message_PrinterWithTimestamp::send(
const TCollection_AsciiString& theString,
const Message_Gravity theGravity) const {
char timeBuf[64];
const std::time_t now = std::time(nullptr);
struct tm localNow;
localtime_s(&localNow, &now);
std::strftime(timeBuf, sizeof(timeBuf), "[%Y-%m-%d %H:%M:%S] ", &localNow);
TCollection_AsciiString prefixed(timeBuf);
prefixed += theString;
Message_PrinterOStream::send(prefixed, theGravity);
}

void Logger::init(const char* fileName, bool doAppend, Message_Gravity traceLevel) {
Handle(Message_PrinterOStream) printer =
new Message_PrinterWithTimestamp(fileName, doAppend, traceLevel);
Message::DefaultMessenger()->ChangePrinters().Clear();
Message::DefaultMessenger()->AddPrinter(printer);
}

void Logger::Trace(const std::string& message, const char* file, int line, bool includeLocation) {
TCollection_AsciiString formatted;
if (includeLocation && file) {
formatted += TCollection_AsciiString("[");
formatted += file;
formatted += ":";
formatted += TCollection_AsciiString(line);
formatted += "] ";
}
formatted += message.c_str();
Message::SendTrace() << formatted.ToCString();
}

void Logger::Info(const std::string& message, const char* file, int line, bool includeLocation) {
TCollection_AsciiString formatted;
if (includeLocation && file) {
formatted += TCollection_AsciiString("[");
formatted += file;
formatted += ":";
formatted += TCollection_AsciiString(line);
formatted += "] ";
}
formatted += message.c_str();
Message::SendInfo() << formatted.ToCString();
}

void Logger::Warning(const std::string& message, const char* file, int line, bool includeLocation) {
TCollection_AsciiString formatted;
if (includeLocation && file) {
formatted += TCollection_AsciiString("[");
formatted += file;
formatted += ":";
formatted += TCollection_AsciiString(line);
formatted += "] ";
}
formatted += message.c_str();
Message::SendWarning() << formatted.ToCString();
}

void Logger::Alarm(const std::string& message, const char* file, int line, bool includeLocation) {
TCollection_AsciiString formatted;
if (includeLocation && file) {
formatted += TCollection_AsciiString("[");
formatted += file;
formatted += ":";
formatted += TCollection_AsciiString(line);
formatted += "] ";
}
formatted += message.c_str();
Message::SendAlarm() << formatted.ToCString();
}

void Logger::Fail(const std::string& message, const char* file, int line, bool includeLocation) {
TCollection_AsciiString formatted;
if (includeLocation && file) {
formatted += TCollection_AsciiString("[");
formatted += file;
formatted += ":";
formatted += TCollection_AsciiString(line);
formatted += "] ";
}
formatted += message.c_str();
Message::SendFail() << formatted.ToCString();
}

(转载本站文章请注明作者和出处lihaohello.top,请勿用于任何商业用途)