Làm cách nào để khôi phục `/ dev / log` trong máy chủ systemd + rsyslog?


10

Trên RHEL7, systemd-journaldtiếp quản nhiều phản hồi về những gì đã từng được thực hiện rsyslogd. Cho dù do lỗi hoặc xung đột giữa hai daemon này, đôi khi /dev/logsẽ bị mất. Do đó, các chương trình dựa trên syslog(3)cuộc gọi sẽ không hoạt động chính xác, bao gồm, ví dụ , logger. Làm thế nào tôi có thể khôi phục /dev/logổ cắm?

Câu trả lời:


13

Đặt câu hỏi và trả lời câu hỏi của riêng tôi bởi vì Google không hữu ích cho vấn đề này.

Thông thường, với rsyslogd, imuxsockmô-đun sẽ tự tạo /dev/logổ cắm, hủy liên kết mục nhập trước đó trước khi tạo nó. Khi rsyslogdbị dừng (có thể do khởi động lại không thành công do cấu hình bị lỗi), rsyslogd sẽ xóa /dev/log .

Tuy nhiên, rsyslog được cung cấp RHEL7dự kiến ​​sẽ được sử dụng cùng với systemdimuxsockmô-đun sẽ thực sự mở và loại bỏ /run/systemd/journal/syslogổ cắm. Trong khi đó, /dev/logthiết bị được tạo bởi tệp dịch vụ hệ thống systemd-journald.socketkích hoạt journald.

Rõ ràng, cho dù $imjournalmô-đun được sử dụng hay không , các công việc sau đây.

Tóm lại, nếu /dev/logbiến mất:

  1. khởi động lại systemd-journald.socket:

    systemctl restart systemd-journald.socket
    
  2. sau đó khởi động lại rsyslogd

    systemctl start rsyslogd
    

CẬP NHẬT: Tôi tin rằng restart rsyslogdcó thể xóa lại ổ cắm nếu rsyslogdđang chạy.


2
Cảm ơn rất nhiều cho việc này! Tôi chỉ mất vài giờ để theo dõi lý do tại sao đăng nhập không hoạt động cho một dịch vụ. Cuối cùng tôi đã theo dõi nó đến phần còn thiếu / dev / log, dẫn tôi đến giải pháp của bạn.
Chad Huneycutt

4

Các systemctl restart systemd-journald.socket && systemctl restart rsysloggiải pháp đã không làm việc cho tôi trên Ubuntu 16.04.

Thay vào đó, tôi phải tạo lại /dev/lognhư một liên kết tượng trưng đến /run/systemd/journal/dev-log:

ln -s /run/systemd/journal/dev-log /dev/log

Có, liên kết thủ công nên làm việc là tốt. Nhưng đó là một chút khó nhớ. Câu hỏi: Trên Ubuntu có systemd-journald.sockettồn tại như một dịch vụ không? Q2: có lẽ restart rsyslogdvấn đề là gì? Có lẽ nó nên đơn giản start rsyslogd?
Otheus

Q1: có, nó tồn tại. Q2: không có restartlệnh nữa, có service/etc/init.d/rsyslog.
11181

Bởi restart rsyslogdtôi nghĩ nó rõ ràng systemctl restart rsyslogd. Ubuntu vẫn sử dụng các tập lệnh init cho rsyslog chứ?
Otheus

@Otheus /etc/init.d/rsyslog stoptheo sau /etc/init.d/rsyslog startkhông giúp được gì. Nó lại không bổ systemctl stop syslog.socket rsyslog.service && systemctl start syslog.socket rsyslog.serviceTrên hệ thống của tôi có cả hai /lib/systemd/system/rsyslog.service/etc/init.d/rsyslog. Dù sao, tôi không muốn dành nhiều thời gian hơn cho vấn đề này.
11181

0

Đối với tôi điều này cuối cùng là một vấn đề với cách mô-đun imuxsock được sử dụng trong rsyslog hoạt động với systemd.

Trong tài liệu imuxsock, họ sẽ tìm hiểu cách mô-đun được cho là hoạt động cho systemd. Bước 1 là nơi tôi đã thấy vấn đề:

Bước 1: Chọn tên của ổ cắm hệ thống

  1. Nếu người dùng chưa chọn rõ ràng để đặt SysSock.Use = "tắt" thì ổ cắm trình nghe mặc định (hay còn gọi là ổ cắm nhật ký hệ thống, hay tên đơn giản là ổ cắm hệ thống) được đặt thành / dev / log. Mặt khác, nếu người dùng đã đặt rõ ràng SysSock.Use = "tắt", thì rsyslog sẽ không nghe trên / dev / log HOẶC bất kỳ ổ cắm nào được xác định bởi tham số SysSock.Name và phần còn lại của phần này không áp dụng.

  2. Nếu người dùng đã chỉ định sysSock.Name = "/ path / to / custom / socket" (và không đặt rõ ràng SysSock.Use = "off"), thì tên ổ cắm trình nghe mặc định được ghi đè bằng / path / to / custom / socket .

  3. Mặt khác, nếu rsyslog đang chạy trong systemd AND / run / systemd / Tạp chí / syslog tồn tại, (VÀ người dùng chưa đặt rõ ràng SysSock.Use = "tắt") thì tên ổ cắm trình nghe mặc định được ghi đè bằng / run / systemd / tạp chí / syslog.

Hệ thống nên rơi vào Bước 3 và thay đổi đường dẫn mặc định thành "/ run / systemd / tạp chí / syslog" nhưng thay vào đó, nó vẫn còn "/ var / log". Điều này có nghĩa là mô-đun imuxsock sẽ cố gắng (và đôi khi thành công) để tạo ra một ổ cắm tại / dev / log trong đó thay vào đó là liên kết tượng trưng được tạo bởi systemd-journald-dev-log.socket. Trong trường hợp không thể tạo được ổ cắm thực, liên kết tượng trưng vẫn sẽ bị xóa.

Tài liệu đó là kết quả của vấn đề này được báo cáo trên github rsyslog. Nếu bạn muốn bỏ qua cuộc thảo luận và chuyển thẳng đến các thay đổi, hãy xem PR # 1PR # 2 tương ứng.

Giải pháp của tôi là chỉ cần cấu hình mô-đun imuxsock để sử dụng đường dẫn systemd trong /etc/rsyslog.conf:

module(load="imuxsock"
    SysSock.Name="/run/systemd/journal/syslog")

Điều này dường như đã khắc phục vấn đề của tôi và nghe có vẻ là một giải pháp tốt ở đây vì nó sẽ giải thích tại sao liên kết tượng trưng có thể biến mất một lần nữa sau khi bạn tự tạo nó.

Nếu bạn nhìn vào hệ thống của mình và "/ run / systemd / tạp chí / syslog" không có mặt, hãy nhìn vào "syslog.socket" để xem nó có bắt đầu thành công không vì đó là nguyên nhân tạo ra ổ cắm.

systemctl status syslog.socket

Có thể là phiên bản rsyslog.service của bạn không định nghĩa syslog.service là bí danh cần thiết khi syslog.socket cố gắng kích hoạt dịch vụ đó. Cũng có thể nhiều dịch vụ ghi nhật ký cố gắng bí danh syslog.service trong trường hợp cuối cùng được kích hoạt sẽ thắng.

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.