我正在使用Grok和Logstash将访问日志从Nginx发送到Elastic搜索.我给Logstash所有的访问日志(使用通配符,效果很好),我想得到文件名(确切地说是其中的一部分)并将其用作字段.
我的配置如下:
input {
file {
path => "/var/log/nginx/*.access.log"
type => "nginx_access"
}
}
filter {
if [type] == "nginx_access" {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
match => { "path" => "%{GREEDYDATA}/%{GREEDYDATA:app}.access.log" }
add_field => { "app" => "%{app}" }
}
}
}
output{
# whatever
}
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用:该app字段已添加,但具有%{app}(未替换)的值.
我尝试了不同的东西但无济于事.我可能会遗漏一些东西......有什么想法?
非常感谢
我正在使用Logstash来解析postfix日志.我主要专注于从postfix日志中获取退回的电子邮件日志,并将其存储在数据库中.
为了获取日志,首先我需要找到与我的message-id对应的postfix生成的ID,并使用该Id,我需要查找电子邮件的状态.对于以下配置,我可以获取日志.
grok {
patterns_dir => "patterns"
match => [
"message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}",
"message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}"
]
named_captures_only => true
}
Run Code Online (Sandbox Code Playgroud)
我使用以下if条件来存储与模式匹配的日志:
if "_grokparsefailure" not in [tags] {
#database call
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用两种模式从一个日志文件中查找相应的两个不同日志.
现在,我想根据标签区分两种模式.所以我修改了我的配置如下:
grok {
patterns_dir => "patterns"
match => [
"message", "%{SYSLOGBASE} %{POSTFIXBOUNCE}"
]
add_tag => ["BOUNCED"]
remove_tag => ["_grokparsefailure"]
named_captures_only => true
}
grok {
patterns_dir => "patterns"
match => [
"message", "%{SYSLOGBASE} %{POSTFIXCLEANUP}"
]
add_tag => ["INTIALIZATION"]
remove_tag => ["_grokparsefailure"]
named_captures_only => true
}
Run Code Online (Sandbox Code Playgroud)
现在,它只存储%{POSTFIXCLEANUP}模式日志.如果我颠倒了订单,它只存储%{POSTFIXBOUNCE}模式.
因此,消除,如果条件下,我发现从第一过滤器正在分析该消息有"_grokparsefailure"标签和第一过滤器标签,并且因为它没有存储该记录之后.
任何人都可以告诉我需要做些什么来纠正这个问题?我有没有犯错?
我有一个drupal watchdog syslog文件,我想解析基本上两个嵌套字段,syslog部分和消息部分,以便我得到这个结果
syslogpart: {
timestamp: "",
host: "",
...
},
messagepart:{
parsedfield1: "",
parsedfield2: "",
...
}
Run Code Online (Sandbox Code Playgroud)
我尝试制作一个如下所示的自定义模式:
DRUPALSYSLOG (%{SYSLOGTIMESTAMP:date} %{SYSLOGHOST:logsource} %{WORD:program}: %{URL:domain}\|%{EPOCH:epoch}\|%{WORD:instigator}\|%{IP:ip}\|%{URL:referrer}\|%{URL:request}\|(?<user_id>\d+)\|\|)
然后跑 match => ['message', '%{DRUPALSYSLOG:drupal}'}
但我没有得到嵌套的响应,我得到一个文本块drupal: "ALL THE MATCHING FIELDS IN ONE STRING",然后单独的所有匹配,但不是在drupal下嵌套,而是在同一级别.
我已经安装了ELK并在我的机器上工作,但现在我想根据事件消息进行更复杂的过滤和字段添加.
具体来说,我想根据消息模式设置"id_error"和"descripcio".
我在"logstash.conf"文件中尝试了很多代码组合,但是我无法获得预期的行为.
有人能告诉我我做错了什么,我该做什么或者这是不可能的?提前致谢.
这是我的"logstash.conf"文件,我做了最后一次测试,结果没有在Kibana中捕获事件:
input {
file {
path => "C:\xxx.log"
}
}
filter {
grok {
patterns_dir => "C:\elk\patterns"
match => [ "message", "%{ERROR2:error2}" ]
add_field => [ "id_error", "2" ]
add_field => [ "descripcio", "error2!!!" ]
}
grok {
patterns_dir => "C:\elk\patterns"
match => [ "message", "%{ERROR1:error1}" ]
add_field => [ "id_error", "1" ]
add_field => [ "descripcio", "error1!!!" ]
}
if ("_grokparsefailure" in [tags]) { drop {} }
}
output {
elasticsearch {
host => "localhost" …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的日志文件(简化)
日志样本
MyLine data={"firstname":"bob","lastname":"the builder"}
Run Code Online (Sandbox Code Playgroud)
我想提取数据中包含的json 并创建两个字段,一个用于firstname,一个用于last.但是,我得到的输出是这样的:
{"message":"Line data={\"firstname\":\"bob\",\"lastname\":\"the builder\"}\r","@version":"1","@timestamp":"2015-11-26T11:38:56.700Z","host":"xxx","path":"C:/logstashold/bin/input.txt","MyWord":"Line","parsedJson":{"firstname":"bob","lastname":"the builder"}}
Run Code Online (Sandbox Code Playgroud)
如你看到的
..."parsedJson":{"firstname":"bob","lastname":"the builder"}}
Run Code Online (Sandbox Code Playgroud)
这不是我需要的,我需要在kibana中为firstname和lastname创建字段,但是logstash没有使用json过滤器提取字段.
LogStash配置
input {
file {
path => "C:/logstashold/bin/input.txt"
}
}
filter {
grok {
match => { "message" => "%{WORD:MyWord} data=%{GREEDYDATA:request}"}
}
json{
source => "request"
target => "parsedJson"
remove_field=>["request"]
}
}
output {
file{
path => "C:/logstashold/bin/output.txt"
}
}
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助,我确信我错过了一些简单的东西
谢谢
我有来自这种格式的日志.我已将logstash变量分配给下面的模式.我相信我已经使用随附的预定义Grok标记正确分配了这些元素.但是,当我运行logstash时,它反映:[0]"_ grokparsefailure"表示它无法解析请求.对于我的conf确实出错了,我感到很茫然.这里有没有人知道是什么原因造成的?我对logstash很新.提前致谢
1383834858 0 71.172.136.12 20097903 198.2.20.171 80 TCP_HIT/200 252 HEAD http://podcasts.someserver.com/80830A/podcasts.someserver.com/nyv/voice-film-club/2013/11/the-sexy-god -thor.mp3 - 0 355" - ""Podcasts/2.0"33546" - "
要么
%{BASE10NUM:timestamp} = 1383834858
%{BASE10NUM:time_taken} = 0
%{IP:clientip} = 71.172.136.12
%{BASE10NUM:filesize} = 20097903
%{IP:serverip} = 198.2.20.171
%{BASE10NUM:port} = 80
%{WORD:status_code} = TCP_HIT/200
%{BASE10NUM:sc_bytes} = 252
%{WORD:method} = HEAD
%{URI:cs_uri} = http://podcasts.someserver.com/80830A/podcasts.someserver.com/nyv/voice- film-club/2013/11/the-sexy-god-thor.mp3
%{NOTSPACE:ignore2} = -
%{BASE10NUM:rs_duration} = 0
%{BASE10NUM:rs_bytes} = 355
%{QS:c_referrer} = "-"
%{QS:user_agent} = "Podcasts/2.0"
%{BASE10NUM:customerid} = 33546
%{QS:ignore} = "-"
Run Code Online (Sandbox Code Playgroud)
我的logstash.conf文件如下所示:
input {
#wpa_media logs from the …Run Code Online (Sandbox Code Playgroud) 我在Ubuntu Server 14上安装了Logstash.在哪里可以找到Logstash过滤日志时使用的默认grok模式?谢谢.
我们想为我们公司的几个不同项目设置logstash服务器.现在我尝试在Kibana中启用它们.我的问题是:如果我有不同的日志文件模式,我如何为它们构建过滤器?示例:logstash.conf:
input {
file {
type => "A"
path => "/home/logstash/A/*"
start_position => "beginning"
}
file {
type => "B"
path => "/home/logstash/B*"
start_position => "beginning"
}
}
filter {
multiline {
pattern => "^%{TIMESTAMP_ISO8601}"
negate => true
what => "previous"
}
grok {
type => A
match => [ "message", "%{TIMESTAMP_ISO8601:logdate} %{DATA:thread %{LOGLEVEL:level}\s*%{DATA:logger_name}\s*-\s*%{GREEDYDATA:log_text}"]
add_tag => [ "level_%{level}" ]
}
date {
match => ["logdate", "YYYY-MM-dd HH:mm:ss,SSS"]
}
grok {
type => B
match => [ any other pattern ... …Run Code Online (Sandbox Code Playgroud) 在我的logstash日志中,我有时空行或只有空格的行.
要删除空行,我创建了一个dropemptyline过滤器文件
# drop empty lines
filter {
if [message] =~ /^\s*$/ {
drop { }
}
}
Run Code Online (Sandbox Code Playgroud)
但是空行过滤器没有按预期工作,主要是因为这个特定的过滤器在链中的其他过滤器之后有过滤器.
00_input.conf
05_syslogfilter.conf
06_dropemptylines.conf
07_classifier.conf
Run Code Online (Sandbox Code Playgroud)
所以我认为我的特定过滤器可以工作,如果它是唯一的,但不是.
2015-02-11 15:02:12.347 WARN 1 --- [tp1812226644-23] o.eclipse.jetty.servlet.ServletHandler :
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Timed out after 10000 ms while waiting for a server that matches AnyServerSelector{}. Client view of cluster state is {type=Unknown, servers=[{address=mongo:27017, type=Unknown, state=Connecting, exception={com.mongodb.MongoException$Network: Exception opening the socket}, caused by {java.net.UnknownHostException: mongo: unknown error}}]; nested exception is com.mongodb.MongoTimeoutException: Timed out …Run Code Online (Sandbox Code Playgroud) 所以,我们假设我的日志行的一部分看起来像这样:
GET /restAPI/callMethod1/8675309
Run Code Online (Sandbox Code Playgroud)
GET匹配一个http方法,得到提取,余数匹配一个URI,并且也被提取.现在在logstash配置中让我们假设我想做这样的事情......
if [METHOD] == "GET" {
if [URI] (CONTAINS <--Is there a way to do this?) =="restAPI/callMethod1"{
....
Run Code Online (Sandbox Code Playgroud)
有办法做到这一点吗?如果是这样,我该怎么做呢?
谢谢