ডকার পাত্রে সঠিকভাবে লগগুলি কীভাবে সাফ করবেন?


210

আমি docker logs [container-name]একটি নির্দিষ্ট ধারকের লগগুলি দেখতে ব্যবহার করি ।

এই লগগুলি সাফ করার জন্য কি কোনও দুর্দান্ত উপায় আছে?


14
সাইডনোটে, আপনি লগগুলির আকারের মাধ্যমে পেতে পারেনsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log"
ড্যানিয়েল এফ

উত্তর:


251

এই প্রশ্ন থেকে একটি ওয়ান লাইনার রয়েছে যা আপনি চালাতে পারেন:

echo "" > $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

বা অনুরূপ কাটা কমান্ড আছে:

truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name_or_id>)

তারা ডকারের ফাইলগুলি সরাসরি সংশোধন করে যেহেতু আমি তাদের কারও মধ্যে বড় ভক্ত নই। বহিরাগত লগ মুছে ফেলার সময় ঘটতে পারে যখন ডকার ফাইলটিতে জসন ফর্ম্যাট করা ডেটা লিখছেন, ফলে একটি আংশিক লাইন তৈরি হয় এবং docker logsক্লিমে থেকে কোনও লগ পড়ার ক্ষমতা ভঙ্গ করে ।

পরিবর্তে, আপনি ডকার আপনার জন্য লগগুলি স্বয়ংক্রিয়ভাবে ঘোরান। আপনি যদি ডিফল্ট JSON লগিং ড্রাইভার ব্যবহার করে থাকেন তবে ডকার্ড করার জন্য এটি অতিরিক্ত পতাকাগুলির সাথে সম্পন্ন করা হয় :

dockerd ... --log-opt max-size=10m --log-opt max-file=3

আপনি এটি আপনার স্টার্টআপ স্ক্রিপ্টগুলি পরিবর্তনের পরিবর্তে আপনার ডেমন.জেসন ফাইলের অংশ হিসাবে সেট করতে পারেন :

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

এই বিকল্পগুলি রুট অ্যাক্সেসের সাথে কনফিগার করা দরকার। systemctl reload dockerসেটিংস প্রয়োগ করতে এই ফাইলটি পরিবর্তন করার পরে একটি চালানো নিশ্চিত করুন । এই সেটিংটি নতুন যে কোনও তৈরি পাত্রের জন্য পূর্বনির্ধারিত হবে। দ্রষ্টব্য, নতুন লগ সীমা পাওয়ার জন্য বিদ্যমান পাত্রে মুছে ফেলা এবং পুনরায় তৈরি করা দরকার।


এই ডিফল্টগুলিকে ওভাররাইড করার জন্য অনুরূপ লগ বিকল্পগুলি পৃথক পাত্রে পাস করা যেতে পারে, আপনাকে পৃথক ধারকগুলিতে কম বা কম লগ সংরক্ষণ করতে দেয়। এর থেকে docker runদেখতে:

docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 ...

বা একটি রচনা ফাইলের মধ্যে:

version: '3.7'
services:
  app:
    image: ...
    logging:
      options:
        max-size: "10m"
        max-file: "3"

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

{
  "log-driver": "local",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

স্থানীয় ড্রাইভারের সর্বনিম্নতা হ'ল বহিরাগত লগ পার্সার / ফরোয়ার্ডারগুলি যা জসন লগগুলিতে সরাসরি অ্যাক্সেসের উপর নির্ভর করে আর কাজ করবে না। সুতরাং আপনি যদি ইলাস্টিক, বা স্প্লঙ্কের সার্বজনীন ফরোয়ার্ডারে ফাইলব্যাট প্রেরণের জন্য কোনও সরঞ্জাম ব্যবহার করেন তবে আমি "স্থানীয়" ড্রাইভারটি এড়াতে চাই।

আমার টিপস এবং ট্রিকস উপস্থাপনায় আমি এটিতে আরও কিছুটা পেয়েছি ।


6
আমি service docker restart নিজে থেকে একটি কাজ করেছি যা কাজ করে না। এটি কার্যকর হওয়ার আগে নতুন কনটেইনার তৈরি করতে হয়েছিল। অর্থাত্ কেবল পুরানো পাত্রে আনতে নতুন লগিং প্রয়োগ হয়নি
রব্বো_উইকে

আমি ডকার 1.13.1 ব্যবহার করছি এবং 'ডকার পরিদর্শন - ফর্ম্যাট =' {{Log ডকার লগগুলি <কনটেইনার আইডি> '???? এটি কোথা থেকে আসছে এবং আমি কীভাবে এটি পরিষ্কার করব ??
জেডি অ্যালেন

@ জেডিএলেন ১.১৩.১. এর সমর্থন অনেক দীর্ঘ। তাদের পরিদর্শন আউটপুটটি দেখতে আমার কাছে এমন কোনও সিস্টেম নেই।
বিএমইচ ২

আরও ভাল হবে echo -n > ...। যাইহোক, আমি আমার লগগুলিতে আরও নিয়ন্ত্রণ রাখতে সক্ষম হতে চাই। উদাহরণস্বরূপ, ডকার-রচনা পুনরায় আরম্ভ করার পরে , আমি সংরক্ষিত লগগুলির সাথে কিছু করার জন্য প্রক্রিয়াটি পছন্দ করতে চাই।
নারানাসকে

2
@ অ্যালেক্সিস উইলক যদি আপনি ডকার থামাতে সক্ষম হন তবে আপনি সম্ভবত আপনার ধারকটি থামাতে সক্ষম হবেন। আপনি যদি পরে কাজটি করতে পারেন তবে লগিং বিকল্পগুলির সাহায্যে ধারকটি পুনরায় তৈরি করা আমার পরামর্শ হবে। নতুন ধারকটির কোনও পুরানো লগ নেই এবং নতুন লগগুলি স্বয়ংক্রিয়ভাবে ঘূর্ণিত হবে, একই সময়ে স্বল্পমেয়াদী এবং দীর্ঘমেয়াদী উভয় সমস্যার সমাধান করবে।
বিএমচ

226

ব্যবহার করুন:

truncate -s 0 /var/lib/docker/containers/*/*-json.log

আপনার সুডোর দরকার হতে পারে

sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

সুত্র। জেফ এস ডকার পাত্রে সঠিকভাবে লগগুলি কীভাবে সাফ করবেন?

তথ্যসূত্র: কোনও ফাইল ব্যবহার করার সময় এটি কাটা হচ্ছে (লিনাক্স)


4
সংক্ষিপ্ত আকার: লেখার জন্য '/var/lib/docker/containers/*/*-json.log' খুলতে পারবেন না: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
বিটিআর নাইডু

2
@ বিটিআরনাইডু আপনাকে এটিকে মূল / সুডো হিসাবে চালাতে হবে, containersঅন্যথায় লিখিত সামগ্রী উপলব্ধ নেই।
স্পাইডন

25
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"- আমার জন্য কাজ করেছে
জেফ এস।

7
উপরের দুটি পেশাদারকে উপেক্ষা করুন। আপনি যদি অনিশ্চিত হন তবে আপনি "ls /var/lib/docker/containers/*/*-json.log" কী কাটা হচ্ছে তা দিয়ে পরীক্ষা করে দেখতে পারেন।
duketwo

1
error from daemon in stream: Error grabbing logs: invalid character '\x00' looking for beginning of value
লগফিলটি

42

উইন্ডোজ এবং ম্যাক এবং সম্ভবত অন্যদের জন্য ডকারে, লেজের বিকল্পটি ব্যবহার করা সম্ভব। উদাহরণ স্বরূপ:

docker logs -f --tail 100

এইভাবে, কেবলমাত্র সর্বশেষ 100 টি লাইন দেখানো হয়েছে এবং আপনার 1 এম লাইনগুলির মধ্যে প্রথম স্ক্রোল করতে হবে না ...

(এবং এইভাবে, লগটি মুছে ফেলা সম্ভবত অপ্রয়োজনীয়)


12
ধারণাটি হ'ল লগ ফাইলগুলি পরিষ্কার করা এবং লগ ফাইলগুলির শেষ এন লাইনগুলি প্রিন্ট না করা
ইউসুফ মাইগা

41
sudo sh -c "truncate -s 0 /var/lib/docker/containers/*/*-json.log"

4
লগগুলির আকার পেতে sudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log", কেবল লগের আকারের মোট পেতেsudo sh -c "du -ch /var/lib/docker/containers/*/*-json.log | grep total"
ড্যানিয়েল এফ

ঘূর্ণিত লগ ফাইলগুলি মুছে ফেলার জন্য ডকার্ড / এউফস অবহেলিত এবং অক্ষম হওয়ার কোনও সমস্যা আছে কি?
থারস্মমনার

এই কমান্ডটি আমার পক্ষে কাজ করেছে যেখানে এই এসও-র অন্যান্য কমান্ড নেই। যদি এটি গুরুত্বপূর্ণ হয় তবে আমি CentOS 7
টোক্রা ফিজ

27

আপনি পর্যায়ক্রমে লগগুলি সাফ করতে লোগ্রোটেট সেট আপ করতে পারেন।

/Etc/logrotate.d/docker-logs এ ফাইলের উদাহরণ

/var/lib/docker/containers/*/*.log {
 rotate 7
 daily
 compress
 size=50M
 missingok
 delaycompress
 copytruncate
}

এবং আমি এটি কীভাবে ব্যবহার করব? এটি ডিফল্ট হিসাবে ব্যবহার করা হয় docker run? ফাইল /etc/logrotate.d/docker-logsবিদ্যমান নেই, আমি এটি তৈরি করতে হবে?
কার্লোস.ভি

আপনাকে লোগ্রোটেট ইউটিলিটি (লোগ্রোটেট <config-file>) কল করতে হবে এবং এটি আপনার কনফিগারেশনটি পড়বে এবং ক্লিনআপটি চালাবে। উদাহরণস্বরূপ আপনি এটি ক্রোন জব হিসাবে সেট করতে পারেন।
অ্যালেক্সপ্যান্ট

এইটির সাথে সমস্যাটি হ'ল ডকার যা করছে তার সাথে এটি সঠিকভাবে সিঙ্ক্রোনাইজ করা যায় না। ডকার সুবিধামত ব্যবহার সম্ভবত বুদ্ধিমান। ( "log-opts"যেমনটি বিএমইচ দেখিয়েছে)
অ্যালেক্সিস উইলক

12

ডকার 4 ম্যাক, একটি 2018 সমাধান:

LOGPATH=$(docker inspect --format='{{.LogPath}}' <container_name_or_id>)
docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- truncate -s0 $LOGPATH

প্রথম লাইনটি গৃহীত উত্তরের মতো লগ ফাইলের পাথ পায়।

দ্বিতীয় লাইনটি আপনাকে ব্যবহার করে nsenterযা আপনাকে xhyveভিএম-তে কমান্ড চালানোর অনুমতি দেয় যা ডকার 4 ম্যাকের অধীনে সমস্ত ডকার পাত্রে হোস্ট হিসাবে সার্ভার করে। আমরা যে কমান্ডটি চালাচ্ছি তা হ'ল truncate -s0 $LOGPATHনন-ম্যাক উত্তরগুলি থেকে পরিচিত ।

আপনি যদি ব্যবহার করেন docker-composeতবে প্রথম লাইনটি হয়ে যায়:

local LOGPATH=$(docker inspect --format='{{.LogPath}}' $(docker-compose ps -q <service>))

এবং <service>আপনার docker-compose.ymlফাইল থেকে পরিষেবা নাম ।

কৌতুকের জন্য https://github.com/justincormack/nsenter1 ধন্যবাদ nsenter


4
এবং সমস্ত পাত্রে লগগুলি docker run -it --rm --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i -- sh -c 'truncate -s0 /var/lib/docker/containers/*/*-json.log'
ছাঁটাই

10

আপনি সরাসরি ডকার কমান্ডের মাধ্যমে এটি করতে পারবেন না।

আপনি হয় লগের আকার সীমাবদ্ধ করতে পারেন, বা কোনও ধারক সম্পর্কিত লগগুলি মুছতে স্ক্রিপ্ট ব্যবহার করতে পারেন। আপনি এখানে স্ক্রিপ্ট উদাহরণ খুঁজে পেতে পারেন (নীচে থেকে পড়ুন): বৈশিষ্ট্য: লগের ইতিহাস সাফ করার ক্ষমতা # 1083

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


7

মূল ব্যবহারকারী হিসাবে নিম্নলিখিতগুলি চালনার চেষ্টা করুন:

>  /var/lib/docker/containers/*/*-json.log

অথবা

cat /dev/null > /var/lib/docker/containers/*/*-json.log

অথবা

echo "" > /var/lib/docker/containers/*/*-json.log

6

আমার উবুন্টু সার্ভারগুলিতে এমনকি সুডো হিসাবেও আমি পেতাম Cannot open ‘/var/lib/docker/containers/*/*-json.log’ for writing: No such file or directory

তবে ডকারকে পরিদর্শন করা এবং ছেঁটে দেওয়া উত্তরগুলি কাজ করা:

sudo truncate -s 0 `docker inspect --format='{{.LogPath}}' <container>`

2

আমি এটিকে পছন্দ করি (উপরের সমাধানগুলি থেকে):

truncate -s 0 /var/lib/docker/containers/*/*-json.log

তবে আমি বেশ কয়েকটি সিস্টেম চালাচ্ছি (উদাহরণস্বরূপ উবুন্টু 18.x বায়োনিক), যেখানে এই পথটি প্রত্যাশার মতো কাজ করে না। ডকার স্ন্যাপের মাধ্যমে ইনস্টল করা হয়েছে, সুতরাং ধারকগুলির পথটি আরও ভালো:

truncate -s 0 /var/snap/docker/common/var-lib-docker/containers/*/*-json.log

1

আপনি docker runকমান্ড লাইনে লগ-অপ্টস প্যারামিটারগুলি সরবরাহ করতে পারেন :

docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest

বা এই মত একটি ডকার-রচনা। জিম

my-app:
image: my-app:latest
logging:
    driver: "json-file"
    options:
        max-file: "5"
        max-size: 10m

ক্রেডিট: https://medium.com/@Quigley_Ja/rotating-docker-logs-keeping-your-overlay-folder-small-40cfa2155412 (জেমস Quigley)


পরামিতির মান উদ্ধৃত করা উচিত (অর্থাত "5"এবং "10m"যথাক্রমে), হিসাবে দেখানো এখানে বিশ্বব্যাপী daemon.json ফাইলের জন্য, কিন্তু এটা একটা Docker-compose.yml জন্য একই। উভয় ক্ষেত্রেই এটি কেবল নতুন তৈরি পাত্রে প্রভাব ফেলবে।
অ্যাড্রিয়ান ডাব্লু

@ অ্যাড্রিয়ানডাব্লু: ডকার-কমপোজ.আইএমএল এর উদ্ধৃতিগুলির প্রয়োজন নেই। এগুলি সম্পূর্ণ আলাদা ফাইল ফর্ম্যাট। এবং হ্যাঁ, আপনি ঠিক বলেছেন: "ডকার রান" কমান্ড এবং ডকার-রচনা পরামিতিগুলি কেবলমাত্র নতুন তৈরি পাত্রে প্রভাব ফেলবে - সর্বাধিক ভোটের সাথে উত্তরটির বিপরীতে যা কেবল পুনরায় চালু হওয়া ডকার্ড ডেমনগুলিকে প্রভাবিত করে এবং এটি কেবল রুট অ্যাক্সেসের মাধ্যমে উপলব্ধ। আমার উত্তরটি পুরো ডকার্ড প্রক্রিয়া পুনরায় আরম্ভ করার চেয়ে সম্পাদনার চেয়ে অনেক সহজ এবং হালকা পথ দেখানোর কথা।
ড্যাগ বার্ডসন

উদ্ধৃতি ব্যতীত, আমি পেয়েছি: ERROR: অ্যাপ্লিকেশনটির জন্য পরিষেবা অ্যাপের জন্য ধারক তৈরি করতে পারে না: জেএসন: গো স্ট্রাক্ট ফিল্ডে লম্বকানফিগ নম্বরটি আনমাশাল করতে পারবেন না type টাইপ স্ট্রিংয়ের কনফিগ যদি আমি এই জাতীয় উদ্ধৃতি দেয়: "5"এটি কাজ করে। 10mপ্রকৃতপক্ষে উদ্ধৃত ছাড়া হবে।
অ্যাড্রিয়ান ডব্লিউ

দেখে মনে হচ্ছে উইন্ডোজের জন্য ডকার এবং লিনাক্সের জন্য ডকারের মধ্যে পার্থক্য রয়েছে। পরে, আমাকে উদ্ধৃতিতে মানগুলি বদ্ধ করতে হবে। প্রাক্তনের উপর নয় উভয় ফিট করার জন্য বিবরণটি আপডেট করুন। ধন্যবাদ, @ অ্যাড্রিয়ানডাব্লু
ডাগ

0

ম্যাক ব্যবহারকারীদের জন্য ডকার, সমাধান এখানে:

    1. এর মাধ্যমে লগ ফাইলের সন্ধান করুন:

      $ docker inspect | grep log

    1. ডকার মেশিনে এসএসএইচ (ধরুন নামটি defaultযদি না হয় তবে তা docker-machine lsখুঁজে বের করার জন্য দৌড় দিন ):

      $ docker-machine ssh default

    1. রুট ব্যবহারকারী ( রেফারেন্স ) এ পরিবর্তন করুন :

      $ sudo -i

    1. লগ ফাইলের সামগ্রী মুছুন:

      $ echo "" > log_file_path_from_step1


2
ডকার-মেশিন ম্যাকের জন্য ডকারের সাথে কাজ করে না। পরিবর্তে আপনি চালাতে পারেন "Docker রান -ti -v / var / lib / Docker / পাত্রে: প্রথমেই / var / শুরু CentOS ব্যাশ" তারপরে "আরোপ করা --size 0 /var/inception/08d29a7d469232cfef4456dc6eebcbf313bf01ba73e479520a036150c5ab84de/08d29a7d469232cfef4456dc6eebcbf313bf01ba73e479520a036150c5ab84de-json.log"
jamshid

আপনি docker exec -it default shকোনও পাত্রে একটি শেল শেল প্রবেশ করতে ব্যবহার করতে পারেন । তবে অনেকগুলি ধারক স্পষ্টভাবে sudoকমান্ডটি উপলব্ধ করে না।
ডাগ বার্ডসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.