如何为 winston@3 记录器制作自定义 json 格式化程序?
How to make a custom json formatter for winston@3 logger?
我正在尝试为 winston v3 制作自定义 json 格式化程序。
这是带有演示的单个文件:
const { createLogger, format, transports } = require("winston")
const { combine, timestamp, prettyPrint } = format
const logger = createLogger({
format: combine(timestamp(), prettyPrint())
})
logger.add(new transports.Console())
logger.info("test message", { data: { a: 1, b: [1, 2, 3, 4], d: new Date() } })
try {
throw new Error("I'm an error!")
} catch (err) {
logger.error(err)
}
它打印:
{ data: { a: 1, b: [ 1, 2, 3, 4 ], d: 2018-07-21T08:59:27.958Z },
level: 'info',
message: 'test message',
timestamp: '2018-07-21T08:59:27.959Z',
[Symbol(level)]: 'info',
[Symbol(splat)]:
[ { data: { a: 1, b: [ 1, 2, 3, 4 ], d: 2018-07-21T08:59:27.958Z } } ] }
{ Error: I'm an error!
at Object.<anonymous> (/Users/max7z/projects/test/t32__test__winston__pretty-print_symbol/index.js:13:9)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:266:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
level: 'error',
timestamp: '2018-07-21T08:59:27.962Z',
[Symbol(level)]: 'error' }
我想要几乎相同的输出,但没有一些字段:[Symbol(level)]、[Symbol(splat)]。
是否可以从 prettyPrint
格式化程序中删除 [Symbol] 字段?
或者我如何制作自己的自定义 json 格式化程序,并像 prettyPrint 那样具有错误堆栈跟踪?
查看 how to create custom formats。
然后以prettyPrint
的source code为基础,根据自己的需要制作修改版。
Winstons 使用 triple-beam
定义各种 Symbol
,因此您也可以使用该包删除它们。
require('winston-daily-rotate-file');
const { createLogger, format, transports } = require('winston');
const { combine, timestamp, label, printf, prettyPrint, splat, simple } = format;
const myFormat = printf(info => {
// you can get splat attribue here as info[Symbol.for("splat")]
// if you custome splat please rem splat() into createLogger()
return `${info.timestamp} [${info.label}] ${info.level}: ${info.message}`;
});
const logger = createLogger({
format: combine(
label({ label: 'keaz.co' }),
timestamp(),
splat(),
myFormat
),
transports: [
new transports.Console(),
new transports.File({
filename: "info.log",
level: 'info'
}),
new transports.File({
filename: "error.log",
level: 'error'
})
]
})
logger.info("test message %o", { data: { a: 1, b: [1, 2, 3, 4], d: new Date() } });
module.exports = logger;
我遇到过类似的问题,并在 here 中找到了解决方案。我正在使用 Node.js 和 Socket.IO,我在 Socket.IO 中使用了记录器。例如:
Node.js
io.on('connection',function(socket){
var date = new Date();
socket.on('',function(data){
logger.log('info', {IP: ip, Date: date, Path: '', Data: data.req_data});
Winston.js(记录器)
const app_root = require('app-root-path');
const { createLogger, format, transports } = require('winston');
var logger = createLogger({
level: 'info',
format: format.combine(
format(function(info, opts){
console.log(`[${info.IP}]-[${info.Date}]-[${info.Path}]-[${info.Data}]`);
return info;
})(),
format.json()
),
transports: [
new transports.File({filename: `${app_root}/logs/info.log`})
]
});
module.exports = logger;
据我所知,我们可以根据需要使用随机变量(ip、date、bird、ball 等)。我认为经过一些安排后,您也可以将其用于错误。祝你好运!
我用 winston v3.3.3 测试了示例,并添加了一个自定义格式化程序来对 data
对象进行字符串化:
const winston = require('winston');
const myFormatter = winston.format((info) => {
const {message} = info;
if (info.data) {
info.message = `${message} ${JSON.stringify(info.data)}`;
delete info.data; // We added `data` to the message so we can delete it
}
return info;
})();
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss',
}),
myFormatter,
winston.format.simple(),
),
transports: [
new winston.transports.Console(),
],
});
我运行问题中的命令并得到了所需的输出。
执行:
logger.info('test message', {data: {a: 1, b: [1, 2, 3, 4], d: new Date()}});
try {
throw new Error(`I'm an error!`);
} catch (err) {
logger.error(err);
}
输出:
info: test message {"a":1,"b":[1,2,3,4],"d":"2020-09-09T09:41:22.525Z"} {"timestamp":"2020-09-09 11:41:22"}
error: I'm an error! {"timestamp":"2020-09-09 11:41:22"}
当使用 winston.format.prettyPrint()
而不是 winston.format.simple()
时,JSON 对象也可以使用制表符和换行符打印。
我正在尝试为 winston v3 制作自定义 json 格式化程序。
这是带有演示的单个文件:
const { createLogger, format, transports } = require("winston")
const { combine, timestamp, prettyPrint } = format
const logger = createLogger({
format: combine(timestamp(), prettyPrint())
})
logger.add(new transports.Console())
logger.info("test message", { data: { a: 1, b: [1, 2, 3, 4], d: new Date() } })
try {
throw new Error("I'm an error!")
} catch (err) {
logger.error(err)
}
它打印:
{ data: { a: 1, b: [ 1, 2, 3, 4 ], d: 2018-07-21T08:59:27.958Z },
level: 'info',
message: 'test message',
timestamp: '2018-07-21T08:59:27.959Z',
[Symbol(level)]: 'info',
[Symbol(splat)]:
[ { data: { a: 1, b: [ 1, 2, 3, 4 ], d: 2018-07-21T08:59:27.958Z } } ] }
{ Error: I'm an error!
at Object.<anonymous> (/Users/max7z/projects/test/t32__test__winston__pretty-print_symbol/index.js:13:9)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:266:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
level: 'error',
timestamp: '2018-07-21T08:59:27.962Z',
[Symbol(level)]: 'error' }
我想要几乎相同的输出,但没有一些字段:[Symbol(level)]、[Symbol(splat)]。
是否可以从 prettyPrint
格式化程序中删除 [Symbol] 字段?
或者我如何制作自己的自定义 json 格式化程序,并像 prettyPrint 那样具有错误堆栈跟踪?
查看 how to create custom formats。
然后以prettyPrint
的source code为基础,根据自己的需要制作修改版。
Winstons 使用 triple-beam
定义各种 Symbol
,因此您也可以使用该包删除它们。
require('winston-daily-rotate-file');
const { createLogger, format, transports } = require('winston');
const { combine, timestamp, label, printf, prettyPrint, splat, simple } = format;
const myFormat = printf(info => {
// you can get splat attribue here as info[Symbol.for("splat")]
// if you custome splat please rem splat() into createLogger()
return `${info.timestamp} [${info.label}] ${info.level}: ${info.message}`;
});
const logger = createLogger({
format: combine(
label({ label: 'keaz.co' }),
timestamp(),
splat(),
myFormat
),
transports: [
new transports.Console(),
new transports.File({
filename: "info.log",
level: 'info'
}),
new transports.File({
filename: "error.log",
level: 'error'
})
]
})
logger.info("test message %o", { data: { a: 1, b: [1, 2, 3, 4], d: new Date() } });
module.exports = logger;
我遇到过类似的问题,并在 here 中找到了解决方案。我正在使用 Node.js 和 Socket.IO,我在 Socket.IO 中使用了记录器。例如:
Node.js
io.on('connection',function(socket){
var date = new Date();
socket.on('',function(data){
logger.log('info', {IP: ip, Date: date, Path: '', Data: data.req_data});
Winston.js(记录器)
const app_root = require('app-root-path');
const { createLogger, format, transports } = require('winston');
var logger = createLogger({
level: 'info',
format: format.combine(
format(function(info, opts){
console.log(`[${info.IP}]-[${info.Date}]-[${info.Path}]-[${info.Data}]`);
return info;
})(),
format.json()
),
transports: [
new transports.File({filename: `${app_root}/logs/info.log`})
]
});
module.exports = logger;
据我所知,我们可以根据需要使用随机变量(ip、date、bird、ball 等)。我认为经过一些安排后,您也可以将其用于错误。祝你好运!
我用 winston v3.3.3 测试了示例,并添加了一个自定义格式化程序来对 data
对象进行字符串化:
const winston = require('winston');
const myFormatter = winston.format((info) => {
const {message} = info;
if (info.data) {
info.message = `${message} ${JSON.stringify(info.data)}`;
delete info.data; // We added `data` to the message so we can delete it
}
return info;
})();
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss',
}),
myFormatter,
winston.format.simple(),
),
transports: [
new winston.transports.Console(),
],
});
我运行问题中的命令并得到了所需的输出。
执行:
logger.info('test message', {data: {a: 1, b: [1, 2, 3, 4], d: new Date()}});
try {
throw new Error(`I'm an error!`);
} catch (err) {
logger.error(err);
}
输出:
info: test message {"a":1,"b":[1,2,3,4],"d":"2020-09-09T09:41:22.525Z"} {"timestamp":"2020-09-09 11:41:22"}
error: I'm an error! {"timestamp":"2020-09-09 11:41:22"}
当使用 winston.format.prettyPrint()
而不是 winston.format.simple()
时,JSON 对象也可以使用制表符和换行符打印。