从文件中流式传输事件,通常通过以类似于tail -0F但可选地从头读取它们的方式拖尾。
通常,日志记录会在写入的每一行的末尾添加一个换行符。默认情况下,每个事件被假定为一行,并且一行被视为换行符之前的文本。如果您想将多个日志行加入一个事件,您需要使用多行编解码器。该插件在发现新文件和处理每个发现的文件之间循环。发现的文件具有生命周期,它们以“已监视”或“已忽略”状态开始。生命周期中的其他状态是:“active”、“closed”和“unwatched”
默认情况下,使用 4095 个文件的窗口来限制正在使用的文件句柄数。处理阶段有多个阶段:
检查自上次以来“关闭”或“忽略”文件的大小是否发生了变化,如果是,则将它们置于“已监视”状态。
选择足够多的“监视”文件来填充窗口中的可用空间,这些文件被“激活”。
活动文件被打开和读取,每个文件默认从最后一个已知位置读取到当前内容(EOF)的末尾。
在某些情况下,能够控制首先读取哪些文件、排序以及文件是完全读取还是条带化/条带化是很有用的。完整的阅读是所有的文件中的文件,然后B,则对文件C等。条带或条带读取是文件 A 的一部分,然后是文件 B,然后是文件 C,依此类推,再次循环到文件 A,直到读取所有文件。带状阅读是通过更改file_chunk_count和可能指定的 file_chunk_size。如果您希望所有文件中的某些事件尽早出现在 Kibana 中,分块和排序可能会很有用。
该插件有两种操作模式,Tail 模式和 Read 模式。
尾部模式编辑
在这种模式下,插件旨在跟踪更改的文件并在附加到每个文件时发出新内容。在这种模式下,文件被视为永无止境的内容流,EOF 没有特殊意义。该插件始终假设会有更多内容。旋转文件时,检测到较小或零大小,当前位置重置为零并继续流式传输。必须先看到分隔符,然后才能将累积的字符作为一行发出。
阅读模式编辑
在这种模式下,插件将每个文件视为内容完整,即有限的行流,现在 EOF 很重要。不需要最后一个分隔符,因为 EOF 意味着累积的字符可以作为一行发出。此外,这里的 EOF 意味着可以关闭文件并将其置于“未监视”状态 - 这会自动释放活动窗口中的空间。此模式还可以处理内容完整的压缩文件。读取模式还允许在完全处理文件后执行操作。
参数名称 | 类型 | 默认值 | 描述信息 |
---|---|---|---|
add_field | hash | {} | 用于向Event中添加字段 |
close_older | number | 3600 | 设置文件多久秒内没有更新就关掉对文件的监听 |
codec | string | “plain” | 输入数据之后对数据进行解码 |
delimiter | string | “\n” | 文件内容的行分隔符,默认按照行进行Event封装 |
discover_interval | number | 15 | 间隔多少秒查看一下path匹配对路径下是否有新文件产生 |
enable_metric | boolean | true | |
exclude | array | 无 | path匹配的文件中指定例外,如:path => “/var/log/“;exclude =>”.gz” |
id | string | 无 | 区分两个相同类型的插件,比如两个filter,在使用Monitor API监控是可以区分,建议设置上ID |
ignore_older | number | 无 | 忽略历史修改,如果设置3600秒,logstash只会发现一小时内被修改过的文件,一小时之前修改的文件的变化不会被读取,如果再次修改该文件,所有的变化都会被读取,默认被禁用 |
max_open_files | number | 无 | logstash可以同时监控的文件个数(同时打开的file_handles个数),如果你需要处理多于这个数量多文件,可以使用“close_older”去关闭一些文件 |
path | array | 无 | 必须设置项,用于匹配被监控的文件,如“/var/log/.log”或者“/var/log/*/*.log”,必须使用绝对路径 |
sincedb_path | string | 无 | 文件读取记录,必须指定一个文件而不是目录,文件中保存没个被监控的文件等当前inode和byteoffset,默认存放位置“$HOME/.sincedb*” |
sincedb_write_interval | number | 15 | 间隔多少秒写一次sincedb文件 |
start_position | “beginning”,“end” | ” end” | 从文件等开头还是结尾读取文件内容,默认是结尾,如果需要导入文件中的老数据,可以设置为“beginning”,该选项只在第一次启动logstash时有效,如果文件已经存在于sincedb的记录内,则此配置无效 |
stat_interval | number | 1 | 间隔多少秒检查一下文件是否被修改,加大此参数将降低系统负载,但是增加了发现新日志的间隔时间 |
tags | array | 无 | 可以在Event中增加标签,以便于在后续的处理流程中使用 |
type | string | Event的type字段,如果采用elasticsearch做store,在默认情况下将作为elasticsearch的type |
input {
file{
path => ["D:/lihua/javacode/jmqtt/iot-jmqtt/code/jmqttlogs/*.log","D:/lihua/javacode/jmqtt/iot-jmqtt/code/jmqttlogs/"]
type => "test"
exclude => ["brokerLog.log","remotingLog.log"]
}
}
解析任意文本并对其进行结构化。
Grok 是将非结构化日志数据解析为结构化和可查询的东西的好方法。
该工具非常适合 syslog 日志、apache 和其他网络服务器日志、mysql 日志,以及通常为人类而不是计算机使用编写的任何日志格式。
默认情况下,Logstash 附带了大约 120 种模式。你可以在这里找到它们:https : //github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns。你可以简单地添加你自己的。(见patterns_dir设置)
如果您需要帮助构建模式以匹配您的日志,您会发现 http://grokdebug.herokuapp.com和http://grokconstructor.appspot.com/应用程序非常有用!注意:这两个Grok 在线工具,解析日志需要使用。
空的配置项是很多插件通用的配置项,具体信息参考File插件
参数名称 | 类型 | 默认值 | 描述信息 |
---|---|---|---|
add_field | |||
add_tag | |||
break_on_match | boolean | true | match字段存在多个pattern时,当第一个匹配成功后结束后面的匹配,如果想匹配所有的pattern,将此参数设置为false |
enable_metric | |||
id | |||
keep_empty_captures | boolean | false | 如果为true,捕获失败的字段奖设置为空值 |
match | array | {} | 设置pattern数组: match=> {“message” => [“Duration: %{NUMBER:duration}”,”Speed: %{NUMBER:speed}”]} |
named_captures_only | boolean | true | If true, only store named captures from grok. |
overwrite | array | [] | 覆盖字段内容: match=> { “message” => “%{SYSLOGBASE} %{DATA:message}” } overwrite=> [ “message” ] |
patterns_dir | array | [] | 指定自定义的pattern文件存放目录,Logstash在启动时会读取文件夹内patterns_files_glob 匹配的所有文件内容 |
patterns_files_glob | string | “*” | 用于匹配patterns_dir中的文件 |
periodic_flush | boolean | false | 定期调用filter的flush方法 |
remove_field | array | [] | 从Event中删除任意字段: remove_field=> [ “foo_%{somefield}” ] |
remove_tag | array | [] | 删除“tags”中的值: remove_tag=> [ “foo_%{somefield}” ] |
tag_on_failure | array | [“_grokparsefailure”] | 当没有匹配成功时,将此array添加到“tags”字段内 |
tag_on_timeout | string | “_groktimeout” | 当匹配超时时,将此内容添加到“tags”字段内 |
timeout_millis | number | 30000 | 设置单个match到超时时间,单位:毫秒,如果设置为0,则不启用超时设置 |
filter {
grok {
match => { "message" => "(?%{TIMESTAMP_ISO8601}) \[%{LOGLEVEL:loglevel}\] (?[A-Za-z0-9$_.]+) – %{GREEDYDATA:messagebody}$" }
}
}
怎么获取匹配正则:
(?<timestamp>%{TIMESTAMP_ISO8601}) \[%{LOGLEVEL:loglevel}\] (?<logger>[A-Za-z0-9$_.]+) – %{GREEDYDATA:messagebody}$
(?<timestamp>%{TIMESTAMP_ISO8601}) \[%{LOGLEVEL:loglevel}\] (?<logger>[A-Za-z0-9$_.]+) – %{GREEDYDATA:message}$
2021-11-24 16:18:57,270 [INFO] dispatcherMsgLog – {"clientId":"mqttx_50b1eb31","ip":"/127.0.0.1:54457","logType":"Consumer","payload":"{\n \"id\": \"12\",\n \"name\":\"lihua\",\n \"age\":\"18\"\n}","topic":"testtopic/1"}
修改获取到的正则:
# 这里将后面的{GREEDYDATA:message} 改为{GREEDYDATA:messagebody},因为在event中已经存在了message这个field(字段)
(?<timestamp>%{TIMESTAMP_ISO8601}) \[%{LOGLEVEL:loglevel}\] (?<logger>[A-Za-z0-9$_.]+) – %{GREEDYDATA:messagebody}$
(?<timestamp>%{TIMESTAMP_ISO8601}) \[%{LOGLEVEL:loglevel}\] (?<logger>[A-Za-z0-9$_.]+) – %{GREEDYDATA:messagebody}$
2021-11-24 16:18:57,270 [INFO] dispatcherMsgLog – {"clientId":"mqttx_50b1eb31","ip":"/127.0.0.1:54457","logType":"Consumer","payload":"{\n \"id\": \"12\",\n \"name\":\"lihua\",\n \"age\":\"18\"\n}","topic":"testtopic/1"}
# 创建一个field(字段)key为timestamp,value为: 2021-11-24 16:18:57,270
# 创建一个field(字段)key为loglevel,value为: INFO
# 创建一个field(字段)key为logger,value为: dispatcherMsgLog
# 创建一个field(字段)key为messagebody,value为:{"clientId":"mqttx_50b1eb31","ip":"/127.0.0.1:54457","logType":"Consumer","payload":"{\n \"id\": \"12\",\n \"name\":\"lihua\",\n \"age\":\"18\"\n}","topic":"testtopic/1"}
Elasticsearch 为所有类型的数据提供近乎实时的搜索和分析。Elasticsearch 输出插件可以在 Elasticsearch 中存储时间序列数据集(例如日志、事件和指标)和非时间序列数据。
参数名称 | 类型 | 默认值 | 描述信息 |
---|---|---|---|
absolute_healthcheck_path | boolean | false | 当配置了“healthcheck_path”时,决定elasticsearch健康检查URL是否按照绝对路径配置。例如: elasticsearch访问路径为:”http://localhost:9200/es“,“healthcheck_path”为”/health”, 当前参数为true时的访问路径为:”http://localhost:9200/es/health“, 当前参数为false时的访问路径为:”http://localhost:9200/health” |
absolute_sniffing_path | boolean | false | 当配置了“sniffing_path”时,决定elasticsearch的sniffing访问路径配置。例如: elasticsearch访问路径为:“http://localhost:9200/es”,“sniffing_path”为“/_sniffing”, 当前参数为true时的访问路径为:“http://localhost:9200/es/_sniffing”, 当前参数为false时的访问路径为:“http://localhost:9200/_sniffing” |
action | string | “index” | 对elasticsearch的操作类型,可用的操作类型: index:索引Logstash事件数据到elasticsearch; delete:根据id删除文档,id必须指定; delete:根据id删除文档,id必须指定; update:根据id更新文档 |
cacert | string | 无 | .cer或者.pem证书文件路径,使用证书进行elasticsearch认证 |
codec | |||
doc_as_upsert | boolean | false | 使update启用upsert模式,即文档不存在时创建新文档 |
document_id | string | 无 | elasticsearch中的文档id,用来覆盖已经保存到elasticsearch中的文档 |
document_type | string | 无 | 指定存入elasticsearch中的文档的type,没有指定的情况下会使用Event信息中的“type”字段的值作为elasticsearch的type |
enable_metric | |||
failure_type_logging_whitelist | array | [] | elasricsearch报错白名单,白名单的异常信息不会被记入logstash的log中,比如你想忽略掉所有的“document_already_exists_exception”异常 |
flush_size | |||
healthcheck_path | string | “/” | elasricsearch检查状态检查路径 |
hosts | string | [//127.0.0.1] | elasticsearch服务地址列表,如果配置多个将启用负载均衡 |
id | |||
idle_flush_time | number | 1 | 间隔多长时间将数据输出到elasticsearch中一次,主要用于较慢的事件 |
index | string | “logstash-%{+YYYY.MM.dd}” | 指定elasticsearch存储数据时的所有名称,支持变量引用,比如你可以按天创建索引,方便删除历史数据或者查询制定范围内的数据 |
keystore | string | 无 | 用于指定密钥库路径,可以是.jks或者.p12 |
keystore_password | string | 无 | 密钥库密码 |
manage_template | boolean | true | 是否启用elasticsearch模版,Logstash自带一个模版,但是只有名称匹配“logstash-*”的索引才会应用该默版 |
parameters | hash | 无 | 添加到elasticsearch URL后面的参数键值对 |
parent | string | “nil” | 为文档子节点指定父节点的id |
password | string | 无 | elasticsearch集群访问密码 |
path | string | 无 | 当设置了elasticsearch代理时用此参数从定向HTTP API,如果“hosts”中已经包含此路径,则不需要设置 |
pipeline | string | “nil” | 设置Event管道 |
pool_max | number | 1000 | elasticsearch最大连接数 |
pool_max_per_route | number | 100 | 每个“endpoint”的最大连接数 |
proxy | string | 无 | 代理URL |
resurrect_delay | number | 5 | 检查挂掉的“endpoint”是否恢复正常的频率 |
retry_initial_interval | number | 2 | 设置批量重试的时间间隔,重试到 “retry_max_interval”次 |
retry_max_interval | number | 64 | Setmax interval in seconds between bulk retries. |
retry_on_conflict | number | 1 | Thenumber of times Elasticsearch should internally retry an update/upserteddocument |
routing | string | 无 | 指定Event路由 |
script | string | “” | 设置“scriptedupdate”模式下的脚本名称 |
script_lang | string | “painless” | 设置脚本语言 |
script_type | “inline”、“indexed”、 “file” | [“inline”] | Definethe type of script referenced by “script” variable inline :”script” contains inline script indexed : “script” containsthe name of script directly indexed in elasticsearch file : “script”contains the name of script stored in elasticseach’s config directory |
script_var_name | string | “event” | Setvariable name passed to script (scripted update) |
scripted_upsert | boolean | false | ifenabled, script is in charge of creating non-existent document (scriptedupdate) |
sniffing | |||
sniffing_delay | |||
sniffing_path | |||
ssl | |||
ssl_certificate_verification | |||
template | string | 无 | 设置自定义的默版存放路径 |
template_name | string | “logstash” | 设置使用的默版名称 |
template_overwrite | boolean | false | 是否始终覆盖现有模版 |
timeout | number | 60 | 网络超时时间 |
truststore | string | 无 | “:truststore”或者“:cacert”证书库路径 |
truststore_password | string | 无 | 证书库密码 |
upsert | string | “” | Setupsert content for update mode.s Create a new document with this parameter asjson string if document_id doesn’texists |
user | string | “” | elasticsearch用户名 |
validate_after_inactivity | number | 10000 | 间隔多长时间保持连接可用 |
version | string | 无 | 存入elasticsearch的文档的版本号 |
version_type | “internal”、“external”、 “external_gt”、 “external_gte”、“force” | 无 | |
workers | string | 1 | whenwe no longer support the :legacy type This is hacky, but it can only be herne |
output {
elasticsearch {
hosts => ["192.168.1.83:9200"]
index => "jmqttlogs-%{type}-%{logger}-%{loglevel}-%{+YYYY.MM}"
}
# 配置控制台输出插件
stdout { codec => rubydebug }
}
通过 TCP 套接字读取事件。
与标准输入和文件输入一样,每个事件都被假定为一行文本。
可以接受来自客户端的连接或连接到服务器,具体取决于mode.
参考文档
环境 | 输入类型 | 必需的 |
---|---|---|
|
布尔值 |
不 |
|
细绳 |
不 |
|
细绳 |
不 |
|
字符串,其中之一 |
不 |
|
数字 |
是的 |
|
布尔值 |
不 |
|
有效的文件系统路径 |
不 |
|
大批 |
不 |
|
布尔值 |
不 |
|
大批 |
不 |
|
有效的文件系统路径 |
不 |
|
密码 |
不 |
|
布尔值 |
不 |
|
布尔值 |
不 |
<Configuration>
<Appenders>
<Socket name="Socket" host="localhost" port="12345">
<JsonLayout compact="true" eventEol="true" />
Socket>
Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Socket"/>
Root>
Loggers>
Configuration>
input {
tcp {
port => 12345
codec => json
}
}
官网提供的根据log4j2输出格式生成grok->match工具 【国内需要】
grok 调试工具【国内使用】
logstash常用插件
解析logstash日志字段