由于想把多台AppServer上的日志集中到一台机器,那么应用程序的日志输出位置应该是有规律的、固定的(和研发人员商定), 下面用我做过的一个具体需求举例分析:
日志目录结构:
├── public│ └── release-v0.2.20│ └── sys_log.log
├── serv_arena
│ └── release-v0.1.10├── serv_guild
│ └── release-v0.1.10│ └── sys_log.log
├── serv_name
│ └── release-v0.1.10│ └── sys_log.log
通过日志目录结构可以发现,服务器上运行了public、serv_arena等微服务,微服务目录里是程序版本,程序版本目录可能有多个,程序版本目录中是最终log。
日志原始格式:
这里输出的日志是纯文件格式,有些日志则可能是Json等其它格式,对于不同格式,可以选则不同的parser来处理
研发人员的需求是:
日志到LogServer后,目录结果不变。
下面是具体配置过程
step1:
在三台App Server上和LogServer上都安装Fluentd:
$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
我当前的版本在安装完成后,会在/etc/td-agent/目录下生成td-agent.conf文件和plugin目录,我通常会再建立一个conf.d目录,并把所有配置文件细分放进去,并在td-agent.d里include进来,这是个人习惯,感觉很清爽。所以目录结构最后为:
# tree /etc/td-agent/
/etc/td-agent/├── conf.d
├── plugin
└── td-agent.conf
step2:
Fluentd已经安装好了,下面就要对其进行配置,三台App Server上的配置是一样的,但是 LogServer上的配置略有不同,因为Fluentd在Logserver
端的角色是接收端。
LogServer端Fluentd配置:
# cat td-agent.conflog_levelinfo
@type forward
port24224bind0.0.0.0
@include/etc/td-agent/conf.d/*.conf
# cat conf.d/raid.conf@typefilepath/mnt/logs/raid/%Y%m%d/${tag[4]}/${tag[5]}.${tag[6]}.${tag[7]}/${tag[8]}_%Y%m%d%H
appendtrue
@typefilepath/mnt/logs/raid/buffer/timekey 1h
chunk_limit_size 5MB
flush_interval 5s
flush_mode interval
flush_thread_count8flush_at_shutdowntrue
这里值得一说的是path选项,这里用到了tag选项来获取一些信息,而tag信息是从AppServer端的Fluentd配置中传过来的,最后path的结果如下:
# tree /mnt/logs/
/mnt/logs/└── raid
├──20200623│ ├── public
│ └── serv_guild
│ └── release-v0.1.10│ └── sys_log_2020062307.log
└── buffer
AppServer端Fluentd配置:
# cat td-agent.conf
@include/etc/td-agent/conf.d/*.conf
@typetailpath/mnt/logs/raid/public/*/*
pos_file /var/log/td-agent/public.log.pos
tag raid.*
@type none
time_format %Y-%m-%dT%H:%M:%S.%L
refresh_interval 5s
@type tail
path /mnt/logs/raid/serv_arena/*/*pos_file/var/log/td-agent/serv_arena.log.pos
tag raid.*
@type none
time_format%Y-%m-%dT%H:%M:%S.%L
@typetailpath/mnt/logs/raid/serv_guild/*/*
pos_file /var/log/td-agent/serv_guild.log.pos
tag raid.*
@type none
time_format %Y-%m-%dT%H:%M:%S.%L
@type tail
path /mnt/logs/raid/serv_name/*/*pos_file/var/log/td-agent/serv_name.log.pos
tag raid.*
@type none
time_format%Y-%m-%dT%H:%M:%S.%L
@type record_transformerhost_param"#{Socket.gethostname}"
@type forwardname raid-logserver
host10.83.36.106port24224
@type single_value
message_key message
add_newlinetrue
这时值得一说的仍然是path和tag选项,