@emartech/json-logger (英语)
一个以 JSON 格式输出日志的小而快的日志库 . 其基于命名空间的启用/失效机制与 调试。 。 。 .
安装
npm install @emartech/json-logger
使用量
自8.0.0起,默认在伐木时将使用ECS字段.
如果您还需要旧格式, 您需要覆盖 outputFormat 相会.
configure 将在全球范围内对日志的所有实例应用此设置.
const { createLogger } = require('@emartech/json-logger');
createLogger.configure({
outputFormat: 'legacy'
});
脚本
process.env.DEBUG = 'redis';
const { createLogger } = require('@emartech/json-logger');
const mongoLogger = createLogger('mongo');
const redisLogger = createLogger('redis');
redisLogger.info('connected', { domain: 'yahoo' });
// ECS format: {"event":{"action":"connected","created":"2016-08-15T08:50:23.566Z"},"log":{"logger":"redis","level":30},"domain":"yahoo"}
// Legacy format: {"name":"redis","action":"connected","level":30,"time":"2016-08-15T08:50:23.566Z","domain":"yahoo"}
mongoLogger.info('connected', { domain: 'google' });
// no output, because 'mongo' is not within namespaces (process.env.DEBUG)
redisLogger.fromError('query', new Error('Unauthorized'), { problem: 'missmatch' });
// ECS format: {"event":{"action":"query","created":"2016-08-15T08:50:23.569Z"},"log":{"logger":"redis","level":50},"error":{"type":"Error","message":"Unauthorized","stack_trace":"..."},"problem":"mismatch"}
// Legacy format: {"name":"redis","action":"query","level":50,"time":"2016-08-15T08:50:23.569Z","error_name":"Error","error_stack":"Error: Unauthorized\n at Object.<anonymous> (/home/blacksonic/workspace/bunyan-debug/example.js:15:32)\n at Module._compile (module.js:541:32)\n at Object.Module._extensions..js (module.js:550:10)\n at Module.load (module.js:458:32)\n at tryModuleLoad (module.js:417:12)\n at Function.Module._load (module.js:409:3)\n at Module.runMain (module.js:575:10)\n at run (bootstrap_node.js:352:7)\n at startup (bootstrap_node.js:144:9)\n at bootstrap_node.js:467:3","error_message":"Unauthorized","problem":"missmatch"}
类
const { createLogger } = require('@emartech/json-logger');
const logger = createLogger('Exporter');
class Exporter {
export() {
mongoLogger.info('export', { customer_id: 123 });
}
}
import { createLogger } from '@emartech/json-logger';
const logger = createLogger('Exporter');
class Exporter {
export() {
mongoLogger.info('export', { customer_id: 123 });
}
}
测试
import { Logger } from '@emartech/json-logger';
describe('Exporter', () => {
it('should log', () => {
jest.spyOn(Logger.prototype, 'info').mockReturnValue();
const exporter = new Exporter();
exporter.export();
expect(Logger.prototype.info).toHaveBeenCalledWith('export', { customer_id: 123 });
})
});
更多实例可见于 examples 目录.
API 密码
JsonLogger( 命名空间)
图书馆的默认导出起到工厂方法的作用.
返回带有指定命名空间的日志实例 .
这个 DEBUG 然后使用环境变量来启用基于逗号限制名称的这些实例.
已禁用实例输出无日志 .
process.env.DEBUG = 'redis,mysql';
const { createLogger } = require('@emartech/json-logger');
const mongoLogger = createLogger('mongo');
// mongo instance will be disabled
const redisLogger = createLogger('redis');
// redis instance will be enabled
JsonLogger.prototype.info(动作,数据) 互联网档案馆的存檔,存档日期2011-10-21
用 JSON 格式打印提供给控制台的数据.
const { createLogger } = require('@emartech/json-logger');
const redisLogger = createLogger('redis');
redisLogger.info('connected', { domain: 'yahoo' });
// ECS format: {"event":{"action":"connected","created":"2016-08-15T08:50:23.566Z"},"log":{"logger":"redis","level":30},"domain":"yahoo"}
// Legacy format: {"name":"redis","action":"connected","level":30,"time":"2016-08-15T08:50:23.566Z","domain":"yahoo"}
redisLogger.info('connected');
// ECS format: {"event":{"action":"connected","created":"2016-08-15T08:50:23.566Z"},"log":{"logger":"redis","level":30}}
// Legacy format: {"name":"redis","action":"connected","level":30,"time":"2016-08-15T08:50:23.566Z"}
默认显示实例的命名空间( N)name),以ISO8601格式显示的当前时间(time, (中文(简体) ),
将动作传递到日志方法和与该方法相关的日志级别.
第二个论点被分配到这些基本领域,并连同它们一起展示.
Json Logger.prototype.trace(动作,数据)
和追踪日志级别的信息相同.
JsonLogger.prototype.debug(动作,数据)
与调试日志级别的信息相同 .
Json Logger.prototype.warn(动作,数据) 互联网档案馆的存檔,存档日期2013-12-21
与警告日志级别的信息相同 .
JsonLogger.prototype.error(动作,数据) 互联网档案馆的存檔,存档日期2011-12-21
与错误日志级别的信息相同 .
Json Logger.prototype.fatal(动作,数据)
与致命日志级别的信息相同.
Json Logger. prototype. from Error( 动作, 数据)
显示一个格式化为一行的错误对象. 所显示行包含堆栈痕量,名称和出错消息(对于Axios出错,也包含请求和响应细节). 日志级别默认为出错 .
const { createLogger } = require('@emartech/json-logger');
const redisLogger = createLogger('redis');
redisLogger.fromError('query', new Error('Unauthorized'), { problem: 'missmatch' });
// ECS format: {"event":{"action":"query","created":"2016-08-15T08:50:23.569Z"},"log":{"logger":"redis","level":50},"error":{"type":"Error","message":"Unauthorized","stack_trace":"..."},"problem":"mismatch"}
// Legacy format: {"name":"redis","action":"query","level":50,"time":"2016-08-15T08:50:23.569Z","error_name":"Error","error_stack":"Error: Unauthorized\n at Object.<anonymous> (/home/blacksonic/workspace/bunyan-debug/example.js:15:32)\n at Module._compile (module.js:541:32)\n at Object.Module._extensions..js (module.js:550:10)\n at Module.load (module.js:458:32)\n at tryModuleLoad (module.js:417:12)\n at Function.Module._load (module.js:409:3)\n at Module.runMain (module.js:575:10)\n at run (bootstrap_node.js:352:7)\n at startup (bootstrap_node.js:144:9)\n at bootstrap_node.js:467:3","error_message":"Unauthorized","problem":"missmatch"}
JsonLogger.prototype.warn FromError(动作,数据) 互联网档案馆的存檔,存档日期2011-12-20
与 fromError,但带有警告日志级别.
Json Logger.prototype.timer () 互联网档案馆的存檔,存档日期2013-12-21
创建与日志实例( 信息、 警告、 错误、 来自 Error等) 方法相同的新定时器实例
并且记录了从创建实例起以毫秒计的时间.
所经过的时间将记入 duration 字段.
const { createLogger } = require('@emartech/json-logger');
const redisLogger = createLogger('redis');
const timer = redisLogger.timer();
// heavy task
timer.info('completed');
// Legacy format: {"name":"redis","action":"completed","level":30,"time":"2016-08-15T08:50:23.566Z","duration": 1500}
// ECS format: {"event":{"action":"completed","duration":"1500","created":"2016-08-15T08:50:23.566Z"},"log":{"logger":"redis","level":30}}
JsonLogger.confetch( 选项)
伐木过程的单独步骤可以在此配置. 这些修改影响到图书馆的所有实例. 有了变压器,我们就可以在传递到前置物和输出之前更改要记录的数据. 它是一个完美的地方,可以添加机器运行中的名称或与当前存储在本地续存上的线程相关的请求ID. 随着“ 增强的StackTraces” 选项被设定为对齐, 错误堆栈跟踪将包含错误的原因以及( 如果有的话) 包括其堆栈跟踪 并显著改进了截取限制.
const { createLogger } = require('@emartech/json-logger');
createLogger.configure({
formatter: JSON.stringify,
output: console.log,
transformers: [],
outputFormat: 'ecs',
enhancedStackTrace: true
});
日志级别
- "肥"(60):"al". 该服务/应用程序现在将停止或无法使用. 接线员应该马上调查一下.
- ""误"(50): 对特定请求来说是致命的,但服务/应用程序仍在继续 为其他请求提供服务。 接线员应该马上看(ish) .
- "温"(40): 关于某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某 最终操作员.
- "资料"(30): 经常操作的细节.
- "调试" (20): 其它的,即太动词不能包含在"info"级别.
- "追踪"(10): 从应用程序使用的外部库登录或 非常喜欢 详细的应用程序记录.
自动登录请求标识符
你需要使用中间的软件 @emartech/cls-adapter 并将其变压器添加到日志配置方法中.
这样可以登录来自信头字段的请求标识符( E)X-Request-Id)到每个日志行
,而所谓的函数来源于路由处理器.
用于自动化
const Koa = require('koa');
const { createLogger } = require('@emartech/json-logger');
const clsAdapter = require('@emartech/cls-adapter');
const logger = createLogger('redis');
createLogger.configure({
transformers: [
clsAdapter.addContextStorageToInput()
]
});
const app = new Koa();
app.use(clsAdapter.getKoaMiddleware());
app.use(async () => {
logger.info('connected');
// Legacy format: {"name":"redis","action":"connected","level":30,"time":"2016-08-15T08:50:23.566Z","request_id":"d5caaa0e-b04e-4d94-bc88-3ed3b62dc94a"}
})