Log4j 是一个使用 Java 语言编写的,可靠、快速、灵活的日志框架(API),使用 Apache Software License 授权。它被移植到 C、C++、C#、Perl、Python、Ruby 和 Eiffel 语言中。
Log4j 是高度可配置的,在运行期使用外部的配置文件对其进行配置。它按照优先级别记录日志,并可将日志信息定向输出到各种介质,比如数据库、文件、控制台、Unix Syslog等。
Log4j 主要由三部分组成:
确认版本
"dependencies": { "body-parser": "1.18.3", "compression": "1.7.2", "cookie-parser": "1.4.3", "ejs": "2.6.1", "express": "4.16.3", "forever": "0.15.3", "http-proxy-middleware": "0.18.0", "log4js": "2.9.0", "log4js-logstash-tcp": "1.0.1", "serve-favicon": "2.5.0" },
Logstash配置
在我向logstash写日志之前,已经有同事向Logstash写过日志了。当时只是知道logstash的ip和端口,没有搞清楚协议,所以没有写进去。
logger
// filename: /logs/logger.js var log4js = require('log4js') // 获取配置文件中logstash的IP地址和端口 var {logHost, logPort} = require('../config/index.js') if (!logHost || !logPort) { console.log('ERROR not config logstash_host or logstash_port') } log4js.configure({ appenders: { console: { type: 'console' }, logstash: { // 因为我们的logstash暴露的是tcp写日志的端口,所以我用了log4js-logstash-tcp, // 这个需要安装 https://github.com/Aigent/log4js-logstash-tcp // 如果你的logstash使用UDP的,参考 https://github.com/log4js-node/logstashUDP type: 'log4js-logstash-tcp', host: logHost, port: parseInt(logPort) } }, categories: { default: { appenders: ['logstash'], level: 'debug' } } }) const logger = log4js.getLogger('default')
app.js
// filename: /app.js var express = require('express') var compression = require('compression') var path = require('path') var log4js = require('log4js') var proxyMiddleware = require('http-proxy-middleware') var cookieParser = require('cookie-parser') var logger = require('./logs/logger.js') // 这了引用了上面的logger var {proxyTable, maxAge} = require('./config/index.js') ... Object.keys(proxyTable).forEach(function (context) { if (!proxyTable[context].ws) { // 这里我是用的反向代理,当代理响应时,开始写日志 proxyTable[context].onProxyRes = writeLog } app.use(proxyMiddleware(context, proxyTable[context])) }) ... // 主要谢日日志的就是这里 function writeLog (proxyRes, req, res) { var baseLog = `${req.method} ${proxyRes.statusCode} ${req.cookies.email} ${req.url}` var msgObj = { method: req.method, statusCode: proxyRes.statusCode, url: req.url, email: req.cookies.email || '', sessionId: req.cookies.sessionId || '', instanceId: 'newTm', nodeName: 'newTm' } if (proxyRes.statusCode < 400) { logger.info(baseLog, msgObj) } else { logger.error(baseLog, msgObj) } }
在kibana中输入关键词:nodeName:newTm
可以搜到如下的记录
{ "_index": "logstash-2018.07.11", "_type": "logs", "_id": "AWSIGyY0vR6RLdfU8xZj", "_score": null, "_source": { "nodeName": "newTm", "method": "GET", "level": "INFO", "sessionId": "", "message": "GET 204 test.cc.com /api/touch?_=1531291286527", "url": "/api/touch?_=1531291286527", "@timestamp": "2018-07-11T06:53:29.059Z", "port": 57250, "@version": "1", "host": "192.168.2.74", "fields": { "nodeName": "newTm", "method": "GET", "level": "INFO", "sessionId": "", "category": "default", "url": "/api/touch?_=1531291286527", "email": "test.cc.com", "statusCode": 204 }, "category": "default", "email": "test.cc.com", "statusCode": 204 }, "fields": { "@timestamp": [ 1531292009059 ] }, "highlight": { "nodeName": [ "@kibana-highlighted-field@newTm@/kibana-highlighted-field@" ] }, "sort": [ 1531292009059 ] }
注意
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
问题内容: 当我启动logstash时,旧日志不会导入ES。 ES中仅记录新的请求日志。 现在我已经在文档中看到了。 即使设置了,也不会插入旧日志。 这仅在我在Linux上运行logstash时发生。 如果我使用相同的配置运行它,则会导入旧日志。 我什至不需要在Windows上进行设置。 有什么想法吗? 问题答案: 当您读取Logstash的输入日志时,Logstash会保留有关此文件上读取位置的
问题内容: 我是ELK堆栈的新手。我有一个文件拍服务,将日志发送到logstash,并在logstash中使用过滤器,将数据推送到索引。 我正在使用筛选器来解析数据。 我的问题是,我希望将字段名称及其值存储在elasticsearch索引中。我的日志的不同版本如下: 我想要的弹性索引字段如下: client_ip => type必须与kibana用于IP映射的内容兼容。 时间戳=>日期时间格式。=
我使用的是Spring Boot(1.5.4)。我希望通过RabbitMQ以JSON格式而不是纯文本将服务中的日志发送到Logstash。这将使我不必在Logstash端设置过滤器,以便可以在应用程序端控制格式化(使用Logback编码器)。 我知道RabbitMQ的Spring logback AMQP Appender,但是它使用的是布局(纯文本),而不是格式化的JSON。我想使用LogSta
问题内容: 我想从dnsmasq收集和处理日志,因此决定使用ELK。Dnsmasq用作DHCP服务器和DNS解析器,因此它为这两种服务创建日志条目。 我的目标是将所有包含请求者IP,请求者主机名(如果有)和请求者mac地址的DNS查询发送到Elasticsearch。这样一来,无论设备IP是否更改,我都可以按mac地址对请求进行分组,并显示主机名。 我想做的是以下几点: 1)阅读以下条目: 2)临
本文向大家介绍python 通过logging写入日志到文件和控制台的实例,包括了python 通过logging写入日志到文件和控制台的实例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 关于formatter的配置,采用的是%(<dict key>)s的形式,就是字典的关键字替换。提供的关键字包括: Format Description %(name)s Name of the logg
我的ec2实例上运行了几个Docker容器。 我想将这些容器中的日志直接保存到Logstash(弹性云)。 当我试图手动安装Filebeat时,一切正常。我使用 我把它拆开,换了文件。yml配置到 这很好,我可以在Kibana中搜索应用程序“myapp”后找到我的日志。 然而,当我试图从Docker运行Filebeat时,没有成功。 这是我的docker compose中的filebeat部分。y