Làm thế nào để buộc Logstash phân tích lại một tệp?


91

Tôi đã cài đặt Logstash để phân tích cú pháp các tệp apache. Tôi đã mất khá nhiều thời gian để cài đặt đúng và tôi luôn thử trên nhật ký thực. Tôi nhận thấy (như tài liệu cho biết) rằng logstash "nhớ" vị trí của nó trong một tệp. Bây giờ cài đặt của tôi là Ok và tôi muốn Logstash "quên". Điều này có vẻ khó hơn tôi. Tôi đã làm như sau:

  • đã sử dụng: start_position => "beginning"

  • đã xóa thư mục "dữ liệu" hoàn chỉnh khỏi elastissearch (và dừng nó trước)

  • đã xem xét những tệp nào được mở bằng logstash lsof -p PIDvà xóa mọi thứ hứa hẹn (trong trường hợp của tôi /tmp/jffi*.tmp)

Vẫn Logstash không quên và chỉ phân tích cú pháp các tệp "mới" trong thư mục chứa nhật ký

Bất kỳ ý tưởng?


Phiên bản mới nhất logstash Tôi tìm thấy nó trong:/opt/logstash/data/plugins/inputs/file
Tim Smith

Câu trả lời:


135

Theo mặc định, logstash ghi vị trí cuối cùng vào một tệp nhật ký thường nằm trong đó $HOME/.sincedb. Logstash có thể bị đánh lừa khi tin rằng nó chưa bao giờ phân tích cú pháp logfile bằng cách chỉ định /dev/nullsincedb_path.

Đây là phần của tài liệu Input File .

Nơi ghi cơ sở dữ liệu từ (theo dõi vị trí hiện tại của các tệp nhật ký được giám sát). Mặc định là giá trị của biến môi trường "$ SINCEDB_PATH" hoặc "$ HOME / .sincedb".

Ví dụ về cấu hình

input {
    file {
        path => "/tmp/logfile_to_analyse"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}

28
Trên windows, bạn có thể sử dụng sincedb_path => "NUL"để có được hiệu quả tương tự. Detailes đây
Chris Magnuson

11
Nếu các tập tin khá cũ (hơn 24h), rất hữu ích là thêm tùy chọn ingnore_older => 0để logstash sẽ lấy chúng bất kể ngày nào. Theo mặc định, nếu các tệp cũ hơn thì 24h sẽ bị bỏ qua.
mtfk

1
@mtfk: Chà, tìm thấy tuyệt vời! Cảm ơn bạn đã chỉ ra ignore_older => 0công việc trong logstash! Tôi đã bị mắc kẹt bởi cùng một vấn đề như người hỏi. Có vẻ là một phát hiện không rõ ràng! (googling "ignore_older" và "logstash" chỉ đưa lên các trang trên filebeat, tôi không thể tìm thấy bất kỳ dấu vết của làm thế nào để đối phó với điều này trong logstash)
Mike Lutz

Làm thế nào để thêm video này trong khi sử dụng filebeat
Sunilkumar Ramamurthy

@SunilkumarRamamurthy Tôi tin rằng nếu bạn bỏ qua các tùy chọn ignore_oldertrong cấu hình filebeat của bạn, filbeat buộc phải đọc toàn bộ tập tin một lần nữa elastic.co/guide/en/beats/filebeat/current/...
flazzarini

19

Tệp plugin lưu trữ lịch sử "gắn thẻ" trong tệp sincedb, mặc định: trong $ HOME / .sincedb *, xem http://logstash.net/docs/1.3.3/inputs/file#sincedb_path

Do tệp db chứa dòng trông giống như:

[inode] [major device number] [minor device number] [byte offset]

Vì vậy, nếu bạn muốn phân tích cú pháp lại một tệp hoàn chỉnh, bạn cần:

  • xóa các tệp sindedb
  • HOẶC chỉ xóa dòng tương ứng trong tệp sincedb, kiểm tra số inode trước tệp của bạn ( ls -i yourFile | awk '{print $1}')
  • Và khởi động lại Logstash

Với khóa start_position => "beginning", Logstash sẽ phân tích tất cả các tệp.

Ví dụ về tệp sincedb:


1
Về vấn đề start_position => "beginning", tài liệu cho biết:> Tùy chọn này chỉ sửa đổi các tình huống "liên hệ đầu tiên" trong đó tệp là mới và chưa từng được nhìn thấy trước đây. Nếu một tệp đã được xem trước đó, tùy chọn này không có hiệu lực.
Brad

10

Logstash sẽ lưu hồ sơ $HOME/.sincedb_*. Bạn có thể xóa tất cả .sincedbvà khởi động lại logstash, Logstash sẽ phân tích lại tệp.


9

Kết hợp tất cả các câu trả lời, đoán đây là cách tốt nhất để phân tích cú pháp tệp. Tôi đã làm tương tự cho thử nghiệm của mình.

input {
  file {
    path => "/tmp/access_log"
    start_position => beginning
    sincedb_path => "/dev/null"
    ignore_older => 0
  }
}

Để kiểm tra nhanh, thay vào đó ignore_older, bạn cũng có thể touch /tmp/access_logthay đổi dấu thời gian của tệp.


lưu ý rằng việc thêm cấu hình ignore_older => 0sẽ làm ngược lại.
panchicore 14/09/18

5

Nếu bạn đang sử dụng logstash-forwarder, hãy kiểm tra trang chủ của bạn để tìm .logstash-forwardertệp thay thế:

{
  "/var/log/messages": {
    "source": "/var/log/messages",
    "offset": 43715,
    "inode": 12967,
    "device": 51776
  }
}

3
Nếu được cài đặt dưới dạng một gói, hãy kiểm tra /var/lib/logstash-forwarder/.
Wesley Baugh

3

Sau khi xóa, $HOME/.sincedb_*nó vẫn không nhập dữ liệu cho tôi.

Sau khi thử nhiều thứ, tôi đã xóa tất cả trừ .conftệp chính khỏi đó /etc/logstash/conf.dvà khởi động lại Logstash, và mọi thứ đều hoạt động. Tôi chỉ có thể cho rằng có thứ gì đó trong một trong những .conftệp mà logstash đã âm thầm treo trên đó.


Như tôi nhớ lại, sau đó tôi đã bật một số cờ gỡ lỗi và nó cho tôi biết lý do tại sao nó tức giận thay vì im lặng treo. Tôi nghĩ rằng nó đang tìm kiếm số phiên bản trong dữ liệu nhưng đôi khi dữ liệu không có số trong đó. Việc kiểm tra để tìm ra con số sẽ bị lỗi nếu nó không phải là một số, vì vậy trước tiên tôi phải kiểm tra nó là một số sau đó hỏi nó là số gì.
Seth

1

Trên thực tế, reparsing mỗi lần là rất tốn kém nếu tệp có dữ liệu lớn trong đó. Vì vậy, bạn cần phải cẩn thận trước khi thực hiện việc này. Nếu chúng ta muốn buộc nó phải phân tích lại lần nữa thì hãy đặt tham số bên trong khối đầu vào

sincedb_path => "/dev/null" 

Tùy chọn này sẽ không lưu trữ tệp .sincedb và logstash sẽ phân tích lại mỗi lần. Nhưng nếu bạn muốn phân tích lại không phải mỗi lần thì điều bạn có thể làm là xóa theo cách thủ công đường dẫn .sinceDb được tạo khi phân tích cú pháp tệp. Nói chung, nó hiện diện trong thư mục chính dưới dạng tệp ẩn nếu bạn không phải là người dùng root nếu không có trong thư mục gốc. Bạn cũng có thể đặt sincedb_path đến một số vị trí khác để theo dõi tệp này một cách dễ dàng.

sincedb_path => "/home/shubham/sinceDB/productsSince.db"

1

Nếu bạn muốn tránh gặp rắc rối với các tùy chọn logstash, tôi đã thấy rằng đổi tên hoặc xóa tệp nhật ký hiện có và tạo tệp mới từ nội dung tệp cũ sẽ đánh lừa logstash lập chỉ mục lại.


0

Tôi đã tìm thấy nó trong nhà của mình nhưng sau khi xóa nó, logstash từ chối chọn lại các tệp nhật ký hiện có. Cách tôi làm cho nó hoạt động là thêm

sincedb_path => "/opt/elk/sincedb/"  

vào plugin tệp của tôi. Tôi nghĩ để đặt lại mỗi lần, chỉ cần thay đổi đường dẫn của sincedb_path


0

nếu bạn sử dụng tar.gz install filebeat, bạn có thể xóa tệp này $FilebeatPath/data/registry/filebeat/data.jsonvà chạy lại filebeat



-1

logstash phiên bản 5 thư mục mới có trong

<path.data>/plugins/inputs/file

Định nghĩa path.data trong logstash.yml

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.