Nodejs Express 通过log4js写日志到Logstash(ELK)

下面是详细讲解“Nodejs Express 通过log4js写日志到Logstash(ELK)”的完整攻略:

什么是ELK?

ELK 是 ElasticSearch、Logstash、Kibana 三个开源软件的缩写。

  • ElasticSearch 是一个基于Lucene搜索引擎构建的开源搜索和数据分析引擎,可以用于全文检索、结构化搜索、统计分析等领域。
  • Logstash 是一个数据采集、转换和传输工具,可以实时采集和处理来自多种来源的数据,完成数据清洗、格式转换和数据传输等任务。
  • Kibana 是一个数据可视化和分析工具,它可以使用 ElasticSearch 作为后端存储来展现和分析数据。

Node.js应用如何将日志写入ELK?

Node.js 应用可以通过 log4js 模块将日志输出到文件或控制台,log4js 还支持多种输出方式,其中包括输出到 Logstash 的 TCP 输入插件,从而实现数据的实时传输到 ELK 中。

以下是具体的实现过程:

1. 安装配置log4js

npm install log4js

在项目中使用配置文件 log4js.json

{
  "appenders": {
    "out": {
      "type": "stdout",
      "layout": {
        "type": "coloured"
      }
    },
    "errors": {
      "type": "dateFile",
      "filename": "logs/errors/error.log",
      "alwaysIncludePattern": true,
      "pattern": "-yyyy-MM-dd"
    },
    "logstash": {
      "type": "@log4js-node/logstashudp",
      "host": "127.0.0.1",
      "port": "5000",
      "fields": {
        "environment": "dev",
        "component": "nodejs-express"
      },
      "layout": {
        "type": "pattern",
        "pattern": "%m"
      }
    }
  },
  "categories": {
    "default": {
      "appenders": [
        "out",
        "errors",
        "logstash"
      ],
      "level": "all"
    }
  }
}

这个配置文件定义了三个输出器,分别输出到 stdoutlogs/errors/error.log、logstash 的 TCP 输入插件。

2. 启动Logstash

可以使用 Docker 启动一个 ELK 环境:

docker run -d -p 5601:5601 -p 9200:9200 -p 5000:5000 -v /path/to/logstash.conf:/config-dir/logstash.conf -v /path/to/logs:/logs --name elk sebp/elk

其中 /path/to/logstash.conf 是你的 Logstash 配置文件所在的路径, /path/to/logs 是你的应用日志所在的路径。

Logstash 的配置文件示例如下:

input {
  tcp {
    port => 5000
  }
}

filter {
  json {
    source => "message"
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "logstash-%{+YYYY.MM.dd}"
    document_type => "_doc"
    codec => "json"
  }
}

该配置文件指定从TCP输入插件中读取数据,解析 JSON 格式后输出到 Elasticsearch 服务器中。

3. 在Node.js应用中输出日志

在 Node.js 应用中导入 log4js 模块:

const log4js = require('log4js')

使用 log4js 输出日志:

const logger = log4js.getLogger('app')

logger.debug('Hello world')
logger.info('Hello world')
logger.warn('Hello world')
logger.error('Hello world', { error: new Error('Something went wrong') })

其中第一个参数 'app' 是一个命名空间,用于区分不同的输出器。这里使用了 debug、info、warn、error 四个不同的级别来输出日志。

至此,我们已经完成了 Node.js 应用将日志写入 ELK 的过程。

示例1

以下是一个简单的 Express 应用,演示如何将日志输出到 ELK 中:

const express = require('express')
const log4js = require('log4js')

const app = express()

log4js.configure(require('./log4js.json'))
const logger = log4js.getLogger('app')

app.use((req, res) => {
  logger.info('Received request: %s %s', req.method, req.url)
  res.send('Hello world')
})

app.listen(3000, err => {
  if (err) {
    logger.error('Failed to start server', { error: err })
  } else {
    logger.info('Server started at http://localhost:3000')
  }
})

log4js.json 文件中,我们定义了三个输出器:out 输出到控制台,errors 输出到 logs/errors/error.log 文件,logstash 输出到 Logstash 的 TCP 输入插件。

运行应用:

node app.js

访问 http://localhost:3000,查看 ELK 界面,可以看到日志已经传输到 Logstash 中。

示例2

以下是一个使用 Express 和 mongoose 的应用,演示如何将错误信息写入 ELK 中:

const express = require('express')
const log4js = require('log4js')
const mongoose = require('mongoose')

const app = express()

log4js.configure(require('./log4js.json'))
const logger = log4js.getLogger('app')

mongoose.connect('mongodb://localhost:27017/myapp')

const db = mongoose.connection

db.on('error', err => {
  logger.error('Error connecting to MongoDB', { error: err })
})

db.once('open', () => {
  logger.info('Connected to MongoDB')
})

app.get('/users', (req, res) => {
  User.find((err, users) => {
    if (err) {
      logger.error('Error finding users', { error: err })
      res.send('Error finding users')
    } else {
      res.json(users)
    }
  })
})

app.listen(3000, err => {
  if (err) {
    logger.error('Failed to start server', { error: err })
  } else {
    logger.info('Server started at http://localhost:3000')
  }
})

该应用使用 mongoose 连接到 MongoDB 数据库,并在 /users 路由中查询所有用户信息,如果发生错误,将错误信息输出到 Logstash 中。

总结

通过 log4js,Node.js 应用可以实现将日志输出到多种目的地的功能,包括文件、控制台和 Logstash 等,实际应用中可以根据需要选择相应的输出方式。

以上就是“Nodejs Express 通过log4js写日志到Logstash(ELK)”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nodejs Express 通过log4js写日志到Logstash(ELK) - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 用Node提供静态文件服务的方法

    Node.js收到了前端开发者的热情欢迎,因为它能够运行JavaScript代码,让程序员可以在客户端和服务器端之间快速地切换。使用Node.js可以轻松地编写服务器端代码来完成各种任务,其中之一就是提供静态文件服务。本文将详细讲解使用Node.js提供静态文件服务的方法。 一、使用Node.js自带的http模块提供静态文件服务 Node.js自带http…

    node js 2023年6月8日
    00
  • 使用Express+Node.js对mysql进行增改查操作

    使用Express+Node.js对MySQL进行增、改、查操作的步骤如下: 安装依赖库 在终端输入以下命令: npm install express mysql –save 连接到MySQL数据库 在之前所述的程序文件中,require mysql 并定义数据库信息: const mysql = require(‘mysql’); const conne…

    node js 2023年6月8日
    00
  • nodejs模块系统源码分析

    来一篇关于 “nodejs模块系统源码分析” 的完整攻略吧! 什么是模块 总体来说,在Node.js中,每个文件都被视为一个模块,而模块是 Node.js 的核心概念之一。 模块系统是 Node.js 的一个重要组成部分,它是 Node.js 的一个基本特性。从它的名称我们可以知道,模块系统有助于将一个程序分解为更小、更易于维护的部分,这可以让开发者更容易地…

    node js 2023年6月8日
    00
  • nodejs 中的读取文件fs模块示例详解

    接下来我将为您详细讲解“nodejs 中的读取文件fs模块示例详解”的完整攻略。首先,先从 fs 模块的引入开始介绍。 引入 fs 模块 在 Node.js 中,fs 模块用于对文件系统进行操作,包括读写文件等功能。要使用 fs 模块,需要在文件开头进行模块引入: const fs = require(‘fs’); 读取文件 fs 模块中提供了多个方法用于读…

    node js 2023年6月8日
    00
  • React安装node-sass失败解决方案分享

    下面是关于“React安装node-sass失败解决方案分享”的完整攻略,包含了两条示例说明。 问题描述 在使用React项目中,当我们使用 npm install 安装依赖时,可能会遇到安装 node-sass 失败的问题,这个问题在Windows、Linux、MacOS等操作系统下都有可能出现。 解决方案 推荐两种解决方案。 方案一:使用cnpm cnp…

    node js 2023年6月8日
    00
  • nodejs进阶(6)—连接MySQL数据库示例

    Node.js 是一个非常流行的 JavaScript 运行时环境,可以用于开发服务器端应用程序。其中连接 MySQL 数据库是非常常见的需求,这里提供一个简单的示例来完成该操作。 步骤一:安装MySQL数据库 首先,需要在本地环境中安装 MySQL 数据库,以便连接和测试。MySQL 官方提供了可用于大多数操作系统的安装包和安装说明。一般来说,可以选择适合…

    node js 2023年6月8日
    00
  • 深入解析Nodejs中的大文件读写

    深入解析Node.js中的大文件读写 在Node.js中,文件是一个非常重要的数据源,对于处理大文件的读写尤其需要注意。本文将对如何在Node.js中处理大文件读写进行深入的讲解和探讨。 大文件读写的问题 当文件大小超过数百MB,甚至是GB级别时,使用Node.js自带File System模块读写文件就会出现性能瓶颈,甚至会造成阻塞,无法处理其他请求。主要…

    node js 2023年6月8日
    00
  • Node.js 中的 module.exports 与 exports区别介绍

    下面我将为你详细讲解“Node.js 中的 module.exports 与 exports区别介绍”的完整攻略。 什么是 exports 和 module.exports? 在Node.js中,module是一个特殊的对象,它代表当前模块(当前文件)的信息,如路径、引用等。exports是module对象的一个属性,它是一个空对象,它可以被其他模块中的代码…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部