Có cách nào để tạo nhật ký hiển thị nhật ký từ Nhật Bản lần trước khi foo.service chạy trên mạng không?


15

Tôi đặc biệt quan tâm đến việc này để xem đầu ra của các dịch vụ oneshot chạy trên bộ đếm thời gian. Các --unitlá cờ gần, nhưng nó concatenates tất cả chạy của dịch vụ với nhau. Cách rõ ràng nhất mà tôi có thể nghĩ đến là lọc trên PID, nhưng điều đó khiến tôi lo lắng về việc sử dụng lại các dịch vụ / dịch vụ của PID, và việc sử dụng PID cuối cùng khá bất tiện. Có một số định danh khác tương ứng với một lần chạy dịch vụ mà tôi có thể sử dụng để lọc nhật ký không?

EDIT: Tôi sẽ vui vẻ chấp nhận một từ "không" có thẩm quyền nếu đó là câu trả lời thực sự.

Câu trả lời:


6

Kể từ systemdphiên bản 232, chúng tôi có khái niệm về ID gọi. Mỗi khi một đơn vị được chạy, nó có một ID gọi 128 bit duy nhất. Không giống như MainPIDcó thể được tái chế, hoặc ActiveEnterTimestampcó thể có rắc rối giải quyết, đó là một cách không an toàn để có được tất cả nhật ký của một lời gọi đơn vị systemd cụ thể.

Để có được ID gọi mới nhất của một đơn vị

$ systemctl show --value -p InvocationID openipmi
bd3eb84c3aa74169a3dcad2af183885b

Để có được nhật ký về lời mời mới nhất của, giả sử openipmi, dù thất bại hay không, bạn có thể sử dụng một lớp lót

$ journalctl _SYSTEMD_INVOCATION_ID=`systemctl show -p InvocationID --value openipmi.service`
-- Logs begin at Thu 2018-07-26 12:09:57 IDT, end at Mon 2019-07-08 01:32:50 IDT. --
Jun 21 13:03:13 build03.lbits openipmi[1552]:  * Starting ipmi drivers
Jun 21 13:03:13 build03.lbits openipmi[1552]:    ...fail!
Jun 21 13:03:13 build03.lbits openipmi[1552]:    ...done.

(Lưu ý rằng --valuecó sẵn từ systemd 230, cũ hơn InvocationID)


Nếu ai đó đang cố gắng điều tra điều này: journalctl --user -u UNITFILE -f -o json-prettycó thể hữu ích; bạn đang tìm kiếm các MESSAGElĩnh vực cụ thể. Tôi phát hiện ra rằng bạn cũng có thể cần USER_INVOCATION_ID, và một số tin nhắn không có bất kỳ id gọi nào được đính kèm với chúng, vì vậy không thể lọc qua cơ chế này. Không chắc chắn tại sao, có thể đăng nhập của tôi bị định cấu hình sai ..
karlicoss

14

Tôi không chắc dấu thời gian nào có ý nghĩa nhất nhưng điều này hiệu quả với tôi. Hy vọng rằng có một cách làm việc tốt hơn với dấu thời gian từ systemctl showhơn awk - không thể tìm ra cách kiểm soát định dạng của dấu thời gian.

unit=foo.service

ts=$(systemctl show -p ActiveEnterTimestamp $unit)

echo $ts
ActiveEnterTimestamp=Fri 2016-11-11 12:30:01 MST

journalctl -u $unit --since "$(echo $ts | awk '{print $2 $3}')"

Chỉ trong trường hợp ai đó cần nó như một lớp lót: tạp chí --since " systemctl show -p ActiveEnterTimestamp thermo.service | awk '{print $2 \" \" $3}'" -fu thermo.service | ít hơn
DimanNe

Bạn cũng có thể sử dụng systemctl show -p ActiveEnterTimestamp --value $unit, vì vậy không cần thêm awk
karlicoss

4

Bạn có thể sử dụng cờ khởi động để chỉ tìm nạp các bản ghi từ khởi động đó. ví dụ

journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5

2
Điều này tương tự với những gì tôi muốn, nhưng nó không hoạt động trong các tình huống như: 1) nếu máy đã được khởi động lại kể từ lần cuối cùng dịch vụ chạy hoặc 2) nếu dịch vụ đã chạy nhiều lần kể từ lần khởi động cuối cùng.
Jack O'Connor

Tôi không chắc tại sao nó không hoạt động cho trường hợp đầu tiên. Nếu nó đã được khởi động lại, nó cũng sẽ được khởi động lại. Bạn chỉ cần đi đến khởi động cụ thể đó và lấy thông tin của bạn. Về thứ hai ... bạn đúng. Nhật ký tiếng ồn phụ thuộc vào số lần dịch vụ được khởi động lại. Nhưng một khi bạn đã phát hiện ra dịch vụ của mình, bạn có thể lọc nó bằng cách sử dụng đối số _PID = XXX. Cơ hội sử dụng lại cùng một dịch vụ cho cùng một dịch vụ trên cùng một chu kỳ khởi động là ..... không có ý tưởng nào ... nhưng gần như không thể.
Nikolaidis Fotis

Tôi quan tâm đến việc xử lý các dịch vụ không nhất thiết phải chạy khi khởi động, vì chúng là trên bộ hẹn giờ hoặc vì chúng là các lệnh một lần.
Jack O'Connor

3

Những thứ này có thể giúp bạn:

  • tạp chí -u foo.service | đuôi -n 2

    hoặc thay thế 2 với số dòng dự kiến

  • Tạp chí -u foo.service --since = ' 2016-04-11 13:00:00 '

Bạn cũng có thể kết hợp chúng để có được dấu thời gian chạy trước, và sau đó sử dụng dấu thời gian đó với công tắc --since.


Cảm giác này giống như một cách giải quyết tương tự như phương pháp PID, nhưng nó rất thủ công. Nếu dịch vụ của tôi chạy trong nhiều giây và tạo ra nhiều dòng nhật ký, tôi phải tìm kiếm dòng đầu tiên có dấu thời gian bắt đầu mà tôi quan tâm. Điều đó sẽ không làm việc rất tốt trong một kịch bản.
Jack O'Connor

3

Bạn có thể sử dụng các bộ lọc trường với Tạp chí. Ví dụ

journalctl _PID=1234

Nhận danh sách tất cả các trường có sẵn bằng cách sử dụng:

journalctl --fields --unit kubelet

Một lĩnh vực có sẵn là _PID.

Bạn có thể nhận được PID của một tiến trình đang chạy bằng cách sử dụng pidofhoặcsystemctl show --property MainPID <SERVICE_NAME>

Vì vậy, đây là cách tôi có được các bản ghi từ quá trình kubelet Kubernetes hiện tại:

# journalctl --unit kubelet _PID=$(systemctl show --property MainPID kubelet 2>/dev/null | cut -d= -f2) | head

Bây giờ hãy nói cho tôi tại sao tôi Kubernetes rất khó cài đặt :-(


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.