经过调查发现,我这边配置的logstash的file input为从别的服务器上同步过来的yarn的app的日志目录:
/data/log/hadoop/application_xxxxxxxxxx_xxxx/container_xxxxxx_xxxxx_xxxxx/*
有3种文件:stderr,stdout,syslog。
在logstash机器上,配置文件的目录是/data/logs/hadoop/[node]/apps/app_xxxxx/con_xxxxxx/*
因为每个文件的格式不一样,3个文件对应3个不同的conf。
syslog在conf中路径写为:
path => [
"/data/logs/hadoop/*/apps/*/*/syslog"
]
在该服务器上用ll命令可以显示以上目录的日志文件。
而实际运行logstash的时候,同步过来的文件全部都不读取。
我测试了很多次,发现如果我自己在logstash的服务器上,手动创建比如/data/logs/hadoop/[node]/apps/app_01/con_01/syslog这样的文件,在文件中追加和同步过来的一样的内容,logstash将会正常读取这个文件的记录。
但是如果创建目录名长度几乎一样,比如
/data/logs/hadoop/data1/apps/application_1518376079245_11087/container_1518376079245_11087_01_000099/syslog
这样很长的文件,在其中追加正常的日志内容,logstash不会读取。
我的结论是:目录过长,logstash不读取,因为app id和container id太长了。短的话可以正常读取。
不知道怎么解决这个问题,因为我需要在logstash的配置中解析app id和container id,所以必须保留这2个id在目录中:
match => { "path" => "hadoop/%{DATA:node}/apps/%{DATA:app_id}/%{DATA:container_id}/syslog" }
但是确实因为id太长,logstash不读取这个文件,要把文件挪到别的目录才行,如何解决呢?
也许我的结论是错的,希望大神指正!
/data/log/hadoop/application_xxxxxxxxxx_xxxx/container_xxxxxx_xxxxx_xxxxx/*
有3种文件:stderr,stdout,syslog。
在logstash机器上,配置文件的目录是/data/logs/hadoop/[node]/apps/app_xxxxx/con_xxxxxx/*
因为每个文件的格式不一样,3个文件对应3个不同的conf。
syslog在conf中路径写为:
path => [
"/data/logs/hadoop/*/apps/*/*/syslog"
]
在该服务器上用ll命令可以显示以上目录的日志文件。
而实际运行logstash的时候,同步过来的文件全部都不读取。
我测试了很多次,发现如果我自己在logstash的服务器上,手动创建比如/data/logs/hadoop/[node]/apps/app_01/con_01/syslog这样的文件,在文件中追加和同步过来的一样的内容,logstash将会正常读取这个文件的记录。
但是如果创建目录名长度几乎一样,比如
/data/logs/hadoop/data1/apps/application_1518376079245_11087/container_1518376079245_11087_01_000099/syslog
这样很长的文件,在其中追加正常的日志内容,logstash不会读取。
我的结论是:目录过长,logstash不读取,因为app id和container id太长了。短的话可以正常读取。
不知道怎么解决这个问题,因为我需要在logstash的配置中解析app id和container id,所以必须保留这2个id在目录中:
match => { "path" => "hadoop/%{DATA:node}/apps/%{DATA:app_id}/%{DATA:container_id}/syslog" }
但是确实因为id太长,logstash不读取这个文件,要把文件挪到别的目录才行,如何解决呢?
也许我的结论是错的,希望大神指正!
1 个回复
shwtz - 学物理想做演员的IT男
赞同来自: lianjie
一时的解决方法是同步之前将yarn的服务器的日志目录全部改成755的权限。
遗留问题:新生成的日志文件目录依然是711的权限,所以用sersync同步日志文件的时候会报错:
inotify_add_watch error: No such file or directory
这个错其实一早就有, 我之前一直不知道原因,现在想来,应该就是权限问题,因为我是用root用户同步的。