logstash安装使用及使用filter处理日志示例

下载logstash(最好下载与es相同的版本,这里为了测试下载的低版本)

wget https://download.elastic.co/logstash/logstash/logstash-2.3.4.tar.gz

解压

tar -zxvf logstash-2.3.4.tar.gz

运行测试

# 使用标准输入输出
./logstash-2.3.4/bin/logstash -e 'input { stdin { } } output { stdout {} }'

# 使用标准输入输出,输出格式化为json
./logstash-2.3.4/bin/logstash -e 'input { stdin { } } output { stdout {codec => json} }'

# 加载配置文件启动
./logstash-2.3.4/bin/logstash -f logstash-simple.conf
# 加载多个配置文件启动
./logstash-2.3.4/bin/logstash -f .conf/*

logstash模式

logstash做的事情分三个阶段依次执行:输入——》处理filter(不是必须)——》输出
这里写图片描述

logstash配置文件

这里写图片描述

宏观配置文件格式

# 输入
input {
  ...
}

# 过滤器
filter {
  ...
}

# 输出
output {
  ...
}

配置文件示例1:

# 参考 https://www.jianshu.com/p/25ed5ed46682
# https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/filter/kv.html
# https://www.cnblogs.com/qq27271609/p/4762562.html

# 日志格式
# [log_time=2018-11-01 15:47:03] [level=ERROR] [app_name=logback_test] [version=1.0.0] [class=com.wk.logbackdemo.LogbackTest] test error


input {
        file {
                #add_field => {"project_name" => "battleship"}
                #tags => "tag1"
                path => ["/home/es-wk/logstash/logs/info/*.log","/home/es-wk/logstash/logs/debug/*.log","/home/es-wk/logstash/logs/warn/*.log","/home/es-wk/logstash/logs/error/*.log"]
                start_position => beginning
				sincedb_path => "/dev/null" #从头读  第一读取时就加上才会生效  后面再加需要用新的日志文件 测试用
				# 多行合并  日志中可能出现换行等,需要根据规则合并,如下注释是根据每行开头匹配其是不是另一条日志
#				codec => multiline {
#					pattern => "^%{TIMESTAMP_ISO8601} "
#					negate => true
#					what => previous
#               }
        }
}

# 可写多个  内部顺序执行
filter {
		mutate {
				# 替换掉开头的[
				gsub => ["message", "\[", ""]
				# 根据]分割字段
				split => ["message", "] "]

				add_field => { "log_time" => "%{[message][0]}"}
				add_field => { "level" => "%{[message][1]}"}
				add_field => { "app_name" => "%{[message][2]}"}
				add_field => { "version" => "%{[message][3]}"}
				add_field => { "class" => "%{[message][4]}"}
				rename => ["host", "host_name"]
        }

		kv {
			#include_keys => ["log_time", "level", "version", "class"]
				field_split => "="
		}

		mutate {
				replace => {"message" => "%{[message][5]}"}
		}
		
		# 提取年份 月份 日期
		grok {
			match => ["log_time", "(?<YYYY>\d{4})-(?<MM>\d{1,2})-(?<DD>\d{1,2})"]
		}
}

output {
        elasticsearch{
			hosts => ["127.0.0.1:19200"]
			index => "%{app_name}-%{YYYY}-%{MM}"
			user => "elastic" 
			password => "changme"
		}
		# 调试用
		stdout { codec => rubydebug }
}

配置文件示例2:

# 日志格式: 2018-12-14 16:49:21 [INFO] [TxId : Alien_axx21x003^1544669102193^46037 , SpanId : 2452398774611903875] com.dao.base.BaseDao.selectRowValueEqual selectRowValueEqual -->select * from ltemplate_style where  template_id = ? and type = ? order by create_time desc

input {
		stdin{
		}
#		beats {
#	    	port => "5044"     
#	    }	
#        file {
#                #add_field => {"project_name" => "battleship"}
#                #tags => "tag1"
#                path => ["/home/es-wk/logstash/logs/info/*.log","/home/es-wk/logstash/logs/debug/*.log","/home/es-wk/logstash/logs/warn/*.log","/home/es-wk/logstash/logs/error/*.log"]
#                start_position => beginning
#				sincedb_path => "/dev/null" #从头读  第一读取时就加上才会生效  后面再加需要用新的日志文件 测试用
#				# 多行合并  日志中可能出现换行等,需要根据规则合并,如下注释是根据每行开头匹配其是不是另一条日志
#				codec => multiline {
#					pattern => "^%{TIMESTAMP_ISO8601} "
#					negate => true
#					what => previous
#               }
#        }
}

# 可写多个  内部顺序执行
filter {
        # 正则提取数据 ruby的正则
        grok {
            match => {"message" => "%{TIMESTAMP_ISO8601:log_time}"}
        }
         grok { 
			match => { "message" => "(?<level>(?<=\[)\w+(?=\]))" }
        }
        grok {
            match => {"message" => "(?<tx_id>(?<=\[TxId\s:\s)\S+(?=\s,))"}
        }
        grok {
            match => {"message" => "(?<span_id>(?<=,\sSpanId\s:\s)\S+(?=\s*\]))"}
        }
		grok {
			match => {"message" => "(?<message>(?<=[0-9]\]\s)[\s\S]*(?=$))"}
		}
        # message只保留提示信息
		mutate {
				replace => {"message" => "%{[message][1]}"}
		}
		
		# 提取年份 月份 日期
		grok {
			match => ["log_time", "(?<YYYY>\d{4})-(?<MM>\d{1,2})-(?<DD>\d{1,2})"]
		}
}

output {
        #elasticsearch{
		#	hosts => ["127.0.0.1:19200"]
		#	index => "log-%{YYYY}-%{MM}-%{app_name}"
		#	user => "elastic" 
		#	password => "changme"
		#}
		# 调试用
		stdout { codec => rubydebug }
}

示例3:(任意数量[k=v]格式日志清洗)

input {
  beats {
   port => 5044
  }
  # stdin{}
}

#[log_time=$time_iso8601] [real_ip=$http_x_forwarded_for] [client_ip=$remote_addr]	[status=$status] [request_time=$request_time] [uri=$request_uri] [referer=$http_referer][request=$request] [upstream_addr=$upstream_addr] [upstream_status=$upstream_status] [upstream_response_time=$upstream_response_time] [agent=$agent] [request_length=$request_length] [bytes_sent=$bytes_sent]  


# docker run --rm -it -v /Users/wk/Desktop/logstash-online.conf:/usr/share/logstash/pipeline/logstash.conf docker.elastic.co/logstash/logstash:6.4.2
# [timestamp=2019-02-28 10:24:05.981] [level=DEBUG] [tx_id=] [span_id=] [bu_id=AXX] [app_id=AXX001] [msg=[xxx=111]] xxx=1111

# [timestamp=2019-03-12 14:13:09.267] [level=WARN] [tx_id=] [span_id=] [bu_id=AXX] [app_id=AXX001] Sync config from upstream redis.basic?ip=131 [Cause: Could not complete get operation [Cause: Read timed out]]

filter {
    # (?!=\s)
  	grok {
    #     match => {"message" => "(?<message_fmt>((\[[\s\S]+\] )+))"}
        match => {"message" => "(?<message_fmt>((\[[\s\S]+?\] *)+))"}
    }
    kv {
        # kv化的源内容
        source => "message_fmt"
        # 多个kv的切割符
        field_split_pattern => "\] "
        # k的前缀
        # prefix => "["
        # kv的分割符
        value_split => "="
        # 去掉key的首尾字符
        trim_key => "\[\]"
        # 去掉value的首尾字符
        trim_value => "\[\]"
        # 是否递归取值
        recursive => "false"
        # 是否包含各种括号
        include_brackets => "false"
        # 是否允许多个相同的key存在(存在时会组成数组)
        allow_duplicate_values => false
    }
    date {
	    match => ["timestamp", "yyyy-MM-dd HH:mm:ss.SSS"]
	  }
    mutate {
      remove_field => "%{}"
	   lowercase => ["app_id"]
    #  remove_field => "message_fmt"
	   remove_field => "timestamp"
	   # filebeat字段
	   remove_field => "tags"
	   remove_field => "prospector"
	   remove_field => "input"
	   remove_field => "prospector"
     remove_field => "offset"
    #  remove_field => "host"
	  }
}

output {
# 调试用
  stdout { codec => rubydebug }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Linux上安装Logstash,您可以按照以下步骤操作: 1. 下载Logstash安装包,可以从官方网站或者其他可靠的下载站点获取。 2. 解压安装包到您想要安装的目录。 3. 配置Logstash的配置文件,包括输入、过滤和输出等。 4. 启动Logstash服务,可以使用命令行或者系统服务管理工具。 5. 测试Logstash是否正常工作,可以使用一些测试数据来验证Logstash是否正确地处理了数据。 需要注意的是,安装Logstash之前需要确保您的系统已经安装了Java运行环境。另外,Logstash的配置文件需要根据您的具体需求进行调整,以确保能够正确地处理数据。 ### 回答2: Logstash是一款用于数据处理的开源工具,可以将各种不同格式的数据从不同的来源采集、转换、过滤和输出。对于Linux系统,安装Logstash需要经过以下步骤: 1. 下载并安装Java环境。Logstash需要运行在Java环境中,因此需要先安装Java。可以在终端中输入以下命令进行安装: sudo apt-get install default-jre 2. 下载并安装Logstash包。在官网下载Logstash的最新版,解压并安装。以下命令将Logstash包下载到本地: wget https://artifacts.elastic.co/downloads/logstash/logstash-7.14.0.tar.gz 解压Logstash包: tar -xzvf logstash-7.14.0.tar.gz 3. 配置Logstash。可以在/etc/logstash目录中创建一个新的配置文件,例如myconfig.conf,并编辑它以指定需要采集、转换、过滤和输出的数据。以下是一个简单的配置示例,它从stdin输入接收数据并将其发送到stdout输出: input { stdin {} } output { stdout {} } 4. 启动Logstash。可以在命令行中输入以下命令来启动Logstash: cd logstash-7.14.0/bin/ ./logstash -f /etc/logstash/myconfig.conf 运行Logstash后,可以使用Ctrl+C键来停止它。 5. 配置Logstash以作为服务运行。为了更方便地管理Logstash,可以将它配置为作为服务运行。以下是在systemd下配置Logstash服务的命令: sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable logstash.service sudo /bin/systemctl start logstash.service 以上是在Linux系统上安装Logstash的基本步骤。要注意的是,在配置Logstash时,需要注意采集和处理数据的输入和输出,以使其能够顺利地完成数据管道的工作。同时,应根据实际需求进行配置,以满足具体的业务需求,提高数据处理的效率和精度。 ### 回答3: Logstash是一个在开源社区中广泛使用日志收集和处理工具。它能够从多种数据源中获取任意类型的数据,经过过滤和转换后,将其输出到各种目标数据存储中。在本文中,我们将讨论如何在Linux系统中安装Logstash。 步骤一:安装Java Logstash是基于Java编写的,因此必须先在系统中安装Java。打开终端,输入以下命令,安装Java: $ sudo apt-get install openjdk-8-jre 步骤二:下载和设置Logstash安装Logstash之前,我们需要先从官网下载Logstash工具。首先在Web浏览器中访问https://www.elastic.co/cn/downloads/logstash并选择适合自己系统的Logstash版本。 下载完成后,我们需要将下载的压缩包解压到本地。 $ tar xvf logstash-6.5.1.tar.gz 解压完成后,进入目录 logstash-6.5.1/bin,并启动Logstash: $ ./logstash -e 'input { stdin { } } output { stdout { } }' -e参数允许我们以命令行方式启动Logstash,它将会从标准输入(input)获取任何输入,并输出到标准输出(output)。因此,我们将在终端中看到输入的任何内容,并直接输出到屏幕中。 步骤三:配置Logstash 启动Logstash后,我们需要编辑配置文件,以将其与数据源进行连接。Logstash的配置文件通常存储在 /etc/logstash/conf.d 目录中。我们创建以下文件,来配置Logstash: $ sudo nano /etc/logstash/conf.d/apache.conf 输入以下内容: input { beats { port => 5044 } } filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } date { match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ] } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } } 该配置定位了数据输入端口 5044,并设置了数据格式过滤器。然后,将数据输出到Elasticsearch和标准输出流。 步骤四:启动Logstash服务 启动Logstash作为服务,以增强稳定性和自动化。通过以下命令启动Logstash: $ sudo systemctl start logstash 可以通过以下命令查看服务的状态: $ sudo systemctl status logstash 如果输出的状态显示“active (running)”表示服务运行正常。 此外,我们还可以使用以下命令开启自动启动: $ sudo systemctl enable logstash 以上就是Linux安装Logstash的流程。Logstash具有强大的数据采集能力,可以快速地获取和过滤数据,非常适合进行分布式系统数据分析和处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值