আপনি কিভাবে লগ ফাইলের শেষ n লাইন রাখবেন?


18

আমার লেখা একটি স্ক্রিপ্ট কিছু করে এবং শেষে, কিছু লাইন তার নিজস্ব লগফাইলে সংযোজন করে। আমি লগফাইলে কেবলমাত্র শেষ লাইনগুলি (1000 লাইন) রাখতে চাই। এটি স্ক্রিপ্টের শেষে এইভাবে করা যেতে পারে:

tail -n 1000 myscript.log > myscript.log.tmp
mv -f myscript.log.tmp myscript.log

তবে কি আরও পরিষ্কার এবং মার্জিত সমাধান আছে? সম্ভবত একটি কমান্ড মাধ্যমে সম্পন্ন?


logrotateমার্জিত সমাধান
আইপোর স্যারসার

1
আমি এটি ভেবেছি, তবে লোগ্রোটেট কনফিগারেশনটি স্ক্রিপ্টের চেয়ে বেশি দীর্ঘ হবে ...
dr01

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

উত্তর:


28

এটি এটির মতোই সম্ভব, তবে অন্যরা যেমন বলেছে, নিরাপদ বিকল্পটি একটি নতুন ফাইলের প্রজন্ম এবং তারপরে আসলটি ওভাররাইট করার জন্য সেই ফাইলটির সরানো।

নীচের পদ্ধতিটি বেসে রেখাগুলি লোড করে, সুতরাং লাইনগুলির সংখ্যার উপর নির্ভর করে tail, লগ লাইনের সামগ্রী সংরক্ষণের জন্য স্থানীয় শেলের মেমরির ব্যবহারকে প্রভাবিত করবে।

নীচে লগ ফাইলের শেষে থাকা খালি লাইনগুলিও সরিয়ে ফেলতে হবে (বেস মূল্যায়ন করার আচরণের কারণে "$(tail -1000 test.log)") সুতরাং সমস্ত পরিস্থিতিতে সত্যিকার অর্থে 100% নির্ভুল কাটা দেয় না, তবে আপনার পরিস্থিতির উপর নির্ভর করে যথেষ্ট হতে পারে।

$ wc -l myscript.log
475494 myscript.log

$ echo "$(tail -1000 myscript.log)" > myscript.log

$ wc -l myscript.log
1000 myscript.log

স্মার্ট। আমি এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করেছি কারণ এটি অতিরিক্ত সরঞ্জাম ইনস্টলেশন প্রয়োজন হয় না। আমি আশা করি আমি আপনার এবং @ জন 1024 এর উত্তর উভয়ই গ্রহণ করতে পারতাম।
dr01

আপনার কল আমি স্পঞ্জ সমাধানটি উত্সাহিত করেছি কারণ এটি সম্পর্কে আমি জানতাম না এবং এটি খালি লগ লাইনগুলিতে গণ্ডগোল না করার গ্যারান্টিযুক্ত। লগ ফাইলের বিষয়বস্তুর উপর নির্ভর করে এই সমাধানটিতে এটি করার সম্ভাবনা রয়েছে।
parkamark

এই সমাধানের একটি রেসের শর্ত রয়েছে। আপনি যদি দুর্ভাগ্য হন তবে ফাইলটি পুনঃনির্দেশ-ইনটো- ফাইলটি পড়ার আগে ঘটে - ফাইলটি আপনি খালি ফাইল দিয়ে শেষ করেন।
করুস

21

ইউটিলিটি কেবল spongeএই মামলার জন্য ডিজাইন করা হয়েছে। আপনি যদি এটি ইনস্টল করে থাকেন তবে আপনার দুটি লাইনই লেখা যেতে পারে:

tail -n 1000 myscript.log | sponge myscript.log

সাধারণত, আপনি যে ফাইলটি লিখছেন একই সময়ে কোনও ফাইল থেকে পড়া অবিশ্বাস্য। এটি পড়া শেষ না করা এবং পাইপটি সমাপ্ত spongeনা myscript.logহওয়া পর্যন্ত tailএটি না লিখে এটি সমাধান করে।

ইনস্টল করুন

spongeডেবিয়ান-মতো সিস্টেমে ইনস্টল করতে :

apt-get install moreutils

spongeকোনও RHEL / CentOS সিস্টেমে ইনস্টল করতে , EPEL রেপো যুক্ত করুন এবং তারপরে:

yum install moreutils

নথিপত্র

থেকে man sponge:

spongeস্ট্যান্ডার্ড ইনপুট পড়ে এবং নির্দিষ্ট ফাইলটিতে এটি লিখে দেয়। একটি শেল পুনর্নির্দেশের বিপরীতে, spongeআউটপুট ফাইলটি লেখার আগে এর সমস্ত ইনপুট আপ করে তোলে। এটি পাইপলাইনগুলি নির্মাণের অনুমতি দেয় যা একই ফাইল থেকে পড়ে এবং লেখতে পারে।


2
+1 ধন্যবাদ, আমি জানতাম না sponge। আপনার পক্ষে যারা হার্ড উপায় শিখতে পারেন না তাদের পক্ষে খুব দরকারী sort importantfile.txt > importantfile.txt:)
dr01

4

অবশ্যই "লেজ + এমভি" আরও ভাল! তবে gnu সেডের জন্য আমরা চেষ্টা করতে পারি

sed -i -e :a -e '$q;N;101,$D;ba' log

3

রেকর্ডের জন্য, edআপনার মতো কিছু করতে পারে

ed -s infile <<\IN
0r !tail -n 1000 infile
+1,$d
,p
q
IN

এটি আউটপুটে খোলে infileএবং rইডস tail -n 1000 infile(যেমন এটি 1 ম লাইনের আগে আউটপুট সন্নিবেশ করায়) এবং তারপরে প্রথমে 1 ম লাইনটি ফাইলের শেষ পর্যন্ত মুছুন। জায়গায় জায়গায় ফাইল সম্পাদনা করার ,pসাথে প্রতিস্থাপন করুন w। সমাধানগুলি বড় ফাইলগুলির জন্য উপযুক্ত না
হলেও এটি মনে রাখবেন ed


0

আপনি আপনার স্ক্রিপ্টে যা করতে পারেন তা হ'ল লগ রোটেশনের যুক্তি প্রয়োগ করা। কোনও ফাংশনের মাধ্যমে সমস্ত লগিং করুন:

log()
{
   ...
}

এই ফাংশনটি প্রথমত: এর মতো কিছু করে:

printf "%s\n" "$*" >> logfile

তারপরে, এটি ফাইলের আকার পরীক্ষা করে বা কোনওভাবে সিদ্ধান্ত নেয় যে ফাইলটি ঘোরানো দরকার। এই মুহুর্তে, ফাইলটি logfile.1যদি এটি উপস্থিত থাকে তবে সরিয়ে ফেলা হয়, ফাইলটি logfile.0উপস্থিত থাকলে তা পুনরায় নামকরণ করা হয় logfile.1এবং নতুন logfileনামকরণ করা হয় logfile.0

ঘোরানো হবে কিনা তা সিদ্ধান্ত নেওয়া স্ক্রিপ্টেই রক্ষণাবেক্ষণের ভিত্তিতে করা যেতে পারে। এটি যখন 1000 টি আঘাত করে তখন এটি শূন্যে পুনরায় সেট করা হয়।

যদি সর্বদা 1000 লাইনগুলিতে কঠোরভাবে ছাঁটাই করা প্রয়োজন হয় তবে স্ক্রিপ্টটি লগ ফাইলটি শুরু হওয়ার সাথে সাথে লাইন সংখ্যা গণনা করতে পারে এবং সেই অনুসারে কাউন্টারের সূচনা করতে পারে (বা যদি গণনা ইতিমধ্যে 1000 এর সাথে মিলিত হয় বা ততোধিক ঘোরান)।

অথবা আপনি wc -c logfileকোনও নির্দিষ্ট আকার অতিক্রমের উপর ভিত্তি করে ঘোরানো এবং এর মতো আকারটি অর্জন করতে পারেন । এই অবস্থাটি নির্ধারণের জন্য এই ফাইলটিকে কখনও স্ক্যান করতে হবে না।


0

পরিবর্তে, আমি ব্যবহার করেছি mvcpএটি অর্জনের জন্য আমি কমান্ডটি যে কোনও সফ্টওয়্যার যেদিকে চলছে সেখানে আপনি কিছু লগফিল রাখতে সক্ষম। বিভিন্ন ইউজার হোম ডায়ারে বা অ্যাপ্লিকেশন ডায়ারে থাকতে পারে এবং হার্ডলিংক হিসাবে এক জায়গায় সমস্ত লগ রয়েছে। আপনি যদি mvকমান্ডটি ব্যবহার করেন তবে আপনি হার্ড লিঙ্কটি হারাবেন। cpপরিবর্তে আপনি যদি আদেশটি ব্যবহার করেন তবে আপনি এই হার্ড লিঙ্কটি রাখবেন keep

আমার কোডটি এমন কিছু:

TMP_FILE="$(mktemp "${TMPFILENAME}.XXX")"

for FILE in "${LOGFILE_DIR}"/* ; do
    tail -n $MAXLINES "${FILE}" > "${TMP_FILE}"
    if [ $(ls -g "${TMP_FILE}" | awk '{print $4}') -lt $(ls -g "${FILE}" | awk '{print $4}') ] ; then
        cp "${TMP_FILE}" "${FILE}"
    fi
done   

সুতরাং যদি ফাইলগুলি একই ফাইল সিস্টেমে থাকে তবে আপনি ব্যবহারকারীদের এবং সেই সাথে কিছু আলাদা অধিকার দিতে পারেন ${LOGFILE_DIR} আমার মতো দৈর্ঘ্য পরিবর্তন করতে পারেন।

যদি হয় mv আদেশটি আপনি ফাইলগুলির মধ্যে হার্ডলিঙ্কটি হারাবেন এবং তাই আপনার দ্বিতীয় ফাইলটি প্রথমটির সাথে বেশি সংযুক্ত না হয় - সম্ভবত অন্য কোনও জায়গায় স্থাপন করা হয়েছে।

অন্য জায়গায় যদি আপনি কাউকে ফাইলটি মুছে ফেলতে না দেন তবে আপনার লগগুলি একসাথে থাকতে পারে এবং আপনার নিজের স্ক্রিপ্টের মাধ্যমে সুন্দর নিয়ন্ত্রণ করা যায়।

logrotateসম্ভবত ভাল। তবে আমি এই সমাধানে খুশি।

"" দ্বারা বিরক্ত হবেন না তবে আমার ক্ষেত্রে স্পেস এবং অন্যান্য বিশেষ অক্ষরের কিছু ফাইল রয়েছে এবং যদি আমি "" কাছাকাছি না করি বা পুরোটা খুব ভাল কাজ করে না।

উদাহরণস্বরূপ একটি দির রয়েছে যেখানে পুরানো ফাইলগুলি একটিতে স্বয়ংক্রিয়ভাবে জিপ হয়ে যায় OLDFILE.zipএবং জিপ করা সমস্ত কিছু ফাইলের তালিকাভুক্ত হয় .zip_logতাই .zip_logএই দিরটিতেও রয়েছে তবে LOGFILE_DIRআমার সাথে রয়েছে:

ln .zip_log "${LOGFILE_DIR}/USER_ZIP_log"

সমান ফাইল হিসাবে এটি একটি হার্ড লিঙ্ক।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.