njin
Engine 2D gọn nhẹ để tự tay làm game theo ý mình. Vibe coding cũng ổn luôn
Loading...
Searching...
No Matches
Ghi log

njin có logger riêng, dùng qua các macro NJIN_* có định dạng như printf:

NJIN_INFO("người chơi xuất hiện tại %.1f, %.1f", pos.x, pos.y);
NJIN_WARN("texture thiếu: %s", path);
NJIN_ERROR("mã lỗi %d", code);
#define NJIN_INFO(...)
Ghi log mức info. Tham số giống printf.
Definition njin_log.h:98
#define NJIN_WARN(...)
Ghi log mức warn. Tham số giống printf.
Definition njin_log.h:100
#define NJIN_ERROR(...)
Ghi log mức error. Tham số giống printf.
Definition njin_log.h:102

Mỗi dòng in ra dạng:

[ 1.234] WARN file.cpp:42 texture thiếu: assets/player.png

gồm thời gian (giây), mức độ, file và dòng gọi, nội dung. Log của backend cửa sổ/âm thanh cũng đi qua logger này, gắn nhãn njin như log của chính engine: njin che nó khỏi code của game (xem Kiến trúc), nên log cũng không nêu tên nó.

Mức độ

Từ chi tiết nhất đến nghiêm trọng nhất (njin::log_level):

Macro Mức Dùng khi
NJIN_TRACE njin::log_trace Lần theo lỗi chi tiết
NJIN_DEBUG njin::log_debug Thông tin gỡ lỗi
NJIN_INFO njin::log_info Sự kiện bình thường
NJIN_WARN njin::log_warn Có vấn đề nhưng vẫn chạy tiếp
NJIN_ERROR njin::log_error Một thao tác thất bại
NJIN_FATAL njin::log_fatal Không thể tiếp tục. Dừng chương trình

Lọc và đổi nơi nhận

  • njin::log_set_level() bỏ qua mọi dòng thấp hơn một mức. Mặc định là log_debug ở bản debug và log_info khi định nghĩa NDEBUG.
  • njin::log_set_sink() thay nơi nhận log (mặc định là stderr), ví dụ để ghi ra file.
  • Khi njin_inspector đang kết nối vào game (xem Công cụ debug: njin_inspector), log hiện ở inspector thay vì stderr. Chưa có inspector thì log ra stderr như bình thường. Nơi nhận do game đặt bằng njin::log_set_sink() vẫn nhận log như cũ.
#include <njin.h>
namespace {
// Nơi nhận log của riêng bạn, ví dụ ghi ra file hoặc hiện lên màn hình.
void my_sink(njin::log_level level, const char *file, njin::i32 line,
const char *msg, void *user) {
(void)user;
std::printf("[%s] %s:%d %s\n", njin::log_level_name(level),
file != nullptr ? file : "?", (int)line, msg);
}
void setup(njin::context &) {
njin::log_set_level(njin::log_warn); // ẩn trace/debug/info
njin::log_set_sink(my_sink); // nullptr để về mặc định (stderr)
NJIN_INFO("dòng này bị ẩn vì thấp hơn log_warn");
NJIN_WARN("texture thiếu: %s", "assets/player.png");
NJIN_ERROR("mã lỗi %d", 42);
}
} // namespace
njin::mod_desc logging_demo_module() {
return {.name = "logging_demo", .setup = setup};
}
const char * log_level_name(log_level level)
Tên của một mức, ví dụ "WARN".
void log_set_level(log_level level)
Bỏ qua các dòng log có mức thấp hơn level.
log_level
Mức độ của một dòng log, từ chi tiết nhất đến nghiêm trọng nhất.
Definition njin_log.h:31
void log_set_sink(log_sink sink, void *user=nullptr)
Thay nơi nhận log.
@ log_warn
Có vấn đề nhưng chương trình vẫn chạy tiếp.
Definition njin_log.h:35
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition _types.h:14
Mô tả một module: một nhóm system có tên.
Definition _mod.h:67
Ghi chú
line là 0 khi không biết đúng dòng, chỉ có tên nguồn (file là "njin" cho log của backend cửa sổ/âm thanh); file cũng là nullptr khi không biết gì.

Danh sách đầy đủ các hàm và macro nằm ở nhóm Log.