NodeJS 后端开发 08 使用log4js打日志

简介: NodeJS 后端开发 08 使用log4js打日志日志是什么?

像记日记一样,日志是通过程序打印出来的,记录程序内部何时何处发生了什么事件。


本文只为使用学习为主,想对日志管理和分析有更深认识的可以看 => 日志原理与开发分析这篇完全指南就够了!适应各种规模


我们也用过console.log来打印一些调试信息,有什么区别呢?请读者带着这个问题往下读。


先安装

我们这里先安装一个日志的模快。


打开终端执行下面命令:


npm install log4js

npm install log4js

const log4js = require('log4js')
var logger = log4js.getLogger('雷学委开发日常')
logger.level = 'info'
logger.info('早上起床')
logger.info('拥抱太阳')
logger.info('吃完早餐')
logger.info('充满希望')
logger.info('开始了代码的一天')

保存上面代码为demo-fun.js ,然后运行:

node demo-fun.js

可以得到跟上面日志图片的效果,读完可以试试。

效果如下:

image.png

项目配置使用日志

log4js 可以基于代码配置日志规则,但是我们推荐使用json来配置。这是一个好习惯,虽然修改代码和配置都需要重启应用,但是可以通过程序实现让代码不重启也加载日志,这一点本文不作深入展示,后续补上。


代码配置日志

读者可以保存为demo2.js, 自行运行。


//demo2.js
const log4js = require("log4js");
//这里配置log4js使用fileAppender来输出“error”级别的日志。
//然后fileAppender是一个文件类型的日志累加器,输出日志到文件demo2.log
log4js.configure({
  appenders: { fileAppender: { type: "file", filename: "demo2.log" } },
  categories: { default: { appenders: ["fileAppender"], level: "error" } }
});
const logger = log4js.getLogger("demo");
//下面调用logger对象来打印一些日志。
logger.info("普通日志输出在这里!!!");
logger.error("雷学委,程序发现错误了,报警信息!");
logger.fatal("雷学委,这里通常是服务端/引擎吃不消了,打印严重错误日志。");

使用JSON配置log4js

把下面的内容保存为log4js.json

  • 定义了两个appender:fileAppender, stdout,分别写日志到文件和标准输出流。
  • 然后设置了default(默认)加载的appenders列表。
{
    "appenders": { 
        "fileAppender": { "type": "file", "filename": "leiXueWei.log" },
        "stdout": { "type": "stdout", "layout": {
             "type": "pattern",
              "pattern": "%d [%p] [%c] - %m%n"
         }}
     },
     "categories": {
         "default": { 
              "appenders": ["fileAppender","stdout"],
               "level": "info"
          }
      }
}

雷学委的 simpleweb.js 代码

const log4js = require("log4js");
const logCfg = require("./log4js.json")
console.log('logCfg:',logCfg)
log4js.configure(logCfg)
const logger = log4js.getLogger('雷学委Logger') 
const pid = require('process').pid
logger.info("process id:",pid)
const server = require('http').createServer((req,res)=>{
    console.log(new Date() + ' - visiting app:', req.url)
    logger.log('visiting app:', req.url)    
    res.write("Levin - Log4js DEMO - ProcessId: "+pid)
    res.end()
})
server.listen(8000,()=>{console.log('listening at 8000, pid:',pid)})

使用log4js打印日志效果图

image.png

当前项目路径中,可以找到下面日志文件leixuewei.log,我们查看发现console.log的信息都没有被记录。

image.png

log4js的logger 跟console.log的区别

console.log

通常是我们用来输出程序中间状态/事件等信息,也能像打印日志一样把日期其他数据都配套上,但是它更加轻便,而且不能写到文件中,打印方式也比较单一。


log4js提供logger给我们使用,这样我们可以log4js.getLogger(不同logger的名字),来区别的打印程序中间状态/事件等信息。

关键是能够写到文件中,这样方便我们以后回溯程序状态。


log数据很有用,必须让程序打印准确的信息

比如程序运营一个月后某段时间发现程序渲染页面特别慢。有了文件日志,我们可以轻松的进行统计分析,发现程序一些懒惰的bug,那些随着时间才能被发现的bug。


特别是一些多人协作的项目,一个开发可能不知道其他开发代码的逻辑,经过多次包装后,有可能出现一些诡异的循环,或者特定条件才执行的代码(比如根据节假日来展示活动的代码)。


很多问题在程序不被运行时,很难被发现,所以通过日志,可以记录并跟踪发现潜在问题,当然前提是,开发者得往程序中输出日志。


另外一个,就是不能盲目输出过多日志,访问主页,你打印1G的log数据,不光是占有硬盘还容易导致主页加载不出来。说的稍微夸张,但是品一品。


生产环境可用的log4js配置

好,刚好端午,附送一个适合生存环境使用的log4js.prod.json配置。 它定义了每天日志回滚,并保持30天的log数据,基本符合生产使用。


{
  "appenders": {
    "fileAppender": {
      "type": "dateFile",
      "daysToKeep": 30,
      "pattern": ".yyyyMMdd",
      "filename": "leixuewei.log",
      "layout": {
        "type": "pattern",
        "pattern": "%d [%p] [%c] - %m%n"
      }
    }
  },
  "categories": {
    "default": {
      "appenders": ["fileAppender"],
      "level": "info"
    }
  }
}

下面是pattern为“.yyyyMMddhhmm’ 是的日志滚动效果,读者自行下载代码修改尝试吧。

image.png

总结

博主给个小建议

  • 一定要打log,除非这个应用只有你维护不然出故障就是坑人。
  • 可能我们写了100行代码可以打印个2到3行,如果是一些特别复杂的业务可以多打点。
  • 同时使用不同级别的日志来打印。

这不是硬性标准,关键是反复使用中学会高效的使用日志系统。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
784 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1408 55
|
SQL JavaScript 安全
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
687 11
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
975 5
图解MySQL【日志】——Redo Log
|
JavaScript 前端开发 数据可视化
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
1089 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
|
缓存 Java 编译器
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
1797 13
|
人工智能 监控 JavaScript
HarmonyOS5云服务技术分享--ArkTS开发Node环境
本文详细讲解了在HarmonyOS(ArkTS API 9及以上)中使用云函数的开发技巧,结合Node.js和HTTP触发器,从零开始手把手教学。内容涵盖核心能力、开发流程(配置到部署)、高阶优化及常见问题解决,并提供实际应用场景示例。助你快速掌握Serverless开发,提升效率,探索跨端协作与AI集成等未来方向。