वहाँ "पिछली बार foo.service भाग गया" से जर्नल शो लॉग बनाने का एक तरीका है?


16

मुझे इस पर विशेष रूप से दिलचस्पी है जो एक टाइमर पर चलने वाली ऑनशॉट सेवाओं के आउटपुट को देख रहा है। --unitझंडा करीब है, लेकिन यह सेवा के सभी रन एक साथ संयोजित करता। सबसे स्पष्ट तरीका मैं सोच सकता हूं कि पीआईडी ​​पर फ़िल्टर करना होगा, लेकिन इससे मुझे पीआईडी ​​के पुन: उपयोग / सेवाओं के बारे में चिंता होती है जो कांटा है, और अंतिम पीआईडी ​​प्राप्त करना बहुत असुविधाजनक है। क्या कोई अन्य पहचानकर्ता है जो किसी सेवा के एकल रन से मेल खाता है, जिसका उपयोग मैं लॉग को फ़िल्टर करने के लिए कर सकता हूं?

संपादित करें: मैं खुशी से एक आधिकारिक "नहीं" स्वीकार करूंगा यदि यह वास्तविक उत्तर है।

जवाबों:


8

systemdसंस्करण के बाद से 232, हमारे पास मंगलाचरण आईडी की अवधारणा है। जब भी कोई यूनिट चलाई जाती है, तो उसमें 128 बिट की एक विशिष्ट आईडी होती है। इसके विपरीत MainPIDजिसे पुनर्नवीनीकरण किया जा सकता है, या ActiveEnterTimestampजिसमें रिज़ॉल्यूशन की परेशानी हो सकती है, यह किसी विशेष सिस्टम यूनिट के सभी लॉग को प्राप्त करने का एक विफल तरीका है।

एक यूनिट की नवीनतम मंगलाचरण आईडी प्राप्त करने के लिए

$ systemctl show --value -p InvocationID openipmi
bd3eb84c3aa74169a3dcad2af183885b

के नवीनतम आह्वान के जर्नल को प्राप्त करने के लिए, कहें openipmi, चाहे वह विफल रहा या नहीं, आप एक लाइनर का उपयोग कर सकते हैं

$ 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.

(ध्यान दें कि --valueउपलब्ध है systemd 230, पुराने से अधिक InvocationID)


1
यदि कोई इसकी जांच करने की कोशिश कर रहा है: journalctl --user -u UNITFILE -f -o json-prettyसहायक हो सकता है; आप MESSAGEविशेष रूप से खेतों की तलाश कर रहे हैं । मुझे पता चला है कि आपको भी आवश्यकता हो सकती है USER_INVOCATION_ID, और कुछ संदेशों में उनके पास कोई आह्वान आईडी नहीं है, इसलिए इस तंत्र के माध्यम से फ़िल्टर नहीं किया जा सकता है। यकीन नहीं हो रहा है, शायद मेरी लॉगिंग गलत है ..
कार्लिस्क

14

मुझे यकीन नहीं है कि कौन सा टाइमस्टैम्प सबसे अधिक समझ में आता है लेकिन यह मेरे लिए काम करता है। उम्मीद है कि जाग से टाइमस्टैम्प के साथ काम करने का एक बेहतर तरीका है systemctl show- यह पता नहीं लगा सका कि टाइमस्टैम्प के प्रारूप को कैसे नियंत्रित किया जाए।

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}')"

बस के मामले में किसी को एक-लाइनर के रूप में इसकी आवश्यकता होती है: journalctl --since " systemctl show -p ActiveEnterTimestamp thermo.service | awk '{print $2 \" \" $3}'" -fu thermo.service | कम
दीमनैन

आप भी उपयोग कर सकते हैं systemctl show -p ActiveEnterTimestamp --value $unit, इसलिए अतिरिक्त
जाग की

4

आप उस बूट से केवल लॉग लाने के लिए बूट फ्लैग का उपयोग कर सकते हैं। उदाहरण के लिए

journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5

2
यह वैसा ही है जैसा मैं चाहता हूं, लेकिन यह उन स्थितियों में काम नहीं करता है जैसे: 1) यदि पिछली बार सेवा चलने के बाद से मशीन को रिबूट किया गया है, या 2) यदि सेवा अंतिम बूट के बाद से कई बार चली है।
जैक ओ'कॉनर

मुझे यकीन नहीं है कि यह 1 मामले के लिए काम क्यों नहीं करता है। अगर इसे रिबूट किया गया है, तो भी रिबूट किया जाएगा। आपको बस उस विशिष्ट बूट पर जाना है और अपनी जानकारी प्राप्त करनी है। दूसरे के बारे में ... आप सही हैं। शोर लॉग सेवा की रिबूट की गई संख्या पर निर्भर करता है। लेकिन एक बार जब आप अपनी सेवा को बंद कर देते हैं तो आप इसे _PID = XXX तर्क का उपयोग करके फ़िल्टर कर सकते हैं। समान बूट चक्र पर समान सेवा के लिए एक ही पिड के पुन: उपयोग की संभावनाएं हैं ..... कोई विचार नहीं ... बल्कि असंभव के करीब।
निकोलाइडिस फोटिस

मैं उन सेवाओं को संभालने में दिलचस्पी रखता हूं जो जरूरी नहीं कि बूट पर चलती हैं, क्योंकि वे टाइमर पर हैं या क्योंकि वे वन-ऑफ कमांड हैं।
जैक ओ'कॉनर

4

ये आपकी मदद कर सकते हैं:

  • journalctl -u foo.service | पूंछ -२ २

    या लाइनों की अपेक्षित संख्या के साथ 2 बदलें

  • journalctl -u foo.service --since = ' 2016-04-11 13:00:00 '

आप पहली बार अंतिम रन टाइम टाइमस्टैम्प प्राप्त करने के लिए उन्हें जोड़ सकते हैं, और फिर उस टाइमस्टैम्प का उपयोग - theSince स्विच के साथ कर सकते हैं।


यह पीआईडी ​​दृष्टिकोण के समान एक वर्कअराउंड की तरह महसूस करता है, लेकिन यह बहुत मैनुअल है। यदि मेरी सेवा कई सेकंड से अधिक चलती है, और कई लॉग लाइनें समाप्त हो जाती हैं, तो मुझे पहली पंक्ति की खोज करनी होगी जिसमें शुरुआती टाइमस्टैम्प है जिसकी मुझे परवाह है। यह एक स्क्रिप्ट में बहुत अच्छा काम नहीं करेगा।
जैक ओ'कॉनर 19

3

आप Journalctl के साथ फ़ील्ड फ़िल्टर का उपयोग कर सकते हैं। उदाहरण के लिए

journalctl _PID=1234

सभी उपलब्ध फ़ील्ड का उपयोग करके एक सूची प्राप्त करें:

journalctl --fields --unit kubelet

एक उपलब्ध क्षेत्र है _PID

आप का उपयोग करके pidofया एक चल रही प्रक्रिया की PID प्राप्त कर सकते हैंsystemctl show --property MainPID <SERVICE_NAME>

तो यहां बताया गया है कि मुझे वर्तमान कुबेरनेट्स क्यूबलेट प्रक्रिया से लॉग कैसे मिलते हैं:

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

अब मुझे बताइए कि मैं कुबेरनेट्स को स्थापित करना इतना कठिन क्यों है :-(


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.