Linux: làm thế nào để gửi các dòng mới trong tệp nhật ký đến syslog từ xa?


8

Chúng tôi có một số ứng dụng đang tạo các tệp nhật ký văn bản đơn giản của riêng chúng, mà tôi muốn chuyển tiếp đến một máy chủ nhật ký hệ thống từ xa để ghi nhật ký tập trung. Tôi không có quyền truy cập rootvào các máy này, tôi cũng không thể cấu hình lại syslogđể chuyển hướng đầu ra sang một máy từ xa.

Tôi đã tìm thấy một số giải pháp trực tuyến, nhưng chủ yếu là các tập lệnh bash tự chế của mọi người và tôi đang tìm kiếm một thứ gì đó mạnh mẽ hơn, phù hợp để thực hiện trong môi trường sản xuất có khối lượng lớn.

Tốt nhất là một cái gì đó được thiết kế với một mắt cho một dấu chân nhỏ, trình nền nền tiếp tục chạy, có thể theo kịp rất nhiều dòng, v.v. - Những giải pháp nào hiện đang có sẵn?


3
Bạn đã xem mô-đun nhập tệp văn bản cho rsyslog chưa?
yoonix

@yoonix: Không, tôi không có, nhưng tôi sẽ đến :)
Michael Martinez

3
Uhm, syslog có thể gửi đến các máy chủ syslog từ xa. Định cấu hình nhật ký hệ thống cục bộ của bạn để gửi đến một máy chủ từ xa. Sau đó truy cập nhật ký hệ thống cục bộ của bạn thông qua các cuộc gọi nhật ký hệ thống tiêu chuẩn hoặc bằng cách sử dụng logger hoặc một cái gì đó.
Zoredache

4
Tại sao bạn không ghi các tệp nhật ký của mình vào một đường ống có tên và có một trình nghe daemon gửi chúng trên đường serverfault.com/questions/189477/
trộm

3
Bạn không cần phải sửa đổi ứng dụng chỉ cần đặt một ống có tên cùng tên với tệp nhật ký mà ứng dụng đang ghi vào vị trí.
dùng9517

Câu trả lời:


13

Bạn đã từ chối "tập lệnh bash của người khác", nhưng đây là một giải pháp khá phổ biến - một số cách sử dụng loggerlệnh sáng tạo có thể theo dõi một tệp và gửi nội dung của nó đi nơi khác.
Cá nhân tôi sẽ không làm điều này trong một môi trường sản xuất mặc dù.


Một tùy chọn tốt hơn yêu cầu ít sử dụng hack scripting hơn rsyslogdmô-đun nhập tệp văn bản như yoonix đã đề cập - Đây là một giải pháp khá tốt mặc dù có một số khả năng bị mất dòng trong khi xoay tệp và nếu bạn đang sử dụng hệ thống Linux với rsyslogvì trình nền syslog của bạn không có nhiều công việc cần thiết.

syslog-ngcũng hỗ trợ nguồn đầu vào tệp có chức năng tương tự như rsyslog.


IMHO giải pháp tốt nhất - mặc dù yêu cầu sửa đổi ứng dụng tạo ra các nhật ký này - là đăng nhập trực tiếp vào syslog. Bạn không muốn trải qua các bước trung gian, tệp, v.v. - sysloglà Trình ghi nhật ký SYStem và những thứ ghi nhật ký trên nền tảng Unix sẽ gửi chúng đến syslog.
Thật không may, việc thực hiện điều này là một bài tập cho người đọc (và nhà phát triển ứng dụng) và có thể không thực hiện được nếu nhà phát triển của bạn không tồn tại, lười biếng hoặc không đủ năng lực ....


7
@MichaelMartinez Bạn sẽ sửa đổi rsyslogcấu hình hiện đang chạy trên hệ thống. Bạn KHÔNG nên chạy hai trình nền syslog. Không được thô lỗ, nhưng bạn cần ngừng cố gắng làm sai *: Mọi giải pháp thích hợp cho kịch bản này đều yêu cầu các hành động quản trị (root) trên máy chủ hoặc sửa đổi ứng dụng. Bạn sẽ phải đối mặt với thực tế đó và đối phó với bất kỳ nhóm nào trong tổ chức của bạn có nguồn gốc từ các hệ thống được đề cập, nếu không câu hỏi này không có chủ đề (bạn đang cố gắng phá vỡ các chính sách của tổ chức của mình) ....
voretaq7

5
@Michael Tất cả điều này cho chúng ta biết rằng ai đó đang cố gắng buộc nhóm sai để thực hiện sửa lỗi.
Andrew B

4
@MichaelMartinez imho, nghe có vẻ như là một con đường khá nhanh để làm tê liệt các mức nợ kỹ thuật.
Sirex

2
@Sirex. Hãy là những gì nó có thể, đó là cách của mọi thứ. Tôi làm việc tại một tổ chức có 10 nghìn người, hầu hết là kỹ thuật (kỹ sư, dev, ops, v.v.)
Michael Martinez

5
Tôi đoán. Nói chung, tôi đã tìm thấy lâu dài rằng không có huy chương trong chiến thắng các trận chiến tự gây ra. Khi nợ kỹ thuật đến mức nó ảnh hưởng đến công việc kinh doanh, những người siêng năng làm việc chăm chỉ để tránh con voi trong phòng có xu hướng mang theo lon, theo kinh nghiệm của tôi. Vì vậy, tôi muốn nói che mông của bạn và khiến ai đó đồng ý bằng văn bản về những nhược điểm của việc này.
Sirex

6

Bạn có thể sử dụng logstash với đầu vào tệp và đầu ra syslog .

Ví dụ: tạo cấu hình với tệp (hoặc tệp) bạn muốn theo dõi và thông tin máy chủ nhật ký hệ thống của bạn.

file-to-syslog.conf:

input { file { path => "/var/log/kern.log" } }
output {
    syslog {
        facility => "kernel"
        host => "syslog.example.com"
        port => 514
        severity => "informational"
    }
}

Khởi động logstash với

java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf

+1. nếu sử dụng đầu vào tệp của rsyslog không phải là một tùy chọn, logstash là điều tốt nhất tiếp theo. Về nhiều mặt, về lâu dài sẽ tốt hơn.
Sirex

Tôi không quen với điều này. Nếu nó làm những gì tôi cần, nó sẽ giúp tôi tránh được rắc rối khi hack coreutils và linux-linux.
Michael Martinez

vâng, cấu hình sẽ trông giống như thế này: pastebin.com/xeC9hxD3
Sirex

Trông giống như một công cụ rất tuyệt, nhưng chắc chắn quá mức cho những gì tôi cần ở đây. logstash là dịch vụ riêng của nó, với giao diện web, yêu cầu java, v.v. Tôi sẽ tiếp tục sử dụng filelogger của mình, nhẹ, dấu chân nhỏ, được tối ưu hóa cho hiệu suất. ... Nhưng, cảm ơn vì đã gợi ý logstash vì tôi có thể thấy sự cần thiết của nó trong các tình huống khác trong tương lai!
Michael Martinez

yeah, nó là một công cụ jruby đóng gói jar. Gui thực sự là kibana được đóng gói vào nó dễ dàng nhưng thực sự là một dự án riêng biệt, vì vậy không cần thiết chỉ để phân tích thông điệp. Về cơ bản, nó là một con dao của quân đội Thụy Sĩ. Bạn xác định đầu vào và đầu ra và ở giữa, bạn có thể tùy ý mò mẫm các bản ghi, cung cấp cho chúng bối cảnh. - CNTT có thể quá mức cần thiết cho bạn trừ khi bạn cũng muốn sử dụng elaticsearch trên dữ liệu nhật ký của mình.
Sirex

4

Tôi đã hack cùng nhau tail.clogger.cthành một chương trình biên dịch dấu chân nhỏ (nhị phân) duy nhất, nhẹ, nhanh và ổn định. Miễn là nó đã đọc quyền truy cập vào (các) tệp nhật ký, thì nó hoạt động mà không cần quyền root.

Tôi cũng đã thực hiện một vài cải tiến cho trình ghi nhật ký gốc và thêm khả năng (tùy chọn) mới để chèn một chuỗi văn bản ở đầu mỗi dòng nhật ký trước khi nó được gửi đến máy chủ nhật ký. Kết quả là một chương trình có thể tự chạy, mà không cần sử dụng ống vỏ (tức là không cần tail logfile | logger). Nó sẽ chạy mãi mãi cho đến khi bị giết một cách rõ ràng hoặc nó gặp lỗi ghi vào ổ cắm mạng. Nó thậm chí còn tiếp tục chạy nếu tệp nhật ký bị xoay hoặc thậm chí biến mất (nó sẽ tiếp tục nhìn để xem liệu tệp có xuất hiện lại không.)

Thật dễ sử dụng: chỉ cần cung cấp cho nó một hoặc nhiều tệp nhật ký để theo dõi và mỗi khi một dòng mới được ghi vào tệp, nó sẽ gửi một bản sao của dòng đó đến máy chủ nhật ký hệ thống từ xa hoặc cục bộ mà bạn chỉ định. Cộng với chuỗi văn bản bổ sung nếu bạn sử dụng tùy chọn đó.

Tôi thực sự đã hoàn thành chương trình trở lại vào tháng 12, nhưng đang chờ Yahoo lấy bản quyền và cung cấp nó, điều mà họ đã hoàn thành. (Tôi đã viết nó như một phần công việc của tôi tại Yahoo).

thông tin chương trình filelogger và liên kết tải xuống:


@slm: Tôi viết lại theo yêu cầu của bạn
Michael Martinez

Rất hữu ích, cảm ơn Michael. Bất kỳ cơ hội nào bạn sẽ gói nó cho debian apt-get install?
joelparkerhenderson

@joelparkerhenderson. Xin chào Joel. Thật không may, có lẽ không phải vì tôi không làm việc với debian. Bạn đã thử sao chép nhị phân vào hệ thống của bạn và xem nếu nó chạy?
Michael Martinez

1

Có một số cách để giải quyết điều này. Nhưng điều rất, rất đầu tiên bạn nên làm là: chuyển tiếp các bản ghi bằng syslog .

Syslog (và nhiều thay thế cho syslog) có các tiện ích tích hợp để chuyển tiếp đăng nhập đến một máy chủ syslog khác ở một địa chỉ khác. Bạn có thể dễ dàng làm như vậy bằng cách thay đổi tệp cấu hình và nối thêm địa chỉ để chuyển tiếp cơ sở tới. Ví dụ: thêm dòng này vào:

*.*    @192.168.1.1

... sẽ chuyển tiếp tất cả các cơ sở cho máy ở 192.168.1.1, mà (hy vọng) có dịch vụ đang chạy. Ví dụ tôi đưa ra ở đây là cho rsyslog, đây là máy chủ stock syslog trên Debian, mặc dù nó hoạt động với nhiều người khác. Tham khảo tài liệu để bạn thực hiện syslog với man syslogvà xem những gì nó nói về "chuyển tiếp".

Máy chủ syslog từ xa có thể là bất cứ điều gì bạn thích. Thậm chí có những sản phẩm, như Splunk , mà hạnh phúc tổng hợp các bản ghi vào một cái nhìn duy nhất với một bảng điều khiển web, tìm kiếm, thông báo sự kiện-driven, vv vv Bạn có thể thấy thêm ở đây: http://www.splunk.com/ Nếu không đáp ứng nhu cầu của bạn, bạn có thể sử dụng thứ khác. Thậm chí có những máy chủ syslog sẽ kết xuất vào cơ sở dữ liệu SQL!

Chắc chắn, bạn có thể viết kịch bản / chương trình / dịch vụ của riêng bạn để làm điều này cho bạn, nhưng tại sao lại phát minh lại bánh xe khi cả hai đã hoàn thành cho bạn và đã được trao cho bạn?


Chỉnh sửa: Vì vậy, tôi đã quay lại và đọc lại câu hỏi, và nhận thấy một số ý kiến. Nó nghe giống như:

  1. bạn muốn tổng hợp nhật ký ứng dụng của bạn
  2. bạn không có quyền truy cập vào root
  3. (các) ứng dụng của bạn chỉ cần kết xuất văn bản ở đâu đó
  4. (các) ứng dụng của bạn không biết cách ghi vào syslog cục bộ
  5. bạn không có quyền kiểm soát mã nguồn ứng dụng của bạn

Vì vậy, hãy giải quyết từng vấn đề theo trình tự:

  1. syslog có nghĩa là để tổng hợp các bản ghi với nhau. Bạn có thể sử dụng bất cứ thứ gì bạn thích, nhưng có một lý do tại sao nó đã tồn tại trong một thời gian dài. Nó được thử nghiệm tốt, được gỡ lỗi tốt, được ghi chép đầy đủ, nổi tiếng và đối với hầu hết các nền tảng * nix gần như được hỗ trợ phổ biến trong hương vị này hay hương vị khác.
  2. chúng tôi không cần truy cập rootđể thiết lập đăng nhập. Chúng tôi chỉ cần truy cập vào API syslog. rootkhông phải là một yêu cầu để viết vào syslog; nếu đây là trường hợp, thì tất cả các dịch vụ bỏ đặc quyền đó sẽ không thể ghi chẩn đoán vào tệp nhật ký.
  3. Re: bãi văn bản, điều này là bình thường. tuy nhiên, bạn sẽ có thể sử dụng một lớp con để chuyển đầu ra của STDERR và STDOUT sang một chương trình gọi API syslog. Đây không phải là khoa học tên lửa, nó không phải là dễ vỡ, và nó được ghi chép lại. Trên thực tế, đó là một trong những lý do khiến chuyển hướng đầu ra thậm chí còn tồn tại. Một lệnh đơn giản có thể được ném vào một tập lệnh shell duy nhất sẽ là:

    (ứng dụng của tôi 2> & 1 | my-syslog-shunt) &

  4. nếu bạn có khả năng thay đổi mã nguồn của ứng dụng, bạn nên viết một shunt vào nó để kết xuất văn bản thành syslog thay vì tệp văn bản thuần túy. Điều này không nên quá khó; tất cả những gì bạn làm là lấy các dòng bạn sẽ xuất ra và kết thúc chúng bằng một cuộc gọi. Tuy nhiên....

  5. bạn có thể không có quyền truy cập vào mã nguồn, vì vậy bạn không thể làm điều này. Điều đó có nghĩa là một cái gì đó như # 3 ở trên sẽ hoạt động tốt.


hai lý do: (1) đơn giản là vì, như đã đề cập, không có root hoặc sudo trên các hộp trong câu hỏi. (2) Bản thân "logger" có thể chuyển tiếp đến máy chủ từ xa, nhưng có giới hạn 400 ký tự trên mỗi dòng nhật ký, không phù hợp với nhật ký Apache. Dù sao, tôi đã kết hợp một giải pháp tùy chỉnh thực hiện chính xác những gì tôi cần (và cũng cải thiện "logger"). Xem câu trả lời của tôi ở đây cho "filelogger"
Michael Martinez

4. Syslog không chỉ là một luồng tệp mà tôi có thể mở và viết văn bản. Các shunt tôi viết sẽ phải mở một ổ cắm cho cổng UDP mà syslog lắng nghe?
Noumenon

1
@Noumenon, tôi không hoàn toàn rõ ràng về ý định của bạn, nhưng tôi giả sử bạn muốn đưa đầu ra chương trình vào nhật ký hệ thống, có thể được thực hiện bằng lệnh logger. linux.die.net/man/1/logger
Avery Payne

@AveryPayne Rất thích Runtime.exec("logger ...") OK, cảm ơn.
Noumenon

0

Tôi đang trả lời câu hỏi của riêng tôi.

swatch có thể đã hoạt động, nhưng tôi không thể để mô-đun Sys :: Syslog của perl hoạt động trên máy chủ và / usr / bin / logger được cài đặt trên máy chủ không hỗ trợ đăng nhập vào máy chủ từ xa (produc-linux-ng- 2.17.2).

Vì vậy, điều đầu tiên tôi làm là tải xuống mã nguồn cho produc-linux-2.20.1 mà chương trình logger không hỗ trợ ghi nhật ký từ xa. Khi thử nghiệm, rõ ràng có giới hạn về số lượng ký tự được phép trên dòng nhật ký. Đi sâu vào mã nguồn tôi thấy giới hạn 400 ký tự được mã hóa cứng. (Nếu bạn không tin tôi, hãy chạy "chuỗi / usr / bin / logger | grep 400" trên bất kỳ hệ thống Linux nào).

Giới hạn này không được chấp nhận đối với loại ghi nhật ký apache (bao gồm cả nodejs), vì vậy tôi đã sửa đổi mã và tăng giới hạn lên 4096. Trong khi tôi ở đó, tôi cũng đã thêm một tùy chọn dòng lệnh mới cho phép người ta chèn tùy chọn dòng lệnh chuỗi văn bản ở đầu mỗi dòng nhật ký. Tôi đã làm điều này bởi vì các bản ghi của nodejs không bao gồm tên máy chủ như người ta có thể thấy trong apache.

Tại thời điểm này, tôi có thể chạy tập lệnh shell với "tail -F -n 0 [logfile] | ./modified_logger ...." và nó đã hoạt động. Nhưng tôi có một số lo ngại về việc chạy nó từ giám sát (daemontools) hoặc thậm chí ở chế độ nền, bởi vì nếu một hoặc các mặt khác của đường ống chấm dứt, thì có nguy cơ toàn bộ đường ống sẽ chấm dứt. Tôi cũng có những lo ngại (mặc dù chưa được kiểm tra) về hiệu suất.

Vì vậy, tôi quyết định kết hợp chức năng đuôi với chức năng logger thành một nhị phân thực thi duy nhất có thể bỏ qua nhu cầu sử dụng các ống Unix hoặc các chương trình bên ngoài. Tôi đã làm điều này bằng cách hack tail.c từ gnu coreutils và kết hợp những gì tôi cần vào chương trình logger đã sửa đổi.

Kết quả là một nhị phân mới (kích thước 117k) mà tôi đang gọi là "filelogger" và liên tục theo dõi một hoặc nhiều tệp và ghi nhật ký từng dòng mới vào một syslog cục bộ hoặc từ xa, thông qua UDP hoặc TCP. Nó hoạt động như một say mê. Tôi đã có thể thực hiện một số điểm chuẩn nhỏ và nó ghi lại khoảng 17.000 dòng (1,8 MB) trong khoảng 3 giây trên các mạng con với một vlan và một vài chuyển đổi vật lý giữa chúng, đến một máy chủ từ xa chạy syslog-ng.

để chạy chương trình, bạn làm một cái gì đó như sau (ở nền trước, nền hoặc được giám sát với daemontools):

./filelogger -t 'access' -d -p local1.info -n [loghost từ xa] -u / tmp / bị bỏ qua -a $ (tên máy chủ) / tmp / myfile1 / tmp / myfile2 ...

/ tmp / myfile1 và / tmp / myfile2 là các tệp đang được theo dõi.

"-A" là tùy chọn mới mà tôi đã thêm. Trong trường hợp này, tôi chèn tên máy chủ cục bộ ở đầu mỗi dòng nhật ký.

Giải pháp này chính xác là loại giải pháp tôi đang tìm kiếm khi tôi đặt câu hỏi và, hóa ra, nó không tồn tại cho đến khi tôi tự thực hiện. :)


Có thể tôi sẽ làm điều này có sẵn trên sourceforge tại một số điểm. Ưu điểm của nó là dấu chân rất nhỏ, nhẹ, dễ sử dụng và được tối ưu hóa cho hiệu suất. Khi văn bản tin nhắn được đọc, tất cả quá trình xử lý được thực hiện trong bộ nhớ đệm sau đó được chuyển trực tiếp vào ổ cắm.
Michael Martinez


4
Tôi đang cố gắng không phải là khắc nghiệt, nhưng tôi đang sẽ cùn: Giải pháp này không tồn tại bởi vì nó khủng khiếp. Thay vì can thiệp vào các nhóm khác trong tổ chức của bạn và thực hiện một giải pháp lành mạnh, tiêu chuẩn bạn đã thực hiện một vụ hack với mã hoàn toàn không được hỗ trợ mà bây giờ bạn cần kiểm tra / gỡ lỗi / duy trì trong tương lai. Bạn đã bỏ qua dễ dàng hơn 50 năm kinh nghiệm kết hợp nói với bạn "Đừng làm thế" - Tôi hy vọng vì lợi ích của bạn, điều này sẽ không thổi vào mặt bạn, nhưng bạn chắc chắn, không nghi ngờ gì nữa, làm điều đó sai ở đây ...
voretaq7

1
vâng đúng .... Đây là cách nguồn mở di chuyển về phía trước, anh bạn. Nếu mọi người làm theo cách của bạn, sẽ không có tiến bộ. Bạn nghĩ GNU, Linux và mọi thứ dựa trên nó như thế nào? Mọi người làm chính xác những điều tôi đã làm ở đây. Nếu nó làm cho bạn cảm thấy tốt hơn, tôi có ý định mã của mình vào hệ thống quản lý gói của chúng tôi, nơi mọi người ở đây trong tổ chức có thể tự do sử dụng nó, triển khai nó và cải thiện nó, nếu họ mong muốn.
Michael Martinez

Và FYi, nó không phải là một giải pháp khủng khiếp. Ngược lại, nó là một công cụ rất hữu ích. Khi tôi đang tìm kiếm trực tuyến các giải pháp vào tuần trước, tôi đã bắt gặp những người khác hỏi họ có thể tìm thấy chức năng chính xác này ở đâu.
Michael Martinez
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.