使用 log4js UDP 发送数据到 logstash
本文地址 http://www.cnblogs.com/jasonxuli/p/6532723.html
因为 nodejs 一般会部署在多台机器,并且每台机器会起多个进程,因此查看日志时往往要人工区分一个完整的请求包含哪些行。如果在日志中添加 服务器名称和进程id,就比较容易了。
如果在 filebeat 配置中修改正则表达式肯定是可以完成这个工作的,但今天发现 log4js(1.1.1版本) 的模块 logstashUDP 支持通过 UDP 直接发送数据到 logstash,这就更自由了,这样就不用在每台机器上跑 filebeat。
这里我们假定已经配置好了 ELK。EKL 配置方法参见本博客文章 http://www.cnblogs.com/jasonxuli/p/6397244.html
根据 logstashUDP 的代码,以 log4js.getLogger().info("message", arg1) 为例,第二个参数 arg1 会被作为 kv 结构,与 appender 配置中的 fields 对象合并,然后发送给 logstash。
也就是说,如果 arg1 = {"customField1": "", "customField2": ""},那么最终在 elasticsearch 中,数据大体结构为: {"fields.customField1": "", "fields.customField2": ""}。
appender 配置:
var logLayout = {
type:"pattern",
pattern: "%h %x{pid} [%d] [%p] %c > %m",
tokens: {
pid: function () {
return process.pid
}
}
};
appenders : [
{
type: "console",
layout : logLayout
},
{
type : "logstashUDP", // 定义默认的 appender
level : "ALL",
layout : logLayout, // 自定义 layout
host : "192.168.1.123",
port : "5050",
fields : { // fields 会和 第二个参数 arg1 合并,然后发送给 logstash;并且这个 fields 会作为 config.fields 用于之后每次日志事件
machine : os.hostname(), // 指定机器名
processId: process.pid // 指定线程ID
}
}
],
replaceConsole: true
}
如果想要动态指定某个字段的值,需要包装一下 logger 的各个方法:
exports.logger = function getLogger (moduleName) {
var l = log4js.getLogger(moduleName);
l.trace = wrapper(l.trace);
l.debug = wrapper(l.debug);
l.info = wrapper(l.info);
l.warn = wrapper(l.warn);
l.error = wrapper(l.error);
l.fatal = wrapper(l.fatal);
return l;
};
function wrapper(func){
return function(message){
var data = {log: Array.prototype.join.call(arguments, ', ')}; // 拼接原始log参数;logger.info("attr1", "attr2"), 那么不会把 "attr2" 当做 data 发给 logstash
return func.call(this, data.log, data); // 这里默认传递 data 参数给 logstash,不需要在每次 info() 时手动传递第二个参数
}
}
logstash 的配置, /etc/logstash/conf.d/first-pipeline.conf
input {
beats {
port => "5043"
}
udp {
port => "5050"
codec => json // 这一行一定要指定
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
if [fields][category] != "memory" { // 因为 logstashUDP 模块会将第二个参数合并到 config.fields 中, [][] 的结构用于指定二级字段 fields.category
elasticsearch {
hosts => [ "192.168.20.50:9200" ]
index => "vrslog-%{+YYYY.MM.dd}"
}
}
if [fields][category] == "memory" { // 为 memory 日志生成单独的 elasticsearch 索引
elasticsearch {
hosts => [ "192.168.20.50:9200" ]
index => "memory-%{+YYYY.MM.dd}"
}
}
}
使用 log4js UDP 发送数据到 logstash的更多相关文章
- 通过 UDP 发送数据的简单范例
package j2se.core.net.udp; import java.io.IOException;import java.net.DatagramPacket;import java.net ...
- Java使用UDP发送数据到InfluxDB
最近在做压测引擎相关的开发,需要将聚合数据发送到InfluxDB保存以便实时分析和控制QPS. 下面介绍对InfluxDB的使用. 什么是InfluxDB InfluxDB是一款用Go语言编写的开源分 ...
- TCP和UDP发送数据包的大小问题
用UDP协议发送时,用sendto函数最大能发送数据的长度为:65535-20-8=65507字节,其中20字节为IP包头长度,8字节为UDP包头长度.用sendto函数发送数据时,如果指的的数据长度 ...
- CocoaAsyncSocket UDP发送数据超过包大小限制(Message too long)
最近在做iOS上,基于UDP传输音视频时遇到的一个问题,这边纪录一下: 由于考虑实时性比较高,所以采用了 CocoaAsyncSocket 的UDP框架来实现,将视频切割成一帧帧的图片发给服务端,不过 ...
- PL/SQL 调用JAVA使用UDP发送数据
步骤如下 1.直接在SQL命令中写入JAVA代码(用SYS帐号执行,不然权限等太麻烦) create or replace and resolve java source named udp as i ...
- android 使用UDP发送数据 DatagramSocket 创建对象为null
DatagramSocket socket=null; try { socket = new DatagramSocket(); //这里创建对象为空 } catch (SocketExceptio ...
- Android(java)学习笔记80:UDP协议发送数据
UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: 1 package cn.itcast_02; import java.io.IOException; import java.net. ...
- Android(java)学习笔记20:UDP协议发送数据
1. UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: package cn.itcast_02; import java.io.IOException; import java.net ...
- uip UDP server广播模式(client能够随意port,而且主动向client发送数据)
眼下移植uip,发现UDP server模式下,必须指定本地port以及clientport,否则仅仅能讲clientport设置为0,才干接收随意port的数据,可是无法发送数据,由于此时clien ...
随机推荐
- poj_3274 哈希
哈希 Hash 哈希是一种将复杂数据转换为线性数据从而可以进行随机访问的查找算法. 哈希经常用于对复杂数据(如结构体.对象等)的查找,在使用的时候,需要定义一个Hash函数,将需要查找的复杂对象转化为 ...
- [置顶] think in java interview-高级开发人员面试宝典代码示例
下载资源地址为: http://download.csdn.net/detail/lifetragedy/6379755 这是think in java interview中的代码示例,包括JAVA基 ...
- java基础---->多线程之ThreadLocal(七)
这里学习一下java多线程中的关于ThreadLocal的用法.人时已尽,人世还长,我在中间,应该休息. ThreadLocal的简单实例 一.ThreadLocal的简单使用 package com ...
- React基础---->ReactJS的使用(一)
ReactJS的初次使用,比较简单的例子. React的使用 一.下载ReactJS,地址:http://reactjs.cn/react/downloads.html,直接解压就行. 二.在html ...
- LeetCode——Kth Largest Element in an Array
Description: Find the kth largest element in an unsorted array. Note that it is the kth largest elem ...
- [SCOI2008] 着色方案[高维dp]
321. [SCOI2008] 着色方案 ★★★ 输入文件:color.in 输出文件:color.out 简单对比时间限制:1 s 内存限制:64 MB 题目背景: 有n个木块排成一 ...
- WEB安全番外第二篇--明日之星介绍HTML5安全问题介绍
一.CORS领域问题: 1.CORS的介绍请参考:跨域资源共享简介 2.HTML5中的XHR2级调用可以打开一个socket连接,发送HTTP请求,有趣的是,上传文件这里恰恰是multi-part/f ...
- 【BZOJ3280】小R的烦恼 最小费用最大流
[BZOJ3280]小R的烦恼 Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的 ...
- Webpack基础入门学习笔记
# Webpack Project Build 1.创建一个项目目录文件夹 如:D:/demo 2.打开demo文件夹,按住Shift + 鼠标右键,选择[在此处打开命令窗口] 3.初始化npm,生成 ...
- ZOJ 3209 Treasure Map(精确覆盖)
Treasure Map Time Limit: 2 Seconds Memory Limit: 32768 KB Your boss once had got many copies of ...