"শেষ বার 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}')"

কেবলমাত্র যদি ওয়ান-লাইনার হিসাবে কারও এটির প্রয়োজন হয়: জার্নালটেল - সংস্কৃতি " systemctl show -p ActiveEnterTimestamp thermo.service | awk '{print $2 \" \" $3}'" -ফু থার্মো.সার্ভিস | কম
DimanNe

আপনি এটিও ব্যবহার করতে পারেন systemctl show -p ActiveEnterTimestamp --value $unit, তাই অতিরিক্ত
বেতনের

4

আপনি সেই বুট থেকে কেবল লগগুলি আনতে বুট পতাকা ব্যবহার করতে পারেন। এই ক্ষেত্রে

journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5

2
এটি আমি যা চাই তার অনুরূপ, তবে এটি পরিস্থিতিতে যেমন কাজ করে না: 1) মেশিনটি গতবার থেকে পরিষেবাটি চালুর পরে পুনরায় চালু করা হয়েছে বা 2) যদি পরিষেবাটি শেষ বুট হওয়ার পরে একাধিকবার চালানো থাকে।
জ্যাক ও'কনোর

আমি নিশ্চিত না কেন এটি 1 ম কেসের ক্ষেত্রে কাজ করে না। এটি পুনরায় বুট করা থাকলে, এটিও পুনরায় বুট করা হবে। আপনাকে কেবলমাত্র সেই নির্দিষ্ট বুটে যেতে হবে এবং আপনার তথ্য আনতে হবে। দ্বিতীয় সম্পর্কে ... আপনি ঠিক বলেছেন। শব্দটি লগগুলি পরিষেবাটি কতবার রিবুট করা হয়েছে তার উপর নির্ভর করে। তবে একবার আপনি নিজের পরিষেবা পিডকে চিহ্নিত করলে আপনি এটি _PID = XXX টি যুক্তি ব্যবহার করে ফিল্টার করতে পারবেন। একই বুট চক্রে একই পরিষেবাটির জন্য একই পিড পুনরায় ব্যবহার করার সম্ভাবনাগুলি ..... কোনও ধারণা নেই ... বরং অসম্ভবের কাছাকাছি।
নিকোলাইডিস ফোটিস

আমি সেবার পরিচালনা করতে আগ্রহী যেগুলি অগত্যা বুট-এ চালিত হয় না, কারণ তারা টাইমারগুলিতে থাকে বা তারা ওয়ান-অফ কমান্ড বলে।
জ্যাক ও'কনোর

4

এগুলি আপনাকে সহায়তা করতে পারে:

  • জার্নাল্টেল -u foo.service | লেজ -n 2

    বা প্রত্যাশিত সংখ্যক লাইনের সাথে 2 প্রতিস্থাপন করুন

  • জার্নালটেল -ইউ foo.service - সংস্কৃতি = ' 2016-04-11 13:00:00 '

প্রথমবারের সর্বশেষ রান সময় টাইমস্ট্যাম্প পেতে আপনি তাদের একত্রিত করতে পারেন এবং তারপরে - সিনস সুইচের সাহায্যে সেই টাইমস্ট্যাম্পটি ব্যবহার করতে পারেন।


এটি পিআইডি পদ্ধতির অনুরূপ কাজের মতো অনুভব করে তবে এটি খুব ম্যানুয়াল। যদি আমার পরিষেবাটি বেশ কয়েক সেকেন্ডেরও বেশি সময় ধরে চলে এবং অনেক লগ লাইন ছিটকে যায় তবে আমার প্রথম লাইনের সন্ধান করতে হবে যেটির আমার কাছে প্রারম্ভিক টাইমস্ট্যাম্প রয়েছে। এটি কোনও স্ক্রিপ্টে খুব ভাল কাজ করবে না।
জ্যাক ও'কনোর

3

আপনি জার্নাল্টেল দিয়ে ফিল্ড ফিল্টার ব্যবহার করতে পারেন। যেমন

journalctl _PID=1234

ব্যবহার করে সমস্ত উপলব্ধ ক্ষেত্রের একটি তালিকা পান:

journalctl --fields --unit kubelet

একটি উপলব্ধ ক্ষেত্র _PID

ব্যবহার করে আপনি একটি চলমান প্রক্রিয়ার PID, পেতে পারেন pidofবাsystemctl show --property MainPID <SERVICE_NAME>

সুতরাং আমি কীভাবে বর্তমান কুবেরনেটস কুবেলেট প্রক্রিয়া থেকে লগগুলি পেতে পারি তা এখানে:

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

এখন আমাকে বলুন কেন আমি কুবারনেটস ইনস্টল করা এত কঠিন :-(


0

জার্নাল্টেল -আর | grep -m1 foo.service


1
সার্ভারফল্টে আপনাকে স্বাগতম। আপনি ইতিমধ্যে এখানে থাকা অন্যান্য উত্তরগুলির তুলনায় এটি কীভাবে ভাল বা ভিন্ন তা ব্যাখ্যা করতে পারেন? serverfault.com/help/how-to-answer
ছানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.