下面是详细讲解“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"
}
}
}
这个配置文件定义了三个输出器,分别输出到 stdout
、logs/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技术站