nodejs之日志管理

开发一个项目时,可以通过控制台输出或者debug来获取到项目的运行信息。当项目上线时,我们就需要通过日志来分析。如同Java的log4j,nodejs中也有相关的log4js。使用过log4j的同学应该对此不会陌生。

1、日志级别

log4js共有6种日志级别,分别为:trace、debug、info、warn、error、fatal。权值从小到大,其初始化代码为:

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"),

假如设置默认的日志级别为info,那么权值小于info的日志不会被记录下来,也就是说只有调用log.info(), log.warn(), log.error()或者log.fatal()才会触发记录日志。该部分代码在lib/logger.js中。

Logger.prototype.log = function() {
  var args = Array.prototype.slice.call(arguments)
  , logLevel = levels.toLevel(args.shift())
  , loggingEvent;
  if (this.isLevelEnabled(logLevel)) {
    loggingEvent = new LoggingEvent(this.category, logLevel, args, this);
    this.emit("log", loggingEvent);
  }
};

2、集成express

log4js可以作为express的一个中间件来使用。首先需要引入log4js

var express = require("express");
var log4js = require("log4js");

var app = express();

接着配置log4js

log4js.configure({
 appenders: [
   { type: ‘console‘ },
   { type: ‘file‘, filename: ‘cheese.log‘, category: ‘cheese‘ }
  ]
});

该配置的意思是console是默认的appender,使用cheese这个appender时会将日志记录文件中,日志文件名为cheese.log。

然后用use连接到中间件,我们默认使用的是cheese这个appender,级别为info。

app.use(log4js.connectLogger(log4js.getLogger("cheese"), {level: log4js.levels.INFO}));

其输出与此类似:

[2014-07-04 20:27:21.205] [INFO] cheese - 127.0.0.1 - - "GET / HTTP/1.1" 200 22896 "" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36"

......

3、再修改一下中间件

上面的做法是可以的,只是当中间件太多的时候,都写在同一个文件中也许感觉会有些丑陋。所以我倾向于将其分离出来作为单独的一个模块,也就是一个单独的文件。然后对外暴露接口。

var path = require("path");
var log4js = require("log4js");

/**
 * 日志配置
 */
exports.configure = function() {
    log4js.configure(path.join(__dirname, "log4js.json"));
}

/**
 * 暴露到应用的日志接口,调用该方法前必须确保已经configure过
 * @param name 指定log4js配置文件中的category。依此找到对应的appender。
 *              如果appender没有写上category,则为默认的category。可以有多个
 * @returns {Logger}
 */
exports.logger = function(name) {
    var dateFileLog = log4js.getLogger(name);
    dateFileLog.setLevel(log4js.levels.INFO);
    return dateFileLog;
}

/**
 * 用于express中间件,调用该方法前必须确保已经configure过
 * @returns {Function|*}
 */
exports.useLog = function() {
    return log4js.connectLogger(log4js.getLogger("app"), {level: log4js.levels.INFO});
} 

log4js.json文件内容如下

{
    "appenders": [
        {
            "type": "console"
        },
        {
            "type": "dateFile",
            "filename": "logs/booklist.log",
            "pattern": "-yyyy-MM-dd",
            "alwaysIncludePattern": true
        }
    ]
}

配置很简单,配置了两个appender,一个是控制台的,一个是dateFile,意思是每天都产生一个日志文件。注意到我这里并没有配置category,这样的话当没有找到对应的appender时,这两个appender就是默认的appender。有些时候明明感觉配置没有错,但是日志文件并没有产生日志,往往问题就出在这里。

然后在app.js中我们修改为如下

var express = require("express");
// 这个是我们上面自定义的模块
var log4js = require("./log");

var app = express();
app.configure();

app.use(log4js.useLog());

...

4、单进程与多进程

好了,上面对于单进程是适用的,但是如果你的nodejs应用是多进程的,使用上面的配置你会看到日志的输出有点奇怪,比如:

感觉有点像是资源抢占了。

log4js的wiki中有给出multiprocess的配置。但是当时使用的时候也会有问题,当时没有细究。不过社区中有人建立了另外一种方式,我采用了这种。可以参看一下这个issue。下面我们来配置一下。修改我们在上面修改的log模块文件,变为:

var path = require("path");
var log4js = require("log4js");

/**
 * 多进程的日志配置
 */
exports.configure = function(mode) {
    if (mode === "master") {
        log4js.configure(path.join(__dirname, "./log4js-master.json"));
    } else {
        // 多进程的配置项
        log4js.configure(path.join(__dirname, "./log4js-worker.json"));
        // 单进程的配置项
//        log4js.configure(path.join(__dirname, "../config/log4js.json"));
    }
}

/**
 * 暴露到应用的日志接口,调用该方法前必须确保已经configure过
 * @param name 指定log4js配置文件中的category。依此找到对应的appender。
 *              如果appender没有写上category,则为默认的category。可以有多个
 * @returns {Logger}
 */
exports.logger = function(name) {
    var dateFileLog = log4js.getLogger(name);
    dateFileLog.setLevel(log4js.levels.INFO);
    return dateFileLog;
}

/**
 * 用于express中间件,调用该方法前必须确保已经configure过
 * @returns {Function|*}
 */
exports.useLog = function() {
    return log4js.connectLogger(log4js.getLogger("app"), {level: log4js.levels.INFO});
}

主要是修改了configure方法。

log4js-master.json的内容为:

{
    "appenders": [{
        "type": "clustered",
        "appenders": [
            {
                "type": "console"
            },
            {
                "type": "dateFile",
                "filename": "logs/booklist.log",
                "pattern": "-yyyy-MM-dd",
                "alwaysIncludePattern": true,
                "pollInterval": 1,
                "category": "dateFileLog"
            }
        ]
    }]
}

log4js-worker.js的内容为:

{
    "appenders": [{
        "type": "clustered"
    }]
}

假设主进程的内容在文件master.js,工作进程在worker.js。master.js中的配置内容为:

var log4js = require("./lib/log");
log4js.configure("master");

worker.js的配置内容为:

var express = require("express");
// 这个是我们上面自定义的模块
var log4js = require("./log");

var app = express();
app.configure("worker");

app.use(log4js.useLog());

...

如此就完成了。

需要在某个地方记录日志的时候,我们可以如此

var log = require("./log").logger("index"); // logger中的参数随便起
...
log.info("...");
log.error("...")

5、写在后面

log4js还有挺多好玩的内容,比如smtp。这是个很有用的功能,比如当项目发生某个错误时,你希望程序能发邮件通知你,该功能就能派出用场了。

另外,我开源了一个项目booklist。该项目主要在于探讨nodejs建立应用所需要或者注意的地方,非常期待各位指导与探讨,谢谢!

原文地址:https://www.cnblogs.com/lcword/p/8127692.html

时间: 2024-10-09 04:31:25

nodejs之日志管理的相关文章

Atitit php java python nodejs错误日志功能的比较

Atitit php  java  python  nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带loggin 2 1.4. Node.js日志解决方案 log4js 2 1.4.1. 玩转Nodejs日志管理log4js - CNode技术社区 2 日志的俩中模式   文件日志与os event 日志.. Os日志的优点是格式整齐.以及有默认os工具gui故居查询等.. 1.1. Php方案 自带

Nodejs日志管理包

Nodejs日志管理工具包:log4js 和 winston 1.log4js的使用 1)package.json中加入依赖 "log4js":"~0.6.21" 2)写一个log4js的配置文件log4js_conf.json { "appenders": [ { "type": "console" }, { "type": "file", "filena

slf4j+logback搭建超实用的日志管理模块

文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们非常有必要记录下发生在服务器上的活动,这些日志将用于debug.统计等各种用途. slf4j+logback这种实现方式是很常见的,好处自然是方便!.在这篇文章中,你将看到如何使用logback搭建你自己的日志组件并将日志输出到文件.如何查看这些文件.如何为每个线程上的访问分配独有的一个日志id.

nodejs的包管理器npm和cnpm

http://www.ydcss.com/archives/18 3.npm介绍 3.1.说明:npm(node package manager)nodejs的包管理器,用于node插件管理(包括安装.卸载.管理依赖等): 3.2.使用npm安装插件:命令提示符执行npm install <name> [-g] [--save-dev]: 3.2.1.<name>:node插件名称.例:npm install gulp-less --save-dev 3.2.2.-g:全局安装.将

linux 学习 14 日志管理

第十四讲 日志管理 14.1 日志管理-简介 1.日志服务 ?在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服务的使用,还是日志文件的格式其实都是和syslogd服务相兼容的,所以学习起来基本和syslogd服务一致. ?rsyslogd的新特点: ?基于TCP网络协议传输日志信息; ?更安全的网络传输方式: ?有日志消息的及时分析框架: ?后台数据库: ?配置文件中可以写简单的逻辑判断: ?与sysl

MySQl Study学习之--MySQl二进制日志管理

MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log):   a.它包含的内容及作用如下:    包含了所有更新了数据或者已经潜在更新了数据(比如没有匹配任何行的一个DELETE)    包含关于每个更新数据库(DML)的语句的执行时间信息    不包含没有修改任何数据的语句,如果需要启用该选项,需要开启通用日志功能    主要目的是尽可能的将数据库恢复到数据库故障点,因为二进制日志包含备份后进行的所有更新    用于在主复制服务器上记录所有将发送

ABP日志管理

ABP日志管理 基于DDD的现代ASP.NET开发框架--ABP系列之8.ABP日志管理 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由东莞-天道提供翻译 Server side(服务器端) ASP.NET Boilerplate使用Castl

SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)

首先我们为什么需要做日志管理,在现实的上线中我们经常会遇到系统出现异常或者问题.这个时候就马上打开CRT或者SSH连上服务器拿日子来分析.受网络的各种限制.于是我们就想为什么不能直接在管理后台查看报错的信息呢.于是日志管理就出现了. 其次个人觉得做日志管理最好的是Aop,有的人也喜欢用拦截器.都可以,在此我重点介绍我的实现方式. Aop有的人说拦截不到Controller.有的人说想拦AnnotationMethodHandlerAdapter截到Controller必须得拦截org.sprin

java程序日志管理

初入软件开发这一行的人,可能对日志管理的概念并不是很明确,大概是由于经验所限,以至于根本还考虑不到这个问题. 而从某种意义上来说,日志管理实际上也不需要初入这一行的人来管,他们只需要负责实现自己的主要业务逻辑和功能就好了. 我当初刚入行的时候就有很长一段时间完全不用去关心日志,到后来偶尔涉及到的时候,也都是从其他地方采用cv大法直接搬用. 不过,随着工作时间的变化,随着手头上任务重要程度的变化,也随着接触到的项目数量的变化,让我越来越意识到日志的重要性,它在整个系统中发挥着至关重要的作用! 尤其