Nodejs log4js日志管理配置

假如想象 提交于 2020-02-04 09:50:26

 

最近在看公司的项目,日志管理用的是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, colour: 'grey' }, // 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'],
        level: appLogLevel
      }
    },
    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'],
        level: appLogLevel
      }
    },
    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',
        filename: 'test.log',
        pattern: '-yyyy-mm-dd.log',
        //包含模型  不加这一句的话和上面的方式  输出一样
        alwaysIncludePattern: true
      }
    },
    categories: {
      default: {
        appenders: ['files'],
        level: appLogLevel
      }
    },
    disableClustering: true
  }
复制代码
下面是输出的文件内容
复制代码

 

 

 

levelFilter 过滤筛选

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!