Ecosystem
ArtusX
Plugins
log4js

@artusx/plugin-log4js

https://github.com/log4js-node/log4js-node (opens in a new tab)

插件基于 log4js 封装,用于替代框架内置的 logger (仅只是 console / stdout)。

配置

配置完全兼容 log4js,详细配置请参考官网文档。

配置插件

默认配置

默认配置仅输出日志到控制台。

config.default.ts
export default {
  log4js: {
    appenders: {
      console: { type: 'console' },
    },
    categories: {
      default: { appenders: ['console'], level: 'info' },
    },
  },
};

进阶配置

可通过自定义配置,开启 file 类型的 appender,并输出到临时目录。

config.default.ts
import os from 'os';
import path from 'path';
import fs from 'fs-extra';
import { LoggerOptions, LoggerLevel } from '@artus/core';
import { Log4jsConfiguration } from '@artusx/core';
 
const tmpDir = os.tmpdir();
const rootDir = path.resolve(__dirname, '../..');
const logsDir = path.join(tmpDir, 'artusx/logs');
 
export default () => {
  fs.ensureDirSync(logsDir);
 
  const logger: LoggerOptions = {
    level: LoggerLevel.DEBUG,
  };
 
  const log4js: Log4jsConfiguration = {
    appenders: {
      console: { type: 'console' },
      info: { type: 'file', filename: `${logsDir}/info.log` },
      error: { type: 'file', filename: `${logsDir}/error.log` },
    },
    categories: {
      console: {
        appenders: ['console'],
        level: 'info',
      },
      error: {
        appenders: ['error'],
        level: 'error',
      },
      default: {
        appenders: ['info'],
        level: 'info',
      },
    },
  };
 
  return {
    // default logger
    logger,
 
    // log4js
    log4js,
  };
};

启用插件

core 插件已默认集成,无需单独配置;如需单独使用,可通过如下方式开启插件。

plugin.ts
export default {
  log4js: {
    enable: true,
    package: '@artusx/plugin-log4js',
  },
};

使用

在服务中,可使用 ArtusXInjectEnum 或者 Log4jsClient 注入 Log4jsClient 对象,并通过 getLogger 方法获取对应的 logger。

controller/home.ts
import { Inject } from '@artus/core';
import { Controller, GET, POST } from '@artusx/core';
import { ArtusXInjectEnum } from '@artusx/utils';
import type { ArtusXContext, Log4jsClient } from '@artusx/core';
 
@Controller()
export default class HomeController {
  @Inject(ArtusXInjectEnum.Log4js)
  log4js: Log4jsClient;
 
  @GET('/')
  @POST('/')
  async home(ctx: ArtusXContext) {
    const logger = this.log4js.getLogger('default');
    const errorLogger = this.log4js.getLogger('error');
 
    logger.info(`path: /, method: GET`);
    errorLogger.error(new Error('error'));
 
    ctx.body = 'Hello World';
  }
}