Nodejs log4js日志管理配置

 

最近在看公司的项目,日志管理用的是nodejs 的日志模块log4js。然后看了一下网上的一些资料和官方的文档。写一下自己的一些理解。

 

 

 

基本的理解就是:

"log4js": "^3.0.6"

  • 入口-分级 最近的log4js 默认输出的不同级别的日志分类,分别配有不同的颜色
  • 入口-分类 logger = log4js.getLogger('CHEESE');便于日志中区分不同的日志
  • 入口-作用 显而易见,后台日志种可以区分不同分类的日志,然后控制台的打印可以更好的生产/开发
  • 出口-输出位置 通过appender 多种输出方式:控制台、SMTP、file、Mailgun.
  • 出口-输出样式 basic、colored、pattern、messagePassThrough

安装日志模块

npm install log4js

log4js 2.0 版本以上 stdout 作为默认 appender,推荐使用 stdout 而不是 console 打印控制台日志 appender-console 在大量日志输出时会占用 v8 大量内存,拖慢系统性能,不推荐使用 !

简单使用

基本的用法:三部曲
// file: logger.js
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.debug("Time:",new Date());

引入log4js包,然后调用 getLogger()实例化。
复制代码

明确指定 category 和 appender

代码结构
复制代码

 

 

 

  let logConfig = {
     // 输出到控制台的内容,同时也输出到日志文件中
    replaceConsole: true,appenders: {
      'out': {
        type: 'stdout',layout: {
          type: "colored"
        }
      },'files': {
        type:'file',filename: 'testing.log'
      }
    },categories: {
      default: {
        appenders: ['out','files'],level: appLogLevel
      }
    },disableClustering: true
  }
  log4js.configure(logConfig)
  const logger = log4js.getLogger('CHEESE');

复制代码
上述代码会直接将日志同时输出至控制台和testing.log 文件中
复制代码

 

 

 

1.首先看一下不同type 输出的样式

Layout 是 log4js 提供的高级功能,通过 layout 我们可以自定义每一条输出日志的格式。log4js 内置了四中类型的格式:
messagePassThrough:仅仅输出日志的内容;
basic:在日志的内容前面会加上时间、日志的级别和类别,通常日志的默认 layout;
colored/coloured:在 basic 的基础上给日志加上颜色,appender Console 默认使用的就是这个 layout;
pattern:这是一种特殊类型,可以通过它来定义任何你想要的格式。
复制代码

这段话摘自Node.js 之 log4js 完全讲解 但是不建议看这个文章,已经是旧版本的。。。。 basic

    layout: {
      type: "basic"
    }
复制代码

 

 

 

messagePassThrough

    layout: {
      type: "messagePassThrough"
    }
复制代码

 

 

 

pattern

    layout: {
      type: "pattern",pattern: '{"date":"%d","level":"%p","category":"%c","host":"%h","pid":"%z","data":\'%m\'}'
    }
复制代码

 

 

 

colored

    layout: {
      type: "colored"
    }
复制代码

 

 

)

 

然后,类似于console的一些输出功能。log4js 对不同的类型的输出都采用了不一样的颜色,看下面的图
复制代码

 

本图片剽窃于https://www.jianshu.com/p/9604d08db899

 

 

看一下源码,就知道内部将每个等级定义的颜色:
复制代码
Level.addLevels({
  ALL: { value: Number.MIN_VALUE,colour: 'grey' },TRACE: { value: 5000,colour: 'blue' },DEBUG: { value: 10000,colour: 'cyan' },INFO: { value: 20000,colour: 'green' },WARN: { value: 30000,colour: 'yellow' },ERROR: { value: 40000,colour: 'red' },FATAL: { value: 50000,colour: 'magenta' },MARK: { value: 9007199254740992,// 2^53
  OFF: { value: Number.MAX_VALUE,colour: 'grey' }
});
复制代码

2.然后就是上面说到的如何区分不同的日志呢?

很简单只要在代码实例化的时候给起一个名字就可以,也是getLogger唯一可以出入的`category`值
那类别有什么用呢,它比级别更为灵活,为日志了提供了第二个区分的维度,例如,你可以为每个文件设置不同的 category
const logger = log4js.getLogger('CHEESE');
复制代码

 

 

 

3.输出日志

stdout 保存 //默认输出伟stdout

 let logConfig = {
    appenders: {
      'out': {
        type: 'stdout',layout: {
          type: "colored"
        }
      }
    },categories: {
      default: {
        appenders: ['out'],disableClustering: true
  }
复制代码
直接在控制台输出,看一下输出的样式
复制代码

 

 

 

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 的情况下,保持默认就好 )
复制代码
 const appenders = {}

  let logConfig = {
    appenders: {
      'files': {
        type: 'file',filename: 'test.log',// 这个地方其实不需要了,文件中是不会有五颜六色的名字的
        <!--layout: {-->
        <!--  type: "colored"-->
        <!--}-->
      }
    },categories: {
      default: {
        appenders: ['files'],disableClustering: true
  }
  log4js.configure(logConfig)
  const logger = log4js.getLogger('CHEESE');
  
  logger.info('这里面是需要输出的内容')
复制代码
结果已经保存在test.log 文件中
复制代码

 

 

 

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 时生效
复制代码

pattern 配置项解析

%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 有关
复制代码
  let logConfig = {
    appenders: {
      'files': {
        type: 'datefile',pattern: '-yyyy-mm-dd.log',//包含模型  不加这一句的话和上面的方式  输出一样
        alwaysIncludePattern: true
      }
    },disableClustering: true
  }
复制代码
下面是输出的文件内容
复制代码

 

 

 

levelFilter 过滤筛选

shenyujie.cc/2018/05/25/… 这链接比较新。大家可以参考一下

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...