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://github.com/nomiddlename/log4js-node   

https://github.com/gcfeng/booklist

 

 

 

 

 

转载于:https://www.cnblogs.com/yjfengwen/p/3827217.html

内容概要:该论文探讨了一种基于粒子群优化(PSO)的STAR-RIS辅助NOMA无线通信网络优化方法。STAR-RIS作为一种新型可重构智能表面,能同时反射和传输信号,与传统仅能反射的RIS不同。结合NOMA技术,STAR-RIS可以提升覆盖范围、用户容量和频谱效率。针对STAR-RIS元素众多导致获取完整信道状态信息(CSI)开销大的问题,作者提出一种在不依赖完整CSI的情况下,联合优化功率分配、基站波束成形以及STAR-RIS的传输和反射波束成形向量的方法,以最大化总可实现速率并确保每个用户的最低速率要求。仿真结果显示,该方案优于STAR-RIS辅助的OMA系统。 适合人群:具备一定无线通信理论基础、对智能反射面技术和非正交多址接入技术感兴趣的科研人员和工程师。 使用场景及目标:①适用于希望深入了解STAR-RIS与NOMA结合的研究者;②为解决无线通信中频谱资源紧张、提高系统性能提供新的思路和技术手段;③帮助理解PSO算法在无线通信优化问题中的应用。 其他说明:文中提供了详细的Python代码实现,涵盖系统参数设置、信道建模、速率计算、目标函数定义、约束条件设定、主优化函数设计及结果可视化等环节,便于读者理解和复现实验结果。此外,文章还对比了PSO与其他优化算法(如DDPG)的区别,强调了PSO在不需要显式CSI估计方面的优势。
在Node.js中实现日志记录功能是开发过程中非常重要的一个环节,它有助于调试、监控和分析应用程序的行为。日志记录可以通过多种方法和工具来实现,包括Node.js内置模块以及第三方库。 ### 使用内置模块 `console` 最简单的方式是使用Node.js的内置模块`console`。该模块提供了基本的日志记录功能,例如`console.log()`、`console.error()`、`console.warn()`等方法。这些方法可以将信息、警告和错误输出到控制台。 ```javascript console.log('这是一个信息日志'); console.warn('这是一个警告日志'); console.error('这是一个错误日志'); ``` 尽管这种方式简单易用,但它缺乏灵活性和高级功能,如日志级别控制、日志文件滚动等[^1]。 ### 使用第三方库 `winston` 对于更复杂的日志记录需求,推荐使用第三方库,如`winston`。`winston`是一个功能强大的日志库,支持多种传输方式(如控制台、文件、HTTP等),并且可以轻松地配置不同的日志级别。 安装`winston`可以通过npm命令: ```bash npm install winston ``` 以下是一个简单的`winston`配置示例,展示了如何将日志同时输出到控制台和文件: ```javascript const winston = require('winston'); const { format, transports } = winston; const { combine, printf } = format; const myFormat = printf(({ level, message, timestamp }) => { return `${timestamp} [${level}]: ${message}`; }); const logger = winston.createLogger({ level: 'debug', format: combine( format.timestamp(), myFormat ), transports: [ new winston.transports.Console(), new winston.transports.File({ filename: 'combined.log' }) ] }); logger.info('这是一个信息日志'); logger.error('这是一个错误日志'); ``` ### 使用 `morgan` 中间件 如果你正在开发一个基于Express的应用程序,`morgan`是一个非常流行的HTTP请求日志记录中间件。它可以自动记录每个HTTP请求的详细信息,非常适合用于Web应用的日志记录需求。 安装`morgan`: ```bash npm install morgan ``` 在Express应用中使用`morgan`: ```javascript const express = require('express'); const morgan = require('morgan'); const app = express(); app.use(morgan('tiny')); // 可以选择不同的预设格式,如 'dev', 'combined' 等 app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(3000, () => { console.log('App listening on port 3000'); }); ``` 通过以上方法,你可以根据自己的需求选择合适的方式来实现Node.js中的日志记录功能。无论是简单的控制台输出还是复杂的日志文件管理和远程日志发送,都有相应的解决方案可供选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值