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 } {}
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

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