Log4js 日志收集

安装 (terminal)

npm install log4js

logger.js 简易内容

var log4js = require('log4js');
log4js.configure( options ) ;
var logger = log4js.getLogger([category]);
module.exports = logger;

logger.js 具体内容梳理

const log4js = require( "log4js" );
const options = {
    appenders: {
        out: {
            type: "stdout",
            layout: {
                type: "pattern",
                pattern: "%[[%x{reqid}] [%d{ISO8601_WITH_TZ_OFFSET}] [%x{ip}] [%p] [%x{user}]%] %m%n",
                tokens: {
                    user( logEvent ) {
                        if ( logEvent.context.user ) {
                            return logEvent.context.user;
                        }
                        return "";
                    }
                }
            }
        },
        file: {
            type: "file",
            filename: "logs/access.log",
            maxLogSize: 10485760,
            layout: {
                type: "messagePassThrough"
            },
            compress: true
        }
    },
    categories: {
        "out": {
            appenders: [ "out" ],
            level: "info"
        },
        default: {
            appenders: [ "file" ],
            level: "info"
        }
    }
} 
log4js.configure( options );

var logger = log4js.getLogger( "out" );

module.exports = logger;

options 配置

options:

  1. levels:
    All -> Trace -> Debug -> Info -> Warn -> Error -> Fatal -> Mark -> Off(关闭)
  2. appenders ( appendersObject ):
    日志事件序列化为某种形式的输出
  3. categories ( categoriesObject ):
    用于分组日志事件的标签
  4. pm2, pm2InstanceVar, disableClustering:
    与PM2相关的配置

appendersObject { key : object}
key: {
type: types, (required)
layout: layoutObject
}

types : 输出类型

  • categoryFilter
  • console (向控制台写入大量输出会使应用程序占用大量内存。如果遇到此问题,请尝试切换到stdout appender。
    )
  • dateFile (filename, pattern('.yyyy-MM-dd-hh'), compress, encoding)
  • file (filename, maxLogSize, backups, compress, encoding)
  • fileSync ( 不支持compress)
  • logLevelFilter
  • multiFile (多文件 ,base, extension(后缀), timeout, property: 'categoryName' (用于文件名区分))
  • multiprocess (多进程 mode(master | worker), appender(针对master), loggerPort, loggerHost )
  • recording
  • stderr (标准错误流)
  • stdout (标准输出流)
  • tcp (port, host)
  • tcp-server

layoutObject: 输出格式 【也可自定义layout】

  • basic: 时间,级别, 类别, 信息
    [2017-03-30 07:57:00.113] [ERROR] cheese - Cheese is too ripe!
  • colored: 比 basic 多了颜色
    TRACE - '蓝色blue' | DEBUG - '青色cyan' | INFO - '绿色green' | WARN - '黄色yellow' | ERROR - '红red' | FATAL - '洋红色magenta'
  • pattern (pattern(patternString), tokens(tokenObject))

patternString

  • %r time in toLocaleTimeString format
  • %p 日志级别
  • %c 日志种类
  • %h 主机名
  • %m 日志信息
  • %d 日志日期 (默认2017-06-01 08:32:56.283) %d{yyyy/MM/dd-hh.mm.ss}
  • %% % - for when you want a literal % in your output
  • %n 换行
  • %z process id (from process.pid)
  • %x{<tokenname>} 将tokens中的变量带入
  • %X{<tokenname>} logger.addContext('user', 'charlie'); 将user带入
  • %[ start a coloured block (colour will be taken from the log level, similar to colouredLayout)
  • %] end a coloured block

tokenObject

tokens: {
  reqid( logEvent ) {
  if ( logEvent.context.reqid ) {
    return logEvent.context.reqid;
  }
  return "";
}

categoriesObject : 必有一个default
"out" : {
appenders: [ "out" ],
level: "info"
},
default: {
appenders: [ "file" ],
level: "info"
}


自定义layout

log4js.addLayout('json', function(config) {
  return function(logEvent) { return JSON.stringify(logEvent); }
});

LogEvent 对象

LoggingEvent {
  startTime: 2018-12-03T05:57:50.033Z,
  categoryName: '[Logger]',
  data: [ '拉取日志失败' ],
  level: Level { level: 40000, levelStr: 'ERROR', colour: 'red' },
  context: {},
  pid: 2262 } {}
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 10,514评论 1 13
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 10,442评论 0 6
  • 一、Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layo...
    默默守护阅读 5,891评论 2 8
  • (http://www.cnblogs.com/zhangchenliang/p/4546352.html) 1、...
    凌雲木阅读 7,176评论 0 2
  • 我的实际应用场景是:青岛项目中需要一份除青岛范围之外的简单行政区划地图数据,看下图浅绿色数据框青岛范围是要用详细的...
    gis杭州阅读 10,376评论 0 0