Làm thế nào để xử lý nhiều đầu vào không đồng nhất với Logstash?


95

Giả sử bạn có 2 loại nhật ký rất khác nhau, chẳng hạn như nhật ký kinh doanh và kỹ thuật và bạn muốn:

  • nhật ký kỹ thuật thô được chuyển đến máy chủ greylog2 bằng cách sử dụng gelfđầu ra,
  • nhật ký kinh doanh json được lưu trữ vào một cụm tìm kiếm đàn hồi bằng cách sử dụng elasticsearch_httpđầu ra chuyên dụng .

Tôi biết rằng với Syslog-NGví dụ, tệp cấu hình cho phép xác định một số đầu vào riêng biệt mà sau đó có thể được xử lý riêng trước khi gửi đi; điều Logstashdường như không thể làm được. Ngay cả khi một phiên bản có thể được khởi tạo bằng hai tệp cấu hình cụ thể, tất cả các bản ghi đều có cùng một kênh và đang được áp dụng cùng một quy trình ...

Tôi có nên chạy bao nhiêu phiên bản vì tôi có các loại nhật ký khác nhau không?


2
Bạn nên chấp nhận câu trả lời đúng của Ben Lim!
Ben Wheeler

Câu trả lời:


191

Tôi có nên chạy bao nhiêu phiên bản vì tôi có các loại nhật ký khác nhau không?

Không! Bạn chỉ có thể chạy một phiên bản để xử lý các loại nhật ký khác nhau.

Trong tệp cấu hình logstash, bạn có thể xác định từng đầu vào với kiểu khác nhau . Sau đó, trong bộ lọc, bạn có thể sử dụng if để phân biệt các xử lý khác nhau và cũng tại đầu ra, bạn có thể sử dụng đầu ra "if" cho đích khác.

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
    }
}

Hy vọng điều này có thể giúp bạn :)


1
Bạn cũng có thể sử dụng typethuộc tính (với cùng một type => "value"cú pháp) trong bộ lọc và định nghĩa đầu ra, điều này sẽ cắt giảm một chút định dạng bổ sung trong tệp cấu hình. Ví dụ: gist.github.com/fairchild/3030472 Theo tài liệu: Thêm trường 'loại' vào tất cả các sự kiện được xử lý bởi đầu vào này. Các loại được sử dụng chủ yếu để kích hoạt bộ lọc. Loại được lưu trữ như một phần của chính sự kiện, vì vậy bạn cũng có thể sử dụng loại để tìm kiếm nó trong giao diện web.
Tony Cesaro

5
Chà, có vẻ như những gì Ben cung cấp thực sự là cách mới để làm điều này. Khi tôi sử dụng type => "value"trong một đầu ra, tôi nhận được thông báo sau hiển thị: "Bạn đang sử dụng cài đặt cấu hình không được dùng nữa" loại "được đặt trong stdout. Các cài đặt không dùng nữa sẽ tiếp tục hoạt động nhưng được lên lịch xóa khỏi logstash trong tương lai. Bạn có thể đạt được cùng hành vi này với các điều kiện mới, như:. if [type] == "sometype" { stdout { ... } }" Tôi rút lại nhận xét trước đây của tôi. :)
Tony Cesaro

Lưu ý rằng typethuộc tính sẽ không áp dụng nếu đã có trường loại từ đầu vào. Đây là một thuộc tính đặc biệt không ghi đè và nó được ghi lại. Tôi đã mở một vé trong Elastic và họ đề xuất tôi nên sử dụng tagshoặc add_fieldthay vìtype
BornToCode

@BornToCode, tôi không hiểu lắm. Bạn đang nói có điều gì đó sai với mã của Ben? Hoặc nó sẽ không hoạt động nếu các đường dẫn nhật ký là cùng một tệp? Kịch bản mà nó không hoạt động là gì?
Ben Wheeler

2
@BenLim OP không chấp nhận câu trả lời của bạn nhưng tôi thấy nó hữu ích nhất và đã bình chọn cho bạn.
bigbadmouse

15

Tôi đã sử dụng các thẻ để nhập nhiều tệp:

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}"
        }
    }
}

Điều này tốt hơn câu trả lời được chấp nhận: nó cho phép nhiều đầu vào filebeat trong logstash. Trong những trường hợp như vậy, thuộc tính "type" được đặt thành "log" và không thể sửa đổi.
Régis B.

Nhưng đây không phải là thẻ ghi đè bằng thẻ cuối cùng (bbb)? Và một lần nữa, trong if statememt, nếu các thẻ là một mảng hoặc chuỗi đơn, thì cả hai IF sẽ hoạt động. Vì vậy, một cách logic này là không chính xác, nhưng có lẽ logstash có một bên logic khác nhau nếu nhân
meso_2600

0

Tôi nghĩ rằng logstash không thể đọc nhiều hơn 2 tệp trong phần Đầu vào. thử cái bên dưới

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

Đúng vậy, gặp phải 'sự cố' tương tự
meso_2600.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.