# Receive events from 24224/tcp
# This is used by log forwarding and the fluent-cat command
@type forward << เป็นการประกาศว่าจะใช้ input plugin ประเภท forward คือรับ message มาตรง ๆ
port 24224 << เป็นการบอกว่าจะรับ input เข้ามาที่ port ไหน
</source>
# http://this.host:9880/myapp.access?json={"event":"data"}
@type http
port 9880
</source>
2. Match ใช้บอก Fluentd ว่าต้องทำอย่างไรต่อไปเมื่อได้รับ input เข้ามา
Tag match นี้จะคอยมองหา event ที่ match กับ tag ต่าง ๆ ที่กำหนดไว้แล้วประมวลผลมันซะ ซึ่ง Match ที่พบบ่อยที่สุดคือ เมื่อเจอแล้วให้ส่งต่อข้อมูลออกไปยังที่ใด ( plugin ใด ๆ ที่มีการติดต่อโดยตรงกับ match นั้นจะเรียกว่า output plugin ) Fluentd มี plugin ที่ให้มาด้วยสองตัวคือ file กับ forward นั่นเองเราจะลองเพิ่มการใช้งาน match ลงไปใน config file กัน
# Receive events from 24224/tcp
# This is used by log forwarding and the fluent-cat command
@type forward
port 24224
</source>
# http://this.host:9880/myapp.access?json={"event":"data"} << Input จำลองที่ถูกส่งเข้ามาที่ source
@type http
port 9880
</source>
# Match events tagged with "myapp.access" and
# store them to /var/log/fluent/access.%Y-%m-%d
# Of course, you can control how you partition your data
# with the time_slice_format option.
<< match ทำการตรวจสอบพบคำว่า myapp.access ซึ่งจะตรงกับ input ข้างบนที่ถูกส่งเข้ามาจึงสั่งให้ทำงาน
@type file << Output ปลายทางเป็น plugin ประเภทไฟล์เอกสาร
path /var/log/fluent/access << ถูกส่งไปเก็บในไฟล์ชื่อ access ใน path /var/log/fluent/ นั่นเอง
โดยแต่ละ match จะต้องมี match pattern และแน่นอนต้องมีตัวแปร @type ด้วยเพื่อบอกให้รู้ว่าปลายทางจะเป็น plugin อะไร ไม่สิ ต้องบอกว่าเพื่อให้รู้ว่าจะต้องส่งข้อมูลต่อไปยังที่ใด ซึ่งจากตัวอย่างข้างบนจะมีเพียงแค่ event ที่ชื่อ "myapp.access" เท่านั้นที่จะ match กับข้อมูลข้างบน และเช่นเดียวกับ input source คุณสามารถเขียน output plugin เองได้เช่นกันครับ ถ้าหากต้องการทำความเข้าใจว่า match ทำงานยังไง คลิกที่นี่ แต่ถ้าไม่รีบก็ค่อย ๆ ทำความเข้าใจไปทีละนิดครับ
3. Filter ใช้สำหรับคัดกรอง input ที่เข้ามา
ในส่วนของ filter นั้นจะทำงานคล้ายกับ match คือจะทำการค้นหาคำเหมือนกับที่ match ทำแต่ต่างกันตรงที่ filter ใช้กรองได้นั่นเอง ซึ่งในที่นี้จะเรียกว่ามีการทำ process pipeline นั่นเอง
Input -> filter 1 -> ... -> filter N -> Output
จากตัวอย่างจะเห็นได้ว่า filter จะเป็นการ match ข้อมูล แล้วนำผลลัพธ์ที่ได้ไป match ต่อ หรือจะเรียกว่าเป็น nested match ก็ได้นะครับ เอาเป็นว่ามันคือ filter แล้วกันครับเหอ ๆ ๆ ตอนนี้เราจะลองเพิ่ม filter ที่มากับโปรแกรมอีกตัวชื่อว่า record_transformer เพื่อทำเป็นตัวอย่างให้ดูตามนี้ครับ
หลังจากผ่านการทำ filter แล้วก็จะทำการส่งข้อมูลไปประมวลผลต่อผ่าน tag match แล้วเซฟผลลัพธ์ลงไฟล์นั่นเอง และแน่นอนคุณสามารถสร้าง filter ของคุณเองใน plugin ได้หากต้องการศึกษาเพิ่มคลิก
4. System กลุ่มของการปรับแต่งค่าที่ส่งผลต่อภาพรวมทั้งระบบ
การตั้งค่าใด ๆ ภายใต้ tag system นั้นจะส่งผลกับระบบทั้งหมด เช่น มีการติดตั้ง Fluentd ไว้กับเซิฟเวอร์จำนวน 20 เครื่องหากมีเครื่องใดปรับแต่งค่าด้วย tag system จะกระทบทั้งหมด 20 เครื่องทันทีซึ่งถ้าจะมีการตั้งค่าในส่วนนี้ก็ควรจะตั้งค่าให้เหมือนกันทั้งหมดเพื่อป้องกันปัญหาที่จะเกิดขึ้นในอนาคต
log_level
suppress_repeated_stacktrace
emit_error_log_interval
suppress_config_dump
without_source
process_name (only available in system directive. No fluentd option)
# Include config files in the ./config.d directory
@include config.d/*.conf
@include นั้นรองรับการอ้างอิงถึง path ในหลายรูปแบบทั้ง regular file path, glob pattern และ http url conventions
# absolute path
@include /path/to/config.conf
# if using a relative path, the directive will use
# the dirname of this config file to expand the path
@include extra.conf
# glob match pattern
@include config.d/*.conf
# http
@include http://example.com/fluent.conf
Note : ในกรณีที่มีการใช้การอ้างอิง path แบบ glob pattern
ถ้าเรามี a.conf,b.conf,... จนถึง z.conf แต่เราต้องการ import แค่ a.conf กับ z.conf
# ไม่ควรใช้การอ้างถึงแบบนี้
@include *.conf
# ควรจะใช้การอ้างอิงถึงแบบนี้มากกว่า
@include a.conf
@include config.d/*.conf
@include z.conf
Match ทำงานยังไง
จากที่อธิบายมาข้างต้นทั้งหมดนั้น Fluentd ให้สิทธิเราในการ route event ไปที่ไหนก็ได้ตาม tag ที่กำหนดแต่เราสามารถใส่ tag ตรง ๆ ลงไปเลยก็ได้เช่น <filter app.log> ถ้าเราต้องการดึงข้อมูลจาก tag นี้เท่านั้นจากตัวอย่างข้างบนที่เราใช้ <filter app.*> ก็สามารถระบุตัว tag จริง ๆ ที่ต้องการลงไปได้เลยเช่นกัน
Wildcard และ Expansions
Match pattern ต่อไปนี้สามารถนำไปประยุกต์ใช้ได้กับทั้ง match tag และ filter tag จะเรียกว่า Regular Expression ก็ได้แต่ไม่เหมือนซะทีเดียวแต่ก็ใกล้เคียง
* ใช้สำหรับ match อักขระตัวเดียว หรือ single match เช่น a.* นั้นจะ match กับ a.b ได้แต่จะไม่ match กับ a หรือ a.b.c เพราะว่ามันมีได้แค่ค่าเดียวเท่านั้น
** ใช้สำหรับ match อักขระหลายตัว เรียกว่า zero or more ก็ได้ ซึ่งสำหรับส่วนนี้จะมีค่าเท่ากับ * ตัวเดียวใน RegEx นั่นเองตัวอย่าง a.** จะ match ได้กับ a, a.b, a.b.c ได้ทั้งหมด
{a,b,c} ใช้สำหรับ match กลุ่มของอักขระตัวอย่างแบ่งออกเป็น 2 แบบดังนี้
No comments:
Post a Comment