วิธีจัดการอินพุตที่แตกต่างกันหลายรายการด้วย Logstash


95

สมมติว่าคุณมีบันทึก 2 ประเภทที่แตกต่างกันเช่นบันทึกทางเทคนิคและทางธุรกิจและคุณต้องการ:

  • บันทึกทางเทคนิคดิบจะถูกส่งไปยังเซิร์ฟเวอร์ graylog2 โดยใช้gelfเอาต์พุต
  • บันทึกธุรกิจ json ถูกเก็บไว้ในคลัสเตอร์ elasticsearch โดยใช้elasticsearch_httpเอาต์พุตเฉพาะ

ฉันรู้ว่าSyslog-NGตัวอย่างเช่นไฟล์คอนฟิกูเรชันอนุญาตให้กำหนดอินพุตที่แตกต่างกันหลายรายการซึ่งสามารถประมวลผลแยกกันก่อนที่จะถูกส่งออกไป สิ่งที่Logstashดูเหมือนไม่สามารถทำได้ แม้ว่าจะสามารถเริ่มต้นอินสแตนซ์เดียวด้วยไฟล์คอนฟิกูเรชันเฉพาะสองไฟล์บันทึกทั้งหมดใช้แชนเนลเดียวกันและกำลังใช้การประมวลผลเดียวกัน ...

ฉันควรเรียกใช้อินสแตนซ์มากที่สุดเท่าที่ฉันมีบันทึกประเภทต่างๆหรือไม่


2
คุณควรยอมรับคำตอบที่ถูกต้องของ Ben Lim!
Ben Wheeler

คำตอบ:


191

ฉันควรเรียกใช้อินสแตนซ์มากที่สุดเท่าที่ฉันมีบันทึกประเภทต่างๆหรือไม่

ไม่! คุณสามารถเรียกใช้อินสแตนซ์เดียวเท่านั้นเพื่อจัดการบันทึกประเภทต่างๆ

ในแฟ้มการกำหนด logstash คุณสามารถเข้าเฉพาะแต่ละคนมีความแตกต่างกันชนิด จากนั้นในตัวกรองคุณสามารถใช้ifเพื่อแยกการประมวลผลที่แตกต่างกันและที่เอาต์พุตคุณสามารถใช้เอาต์พุต "if" ไปยังปลายทางอื่นได้

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
} 
filter {
    if [type] == "technical" {
            # processing .......
    }
    if [type] == "business" {
            # processing .......
    }
}
output {
    if [type] == "technical" {
            # output to gelf
    }
    if [type] == "business" {
            # output to elasticsearch
    }
}

หวังว่านี่จะช่วยคุณได้ :)


1
คุณยังสามารถใช้typeแอตทริบิวต์ (ที่มีtype => "value"ไวยากรณ์เดียวกัน) ในตัวกรองและคำจำกัดความของเอาต์พุตซึ่งควรลดการจัดรูปแบบเพิ่มเติมภายในไฟล์ config ลงเล็กน้อย ตัวอย่าง: gist.github.com/fairchild/3030472ตามเอกสารประกอบ: เพิ่มฟิลด์ 'type' ให้กับเหตุการณ์ทั้งหมดที่จัดการโดยอินพุตนี้ ประเภทส่วนใหญ่จะใช้สำหรับการเปิดใช้งานตัวกรอง ประเภทจะถูกเก็บไว้เป็นส่วนหนึ่งของเหตุการณ์ดังนั้นคุณยังสามารถใช้ประเภทเพื่อค้นหาในอินเทอร์เฟซเว็บ
Tony Cesaro

5
ดูเหมือนสิ่งที่ Ben ให้มาจะเป็นวิธีใหม่ในการทำเช่นนี้ เมื่อฉันใช้type => "value"ในเอาท์พุตฉันได้รับข้อความต่อไปนี้ปรากฏขึ้น: "คุณกำลังใช้การตั้งค่าการกำหนดค่า" ประเภท "ที่เลิกใช้แล้วตั้งค่าใน stdout การตั้งค่าที่เลิกใช้แล้วจะยังคงทำงานต่อไป แต่มีกำหนดการลบออกจาก logstash ในอนาคตคุณสามารถทำได้ พฤติกรรมเดียวกันนี้กับเงื่อนไขใหม่เช่น: if [type] == "sometype" { stdout { ... } }. " ฉันถอนความคิดเห็นก่อนหน้านี้ :)
Tony Cesaro

โปรดทราบว่าtypeแอตทริบิวต์จะใช้ไม่ได้หากมีฟิลด์ประเภทจากอินพุตอยู่แล้ว นี่เป็นแอตทริบิวต์พิเศษที่ไม่ได้ลบล้างและมีการบันทึกไว้ ฉันเปิดตั๋วใน Elastic และพวกเขาแนะนำให้ฉันใช้tagsหรือใช้add_fieldแทนtype
BornToCode

@BornToCode ฉันไม่ค่อยเข้าใจ คุณกำลังบอกว่ามีบางอย่างผิดปกติกับรหัสของเบ็นหรือไม่? หรือว่าจะใช้ไม่ได้ถ้าเส้นทางการบันทึกเป็นไฟล์เดียวกัน? สถานการณ์ที่ไม่ได้ผลคืออะไร?
Ben Wheeler

2
@BenLim OP ไม่ยอมรับคำตอบของคุณ แต่ฉันพบว่ามันมีประโยชน์มากที่สุดและโหวตให้คุณ
bigbadmouse

16

ฉันใช้แท็กสำหรับการป้อนไฟล์หลายไฟล์:

input {
    file {
        type => "java"
        path => "/usr/aaa/logs/stdout.log"
        codec => multiline {
            ...
        },
        tags => ["aaa"]
    }

    file {
        type => "java"
        path => "/usr/bbb/logs/stdout.log"
        codec => multiline {
                ...
        }
        tags => ["bbb"]
    }
}
output {
    stdout {
        codec => rubydebug
    }
    if "aaa" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "aaa"
            document_type => "aaa-%{+YYYY.MM.dd}"
        }
    }

    if "bbb" in [tags] {
        elasticsearch {
            hosts => ["192.168.100.211:9200"]
            index => "bbb"
            document_type => "bbb-%{+YYYY.MM.dd}"
        }
    }
}

สิ่งนี้ดีกว่าคำตอบที่ยอมรับ: อนุญาตให้มีอินพุต filebeat หลายรายการใน logstash ในกรณีเช่นนี้คุณสมบัติ "type" จะถูกตั้งค่าเป็น "log" และไม่สามารถแก้ไขได้
Régis B.

แต่นี่ไม่ใช่การเขียนทับแท็กด้วยแท็กสุดท้าย (bbb) ใช่หรือไม่ จากนั้นอีกครั้งใน if statemt ถ้าแท็กเป็นอาร์เรย์หรือสตริงเดียว IF ทั้งสองจะทำงาน เหตุผลนี้ไม่ถูกต้อง แต่ logstash อาจมีตรรกะที่แตกต่างกันภายใน if's
meso_2600

0

ฉันคิดว่า logstash ไม่สามารถอ่านมากกว่า 2 ไฟล์ในส่วนอินพุต ลองดูด้านล่าง

input {
    file {
            type => "technical"
            path => "/home/technical/log"
    }
    file {
            type => "business"
            path => "/home/business/log"
    }
 file {
            type => "business1"
            path => "/home/business/log1"
    }
} 

ใช่
เจอ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.