支持集成第三方日志库 (#190)

* 更新 ILogger 签名

改为纯可变参数兼容主流日志库

* 拆分日志类型与实现

* 新增 setLoggerFactory 方法

* tweak

* getLoggerName 返回类名,默认情况下子类无需重写

* 更新日志说明文档

* 增加测试

* 使用 getSystemInstanceTypeName,避免压缩导致获取类名不一致
This commit is contained in:
LINGYE
2025-10-26 11:53:46 +08:00
committed by GitHub
parent 3ea55303dc
commit 0cd99209c4
11 changed files with 449 additions and 247 deletions

View File

@@ -214,4 +214,11 @@ describe('EntitySystem', () => {
});
});
describe('日志器命名', () => {
it('应该使用类名作为日志器名称', () => {
const loggerName = (system as any).getLoggerName();
expect(loggerName).toBe('ConcreteEntitySystem');
});
});
});

View File

@@ -153,24 +153,125 @@ describe('Logger', () => {
});
});
describe('LoggerManager - 自定义工厂', () => {
let manager: LoggerManager;
beforeEach(() => {
manager = LoggerManager.getInstance();
});
afterEach(() => {
// 重置工厂,恢复默认 ConsoleLogger
(manager as any)._loggerFactory = undefined;
(manager as any)._defaultLogger = undefined;
(manager as any)._loggers.clear();
});
it('应该支持设置自定义日志器工厂', () => {
const mockLogger = {
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn()
};
manager.setLoggerFactory(() => mockLogger);
const logger = manager.getLogger('CustomLogger');
expect(logger).toBe(mockLogger);
});
it('应该将日志器名称传递给工厂方法', () => {
const factorySpy = jest.fn(() => ({
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn()
}));
manager.setLoggerFactory(factorySpy);
manager.getLogger('TestLogger');
expect(factorySpy).toHaveBeenCalledWith('TestLogger');
});
it('应该在设置工厂后清空已创建的日志器', () => {
const logger1 = manager.getLogger('TestLogger');
manager.setLoggerFactory(() => ({
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn()
}));
const logger2 = manager.getLogger('TestLogger');
expect(logger2).not.toBe(logger1);
});
it('应该延迟创建默认日志器直到首次使用', () => {
const factorySpy = jest.fn(() => ({
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn()
}));
manager.setLoggerFactory(factorySpy);
// 此时不应该调用工厂
expect(factorySpy).not.toHaveBeenCalled();
// 获取默认日志器时才调用
manager.getLogger();
expect(factorySpy).toHaveBeenCalled();
});
it('应该在已创建日志器后设置工厂时发出警告', () => {
const warnSpy = jest.spyOn(console, 'warn').mockImplementation();
// 先创建一个日志器
manager.getLogger('ExistingLogger');
// 再设置工厂
manager.setLoggerFactory(() => ({
debug: jest.fn(),
info: jest.fn(),
warn: jest.fn(),
error: jest.fn(),
fatal: jest.fn()
}));
expect(warnSpy).toHaveBeenCalledWith(
expect.stringContaining('setLoggerFactory 应该在导入 ECS 模块之前调用')
);
warnSpy.mockRestore();
});
});
describe('全局颜色配置', () => {
let consoleSpy: jest.SpyInstance;
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'info').mockImplementation();
});
afterEach(() => {
consoleSpy.mockRestore();
resetLoggerColors();
});
it('应该支持全局设置颜色配置', () => {
const logger = createLogger('TestLogger');
setLoggerColors({
info: Colors.MAGENTA
});
const logger = createLogger('TestLogger');
logger.info('测试消息');
const call = consoleSpy.mock.calls[0][0];
@@ -179,17 +280,18 @@ describe('Logger', () => {
});
it('应该支持重置颜色配置为默认值', () => {
const logger = createLogger('TestLogger');
setLoggerColors({
info: Colors.MAGENTA
});
resetLoggerColors();
const logger = createLogger('TestLogger');
logger.info('测试消息');
const call = consoleSpy.mock.calls[0][0];
expect(call).toContain('\x1b[32m');
});
});
});
});