log4js日志模块

log4js日志模块
 最后更新于 2024年10月02日 22:59:38

介绍

版本号:2.3.8

Level 日志分级

日志的分级。不同级别的日志在控制台中采用不同的颜色。 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")
}

Category 日志分类

通过 getLogger 获取 Logger 实例时,唯一的参数 loggerCategoryName表明 Logger 属于哪个分类。如果没有匹配 categories中定义的则使用 default 配置

log4js.getLogger('test1').debug('调试信息!')
log4js.getLogger('test').debug('调试信息!')

// test1 和 test 在categories 中没有定义,所以有以下信息
// [2017-10-24 16:43:17.980] [DEBUG] test1 - 提示信息!
// [2017-10-24 16:43:17.980] [DEBUG] test - 提示信息!

Appender 日志输出

定义日志以何种方式输出。 如果输出级别是 info,则不会打印出低于 info 级别的日志 trace,debug,只打印info,warn,error,fatal。 log4js定义了如下的输出格式:

  • Clustered
  • Console
  • DateFile
  • DateFileSync
  • File
  • GELF
  • hook.io
  • logFaces
  • Loggly
  • Mailgun
  • Multiprocess
  • SMTP

完整示例:

const log4js = require('log4js')
log4js.configure({
  appenders: {
    console: {
      type: 'console'              // 控制台输出
    },
    file: {
      type: 'File',                // 文件输出
      filename: 'logs/log.txt',    // 文件路径
      backups: 4,                  // 日志备份数量,大于该数则自动删除
      maxLogSize: 1024             // 文件大小,1KB
    },
    info: {
      type: 'dateFile',            // 日期文件输出
      filename: 'logs/info',       // 日志路径/需要手动创建
      pattern: '.yyyy-MM-dd.log',  // 日志文件命名格式
      alwaysIncludePattern: true   // 日志是否包含命名格式
    },
    error: {
      type: 'dateFile',
      filename: 'logs/error',
      pattern: '_yyyy-MM-dd.log',
      alwaysIncludePattern: true
    }
  },
  categories: {
    default: { appenders: ['console'], level: 'all' },
    info: { appenders: ['console', 'info'], level: 'info' },
    error: { appenders: ['console', 'error'], level: 'error' }
  }
})

const infoLog = log4js.getLogger('info')
const errorLog = log4js.getLogger('error')

infoLog.info('Info Level!')
infoLog.warn('Warn Level!')
errorLog.error('Error Level!')
errorLog.fatal('Fatal Level!')

/*
 *  error_2017-10-25.log
 *    [2017-10-25 17:51:41.381] [ERROR] error - Error Level!
 *    [2017-10-25 17:51:41.381] [FATAL] error - Fatal Level!
 *
 *  info.2017-10-25.log
 *    [2017-10-25 17:51:41.376] [INFO] info - Info Level!
 *    [2017-10-25 17:51:41.380] [WARN] info - Warn Level!
 *  log.txt
 */

express 框架集成

在 app.js 中加入以下代码:

var log4js = require('./logger');
log4js.use(app);

在 index.js 中使用 logger 输出

var logger = require('../logger').logger('index');

/* GET home page. */
router.get('/', function (req, res, next) {
    console.log('This is an index page!');
    logger.info('This is an index page! -- log4js');
    res.render('index', {title: 'Express'});
});

File Appender

日志写入到一个文件。支持可选的文件大小和备份数。 当应用程序关闭时使用 log4js.shutdown 确保剩余日志写入

配置
  • type - file
  • filename 日志文件路径
  • maxLogSize 日志文件最大容量。单位为bytes。当输出的日志容量大于该数后会覆盖原有日志写入。
  • backups 最大备份日志数,默认 5
  • layout see layouts

其他配置参数将被传递给 streamroller (参见Node.js核心文件):

  • encoding 输出流编码。默认 utf-8
  • mode 输出流模式。默认 0644
  • flags 默认 a
  • compress 压缩备份文件。默认 false

示例:

log4js.configure({
  appenders: {
    everything: { type: 'file', filename: 'all-the-logs.log' }
  },
  categories: {
    default: { appenders: [ 'everything' ], level: 'debug' }
  }
});

const logger = log4js.getLogger();
logger.debug('I will be logged in all-the-logs.log');

此示例将生成包含日志消息的单个日志文件(所有日志)。

压缩备份
log4js.configure({
  appenders: {
    everything: { type: 'file', filename: 'all-the-logs.log', maxLogSize: 10485760, backups: 3, compress: true }
  },
  categories: {
    default: { appenders: [ 'everything' ], level: 'debug'}
  }
});

当达日志达到10MB大小,它将会被压缩到all-the-logs.log.1.gz和新的文件all-the-logs.log。 当all-the-logs.log再次达到10MB时,all-the-logs.log.1.gz将更名为all-the-logs.log.2.gz,依此类推。

DateFile Appender

基于时间的日志文件。 当应用程序关闭时使用 log4js.shutdown 确保剩余日志写入

配置
  • type - dateFile
  • filename 日志文件夹 也可以为 日志文件路径
  • pattern 日志文件格式,默认 .yyyy-MM-dd,可选。yyyy-MM-dd hh/mm/ss.SSS O(年-月-日 时/分/秒.毫秒 时区)
  • layout 布局,默认basic layout,更多的查看 layouts

其他配置参数将被传递给 streamroller (参见Node.js核心文件):

  • encoding 输出流编码。默认 utf-8
  • mode 输出流模式。默认 0644
  • flags 默认 a
  • compress 压缩备份文件。默认 false
  • alwaysIncludePattern 日志文件命令是否包含 pattern, 默认 false。当 filename为 日志文件路径, 该项无效; filename为日志文件夹, 该项必须为 true,否则出错
  • daysToKeep 如果该值大于零,则删除大于该天数的文件。默认0
逐日存储和备份
log4js.configure({
  appenders: {
    everything: {type: 'dateFile', filename: 'all-the-logs.log' }
  },
  categories: {
    default: { appenders: [ 'everything' ], level: 'debug' }
  }
});

all-the-logs.log 为当天的日志文件,过去的每天的日志备份为 all-the-logs.log.2017-04-30,等

逐时存储和压缩备份
log4js.configure({
  appenders: {
    everything: { type: 'dateFile', filename: 'all-the-logs.log', pattern: '.yyyy-MM-dd-hh', compress: true }
  },
  categories: {
    default: { appenders: [ 'everything' ], level: 'debug'}
  }
});

all-the-logs.log 为当前小时的日志文件,过去每小时的日志备份为 all-the-logs.log.2017-04-30-08.gz 等的压缩文件

Redis Appender

日志存储到Redis数据库。需要 Redis 依赖包支持。

配置
  • type - redis
  • host Redis数据库地址,默认 127.0.0.1。可选
  • port Redis数据库端口,默认 6379。可选
  • pass 连接密码。可选
  • channel 订阅频道,日志被发布到指定的订阅频道
  • layout 布局,默认为 basicLayout 查看 layouts。可选

示例:

log4js.configure({
  appenders: {
    redis: { type: 'redis', channel: 'logs' }
  },
  categories: { default: { appenders: ['redis'], level: 'info' } }
});

SMTP Appender

电子邮件发送日志。需要 nodemailer 依赖包支持。 当应用程序关闭时调用 log4js.shutdown 命令,将剩余的邮件发送出去

配置
  • type - smtp
  • SMTP 发送方邮件服务配置, 不存在使用 transport 字段
    • host 邮件服务器地址,默认 localhost
    • port 端口,可选,默认 25
    • auth 认证,可选
      • user
      • pass
  • transport 发送方邮件服务配置,不存在使用 SMTP字段,可选。查看 nodemailer 文档的 transport 选项
    • plugin 邮件服务,默认 smtp
    • options 配置项
  • attachment 将日志作为电子邮件附件发送,可选
    • enable 是否启用,默认 false
    • message 邮件正文,默认 See logs as attachment
    • filename 附件文件名,默认 default.log
  • sendInterval 邮件发送的间隔时间, 默认 0,如果为 0 则每个日志消息都会发送一封电子邮件,可选
  • shutdownTimeout 关闭过程中等待邮件发送的时间,默认 5, 可选
  • recipients 收件人
  • subject 邮件主题,默认为批量日志中第一个日志的的内容,可选
  • sender 发件人,发件人必须同 smtp.auth.user 相同,否则出错
  • html 电子邮件作为HTML发送,而不是以纯文本形式发送,默认 false,可选
  • layout 布局,默认为 basicLayout 查看 layouts,可选

示例:

log4js.configure({
  appenders: {
    email: {type: 'smtp', recipients: 'dev.team@company.name'}
  },
  categories: { default: { appenders: [ 'email' ], level: 'error' } }
});

运行在本地的SMTP服务器发送电子邮件

日志作为附件
log4js.configure({
  appenders: {
    email: {
      type: 'smtp',
      recipients: 'dev.team@company.name',
      subject: 'Latest logs',
      sender: 'my.application@company.name',
      attachments: {
        enable: true,
        filename: 'latest.log',
        message: 'See the attachment for the latest logs'
      },
      sendInterval: 3600
    }
  },
  categories: { default: { appenders: ['email'], level: 'ERROR' } }
});

每隔一小时发送一次电子邮件,日志作为附件。

自定义 SMTP host
log4js.configure({
  appenders: {
    email: {
      type: 'smtp',
      smtp: {
        host: 'smtp.qq.com',
        auth: {user: '****@qq.com', pass: '*****'}
      },
      // 也可以使用下面的配置
      // transport: {
      //   plugin: 'smtp',
      //   options: {
      //     host: 'smtp.qq.com',
      //     port: 465,
      //     auth: {user: '****@qq.com', pass: '*****'}
      //   }
      // },
      recipients: '*****@163.com',
      subject: '邮件标题',
      sender: '****@qq.com'
    }
  },
  categories: { default: { appenders: ['email'], level: 'info' } }
});