Запись [Сбор журналов]
Так называемый вход на самом деле является так называемымСобирать информацию журнала, Как эффективно собрать необходимую информацию и классифицировать ее — это первый шаг для нас при записи файла журнала.
log4js предоставляетКлассификацияа такжеКлассификация псевдонимов
Установите зависимости:
npm install log4js
Уровень
Это классификация логов, с классификацией логов, логи могут лучше отображаться для нас (логи разных уровней используют разные цвета в консоли, например, ошибка обычно красная), а логи можно выборочно размещены в производстве, например, Избегайте утечки конфиденциальной информации, принадлежащей .debug
Журнал log4js разделен на девять уровней, и имена и веса каждого уровня следующие:
{
ALL: new Level(Number.MIN_VALUE, "ALL"),
TRACE: new Level(5000, "TRACE"),
DEBUG: new Level(10000, "DEBUG"),
INFO: new Level(20000, "INFO"),
WARN: new Level(30000, "WARN"),
ERROR: new Level(40000, "ERROR"),
FATAL: new Level(50000, "FATAL"),
MARK: new Level(9007199254740992, "MARK"), // 2^53
OFF: new Level(Number.MAX_VALUE, "OFF")
}
тестовое задание:
Создайте JS-файл:
const log4js = require('log4js');
//logger 是log4js的实例
const logger = log4js.getLogger();
logger.level = "all"
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');、
logger.fatal('this is fatal');
logger.mark('this is mark');
распечатать результат:
Таким образом можно интуитивно классифицировать журналы разного уровня. С одной стороны, нам удобно просматривать лог терминала, а с другой стороны, это тоже может сыграть роль в фильтрации потом.
Цель классификации — облегчить поиск
тип (категория)
Вы можете указать псевдоним при создании экземпляра log4js, и тогда вы сможете легко отличить, какой файл находится в журнале.
const log4js = require('log4js');
// 实例化时,唯一可以传的一个参数category
const logger = log4js.getLogger('日志1');
logger.level = "all"
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');
logger.mark('this is mark');
распечатать результат:
экспорт [вывод журнала]
Appender
Приведенный выше пример просто инициализирует экземпляр и выводит его с разными типами и уровнями. По умолчаниюконсольный вывод, как сохранить в файл, на этот раз нужноappenderИграл.
Appender предоставлен log4js
И консоль, и файл являются приложениями, предоставляемыми log4js, в дополнение к:
- DateFile: журнал выводится в файл, и файл журнала можно прокручивать по определенному шаблону даты, например, вывести сегодня в default-2021-04-20.log и вывести в default-2021-04-21. войти завтра;
- SMTP: вывод журнала на электронную почту;
- Mailgun: вывод логов в Mailgun через API Mailgun;
- levelFilter может фильтровать по уровню;
- и так далее для некоторых других приложений, чтобыздесьВы можете увидеть полный список.
Один Appender может обслуживать несколько категорий
- Приложение определяет, что журнал будет записываться в указанное место назначения (поток, файл, сеть) указанным способом.
- категория может быть свободно выбрана и объединена с каждым приложением для завершения функции регистрации, которую мы хотим
- В то же время категория также определяет уровень текущей классификации журнала, чтобы окончательно решить, следует ли выводить журнал.
- catrgory представляет собой комбинацию приложений (для версий после log4js 2.0 предыдущие версии имеют дополнительные методы настройки)
Типы и использование Appenders (размещение журнала)
Классификацию журналов можно разделить на: console, stdout, dateFile, file, fileSync, stmp… и т. д. В новой версии 2.5.2 автор добавил более десяти новых классификаций приложений, подробнее см. в этой главе. .Ссылка на сайт, здесь мы анализируем использование наиболее часто используемых приложений — dateFile, file, stdout.
file
Описание параметра:
type : “file” 首先指定 appenders 的类型为 file
filename : 用于指定日志落盘的文件地址 ( ps : “logs/myLog.log” )
layout : 选择日志输出的格式,默认 basic
maxLogSize : 单文件最大限制 ( 单位 : bytes )
backups : 旧日志最大数量
encoding : 编码格式 (默认 “utf-8”)
mode : 默认 0644 无需配置,使用默认即可
flags : 默认 “a”,无需配置,使用默认即可
compress : compress 为 true,记录当天日志时,会对以往的老日志进行压缩操作,压缩文件后缀为 .gz (默认 : false)
keepFileExt : 是否保持日志文件后缀名 ( 默认为 false,使用 pattern 的情况下,保持默认就好 )
通过 layout 我们可以自定义每一条输出日志的格式。
log4js 内置了四中类型的格式:
messagePassThrough:仅仅输出日志的内容;
basic:在日志的内容前面会加上时间、日志的级别和类别,通常日志的默认 layout;
colored/coloured:在 basic 的基础上给日志加上颜色,appender Console 默认使用的就是这个 layout;
pattern:这是一种特殊类型,可以通过它来定义任何你想要的格式。
%r %p $m $n 是 log4js 内置的包含说明符,可以借此来输出一些 meta 的信息
%r 日志输出时间,以 toLocaleTimeString 函数格式化
%p 日志等级
%c 日志分类
%h 访问计算机的 hostname
%m 打印的日志主题内容
%n 换行标识
%d 日志输出日期 ( 默认以 ISO8601 方式格式化 )
可自定义输出类型 %d{yyyy/MM/dd-hh.mm.ss},输出 2018/05/22-15.42.18
%z 记录进程 pid 号 ( 数据来自 node 方法 process.pid )
%x{} 输出自定义 tokens 中的项目,例如上述例子中的 user
%[ 想要输出的内容 %] 用来给被扩起来的内容着色,颜色和日志 level 有关
更多细节,可以参考 log4js 的文档。
const log4js = require('log4js');
// 对 category 和 appenders 进行配置
log4js.configure({
replaceConsole: true,
appenders: {
cheese: {
type: 'file',
filename: './logs/test.log',
layout: {
type: "pattern",
pattern: '{"date":"%d","level":"%p","category":"%c","host":"%h","pid":"%z","data":\'%m\'}'
},
encoding: 'utf-8',
backups: 5,
compress: false,
keepFileExt: true,
},
},
categories: {
default: {
appenders: ['cheese'],
// 设置权重
level: 'debug'
},
}
})
let logger = log4js.getLogger();
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');
logger.mark('this is mark');
результат:
datefile
Описание параметра:
type : 'dateFile' 首先指定 appenders 的类型为 dateFile
filename : 用于指定日志落盘的文件地址 ( ps : “./logs/test.log” )
pattern : 用于指定日志切分的时间间隔
'.yyyy-MM' 精确到月
'.yyyy-MM-dd' 精确到天
'.yyyy-MM-dd-hh' 精确到小时
layout : 选择日志输出的格式,该例子中使用 pattern,其余类型会额外总结
encoding : 编码格式 (默认 “utf-8”)
mode : 默认 0644 无需配置,使用默认即可
flags : 默认 “a”,无需配置,使用默认即可
compress : compress 为 true,记录当天日志时,会对以往的老日志进行压缩操作,压缩文件后缀为 .gz (默认 : false)
alwaysIncludePattern : 当为 true 时,log 文件名会包含之前设置的 pattern 信息 (默认为 false,但是强烈建议开启)
alwaysIncludePattern 为 true 时,日志名例如 : test.log-2019-08-06
alwaysIncludePattern 为 false 时,日志名例如 : test.log
daysToKeep : 指定日志保留的天数 ( 默认为 0,始终保留 )
keepFileExt : 是否保持日志文件后缀名 ( 默认为 false,使用 pattern 的情况下,保持默认就好 )
只有在 alwaysIncludePattern 为 false 时生效
const log4js = require('log4js');
// 对 category 和 appenders 进行配置
log4js.configure({
replaceConsole: true,
appenders: {
cheese: {
// 设置类型为 dateFile
type: 'dateFile',
// 配置文件名为 test.log
filename: 'logs/test.log',
// 指定编码格式为 utf-8
encoding: 'utf-8',
// 配置 layout,此处使用自定义模式 pattern
layout: {
type: "pattern",
// 配置模式,下面会有介绍
pattern: '{"date":"%d","level":"%p","category":"%c","host":"%h","pid":"%z","data":\'%m\'}'
},
// 日志文件按日期(天)切割
pattern: "-yyyy-MM-dd",
// 回滚旧的日志文件时,保证以 .log 结尾 (只有在 alwaysIncludePattern 为 false 生效)
keepFileExt: true,
// 输出的日志文件名是都始终包含 pattern 日期结尾
alwaysIncludePattern: true,
},
},
categories: {
// 设置默认的 categories
default: {appenders: ['cheese'], level: 'debug'},
}
})
let logger = log4js.getLogger();
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');
logger.mark('this is mark');
После выполнения приведенного выше кода log4js будет разделен по дням и сгенерирован таким именем, какtest.-2021-04-20.logжурнальный файл.
результат:
stdout
Этот метод используется для вывода логов в потоки ввода и вывода аннотаций, он относительно прост, конфигурация следующая:
const log4js = require('log4js');
// 对 category 和 appenders 进行配置
log4js.configure({
appenders: { 'out': { type: 'stdout' } },
categories: { default: { appenders: ['out'], level: 'info' } }
});
let logger = log4js.getLogger();
logger.trace('this is trace');
logger.debug('this is debug');
logger.info('this is info');
logger.warn('this is warn');
logger.error('this is error');
logger.fatal('this is fatal');
logger.mark('this is mark');
Таким образом, консоль напечатает:
Настоящий бой (koa+log4js)
Файл конфигурации: ./middlewares/logger.js
const log4js = require('log4js')
const Path = require('path')
levels = {
'trace': log4js.levels.TRACE,
'debug': log4js.levels.DEBUG,
'info': log4js.levels.INFO,
'warn': log4js.levels.WARN,
'error': log4js.levels.ERROR,
'fatal': log4js.levels.FATAL,
}
const dirName = 'info.log'
const _path = Path.resolve(__dirname, `../logs/${dirName}`)
log4js.configure({
// 输出到控制台的内容,同时也输出到日志文件中
replaceConsole: true,
appenders: {
cheese: {
// 设置类型为 dateFile
type: 'dateFile',
// 配置文件名
filename: _path,
// 指定编码格式为 utf-8
encoding: 'utf-8',
// 配置 layout,此处使用自定义模式 pattern
// layout: 'basic',
// 日志文件按日期(天)切割
pattern: "yyyy-MM-dd",
// 回滚旧的日志文件时,保证以 .log 结尾 (只有在 alwaysIncludePattern 为 false 生效)
keepFileExt: true,
// 输出的日志文件名是都始终包含 pattern 日期结尾
alwaysIncludePattern: true,
},
},
categories: {
// 设置默认的 categories
default: {appenders: ['cheese'], level: 'debug'},
}
})
exports.logger = (name, level) => {
const logger = log4js.getLogger(name)
// 默认为debug权限及以上
logger.level = levels[level] || levels['debug']
return logger
}
exports.use = (app, level, name) => {
//加载中间件
app.use(log4js.connectLogger(log4js.getLogger(name || 'logInfo'), {
level: levels[level] || levels['debug'],
//格式化http相关信息
format: ':method :url :status'
}));
}
Использование промежуточного ПО в server.js
const Koa = require('koa');
const app = koa();
const log4js = require('./middlewares/logger');
log4js.use(app);
использовать log4js
const Koa = require('koa');
const app = new Koa();
const logger = require('./middlewares/logger').logger('server.js', 'warn');
logger.trace('This is a server page! -- log4js');
logger.debug('This is a server page! -- log4js');
logger.info('This is a server page! -- log4js');
logger.warn('This is a server page! -- log4js');
logger.error('This is a server page! -- log4js');
logger.fatal('This is a server page! -- log4js');