日志
日志在web开发中是必不可少的一部分,对于应用运行状态、问题排查有着很重要的作用。
框架提供的日志功能基于 winston 3。
主要特性
- 日志分级
- 统一错误日志,错误日志会打印一份到默认的错误日志中
- 支持日志切割,可以按年、月、日切割
配置
配置示例:
// common/config/default.js
module.exports = {
logger: {
root: '/tmp/logs',
injectConsole: true,
removeConsoleAfterServerStart: true,
formatType: 'log4js',
fileType: 'file',
capture: {
enable: true,
category: 'http',
level: 'auto'
},
categories: {
user: {
transports: [
'user',
'error'
]
}
},
transports: {
user: {
type: 'file',
filename: 'user/user.log',
maxsize: 50 * 1024 * 1024, // 50m
maxFiles: 30
}
},
transportsDefaultOptions: {
file: {
maxsize: 50 * 1024 * 1024, // 50m
maxFiles: 30
}
},
defaultLevel: 'debug'
}
}
root
string,路径,日志文件存放目录,默认存放在logs下
injectConsole
boolean,是否输出到stdout,默认为true
removeConsoleAfterServerStart
boolean,是否在服务器启动完毕关闭输出到stdout,默认根据当前环境是否为生产环境来判断,即env === 'production'
formatType
string,日志格式类型,log4js
| json
,默认为log4js
fileType
string,默认日志文件类型,file
| dateFile
,默认为file
capture
object,http请求日志配置,会详细记录请求来源以及响应结果
enable
: 是否开启,默认为truecategory
: 采用哪个category来保存请求日志,默认为http
level
: 日志记录级别,默认为auto,自动根据状态码输出到对应的日志
category
object,日志类别,单日志模式下定义,默认为undefined
transports
:Array,日志传输类型level
:日志记录级别
categories
object,日志类别,在category未定义时生效。
默认设置为:
categories: {
default: {
transports: [
'default',
'error'
]
},
app: {
transports: [
'app',
'error'
]
},
http: {
transports: [
'http'
]
}
}
key
{string} category名称value
{object} category属性value.transports
{Array<string|Transport>} 日志传输value.level
{string} 日志级别
defaultLevel
日志默认级别,有silly,debug,verbose,info,warn,error。默认情况下,开发环境为debug,生产环境为info。
transports
object,日志传输设置
key
:string,传输类型名称value
:object,日志参数value.type
:类型,可以为console
,file
,dateFile
value设置可参考Winston Transport,dateFile
transportsDefaultOptions
object, transport 默认配置,可用于全局设置file/dateFile类型的transport
key
: string, transport类型,如file
,dateFile
value
: object,transports配置
使用
logger挂载在app实例上,可以直接通过app.logger直接访问。
在Base上,可以通过this.logger访问
app.logger 默认挂载了['silly', 'debug', 'verbose', 'info', 'warn', 'error']这些方法,他们会输出到default category上。
如果需要访问对应category,只需要在app.logger上调用相应的category。
示例如下:
// app
app.logger.error('error!!')
app.logger.user.info('find the user')
// controller
const { Controller } = require('salak')
class Log extends Controller {
async actionLog () {
this.logger.info('test')
this.logger.user.info('user')
}
}
module.exports = Log