Thông báo nhật ký khởi động trên Ubuntu 13.X ở đâu?


28

Trên Ubuntu 12.04, tôi có thể tìm thấy các thông điệp nhật ký khởi động /var/log/syslog.

Các lệnh:

# initctl log-priority info
# initctl emit hello

Nhật ký:

Apr  1 01:56:56 precise64 kernel: [ 8365.820425] init: Connection from private client
Apr  1 01:56:56 precise64 kernel: [ 8365.821130] init: Handling hello event

Trên Ubuntu 13.10, các thông báo không xuất hiện trong sysloghoặc bất kỳ nơi nào khác trong /var/logthư mục, mặc dù các lệnh như logger hellohoạt động như mong đợi. Tôi có nên tìm chúng ở một nơi khác không? Có một cài đặt cấu hình tôi cần thay đổi ở đâu đó không?

Có một câu hỏi về Server Fault từ một người nào đó dường như đang gặp vấn đề tương tự trên Ubuntu 13.04, và nhiều hơn nữa ở đâyđây cũng có thể mô tả cùng một vấn đề. Thật không may, những câu hỏi này không cung cấp dẫn cho vấn đề.

Câu trả lời:


39

Chỉnh sửa 2016-06 / 02

Nếu bạn đang cố gắng tìm "Thông báo nhật ký khởi động" nói chung, hãy kiểm tra /var/log/upstart/. Đó là nơi Upstart tiết kiệm stdoutstderrtừ các dịch vụ Upstart. Cảm ơn câu trả lời của leopd đã chỉ ra điều này.

Nếu bạn đang tìm kiếm thông điệp tường trình từ chính Upstart, được cấu hình initctl log-priorityvà phát ra bởi initctl emit, hãy đọc tiếp!

Phiên bản ngắn

Các mục nhật ký sẽ thực sự hiển thị trong dmesg. Mặc dù vậy, chúng không hiển thị theo mặc định /var/log.

Nếu bạn cũng muốn chúng /var/log, hãy thêm $KLogPermitNonKernelFacility onvào cấu hình của rsyslogd. Tôi khuyên bạn nên tạo một tệp tùy chỉnh /etc/rsyslog.d/60-custom.confđể tránh chỉnh sửa /etc/rsyslog.conf, vì đó được quản lý bởi dpkg. Bây giờ, các tin nhắn Upstart sẽ hiển thị /var/log/syslog, sau khi bạn thiết lập Upstart's log-prioritytrở lên info.

Phiên bản dài

Điều này khiến tôi mất nhiều ngày để theo dõi, nhưng dường như Upstart (1.5) không đăng nhập vào syslog, nghĩa là nó không gọi hàm glibc syslog(). Thay vào đó, Upstart đăng nhập vào bộ đệm vòng kernel, đó là những gì dmesg đọc. Bây giờ, tôi không nghĩ các quy trình không gian của người dùng có thể ghi vào bộ đệm đó, nhưng rõ ràng họ có thể viết bằng /dev/kmsgvà đó chính xác là những gì Upstart làm. Vì vậy, đó là phần đầu tiên của câu đố.

Phần thứ hai là có một niềm tin phổ biến rằng các thông điệp được ghi vào bộ đệm vòng kernel được tự động sao chép vào syslog bởi kernel (ít nhất đó là điều tôi luôn nghĩ). Hóa ra điều này thực sự được thực hiện bởi một daemon không gian người dùng, theo truyền thống klogd, hoạt động song song với syslogd. Rõ ràng rsyslogd thay thế syslogd nhưng rõ ràng nó cũng thay thế klogd (loại: xem ghi chú ở cuối).

Phần thứ ba là các tin nhắn được ghi vào bộ đệm vòng kernel từ không gian người dùng thực sự trông khác với các tin nhắn được viết từ không gian kernel: chúng có một phương tiện khác. dmesg có một vài tùy chọn mà tương tác với điều này: -xsẽ hiển thị các thiết bị (và ưu tiên), trong khi -u-knói dmesg để chỉ hiển thị các thông điệp cơ sở người dùng và thông điệp cơ sở hạt nhân, tương ứng.

Bây giờ đây là móc sắt: theo mặc định, rsyslogd bỏ qua các tin nhắn với một cơ sở không phải kernel khi nó đọc các tin nhắn từ bộ đệm vòng kernel. Tùy chọn cấu hình có liên quan $KLogPermitNonKernelFacilitylà tắt theo mặc định và cần được bật nếu bạn muốn rsyslogd xử lý các tin nhắn này. Lưu ý rằng phần còn lại của cấu hình rsyslogd sẽ coi tất cả các thông báo từ bộ đệm vòng nhân là có kerncơ sở, bất kể cơ sở mà chúng có trong bộ đệm vòng nhân.

Thêm thông tin

nhật ký hệ thống

Mã có thể ghi vào syslog bằng cách gọi hàm glibc syslog(), được mô tả trong man 3 syslog. Rõ ràng các chức năng này ghi vào /dev/log. Mã có thể đọc từ syslog bằng cách đọc /dev/log, và đây là những gì syslogdvà thay thế của nó làm. rsyslogdđọc /dev/logbằng imuxsockmô-đun đầu vào của nó .

Bộ đệm hạt nhân

Không gian hạt nhân ghi vào bộ đệm này bằng cách gọi hàm kernel printk(), vì vậy đôi khi nó được gọi là bộ đệm printk. Không gian người dùng có thể viết cho nó bằng cách viết vào /dev/kmsg. Không gian người dùng có thể đọc từ bộ đệm này bằng một số phương thức: nó có thể đọc từ /proc/kmsg(những gì dmesg làm theo mặc định) hoặc nó có thể đọc từ /dev/kmsghoặc nó có thể gọi cuộc gọi hệ thống syslog(), được mô tả trong man 2 sysloghoàn toàn khác với chức năng glibc syslog()được mô tả trong man 3 syslog. glibc thực sự cung cấp một trình bao bọc cho lệnh gọi hệ thống syslog(), được gọi klogctl(), để giúp giảm bớt sự nhầm lẫn này.

Theo truyền thống, klogdđọc từ một trong các giao diện này, sau đó gọi hàm glibc syslog()để sao chép chúng vào syslog. rsyslogd đọc một trong những giao diện này thông qua imklogmô-đun đầu vào của nó nhưng AFAIK không bận tâm đến việc gọi glibc syslog(), đó là lý do tại sao nó không giống như klogd; nó chỉ xử lý đầu ra imkloggiống như nó xử lý đầu ra từ bất kỳ mô-đun đầu vào nào khác. Có một cảnh báo bổ sung rằng tất cả imklogđầu ra có kerncơ sở bất kể các thông điệp cơ sở có trong bộ đệm vòng kernel.

Tài liệu tham khảo


4
Cảm ơn bạn đã giải thích sâu sắc về lý do tại sao điều này không hoạt động và cách khắc phục nó. Một trong những câu trả lời cho các câu hỏi được liên kết đã đề cập dmesgnhưng nó không có ý nghĩa gì nếu không có bối cảnh được đưa ra ở đây.
Bradd Szonye

16

Tôi tìm thấy tôi ở /var/log/upstart/


Tôi tìm thấy tôi trong file /var/log/upstart/job.logjoblà tên của công việc của tôi.
Kenny Evitt

AFAIK đó là nơi tiêu chuẩn / thiết bị xuất phát từ công việc. Câu hỏi này là về các thông điệp tường trình từ chính Upstart, không liên quan đến bất kỳ công việc cụ thể nào.
Vanessa Phipps
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.