কীভাবে একটি একক ফাইলে ডকার কনটেইনার লগগুলি পুনর্নির্দেশ করবেন?


110

আমি আমার ডকার ধারকের সমস্ত লগগুলি বিশ্লেষণের জন্য একক লগ ফাইলে পুনর্নির্দেশ করতে চাই। আমি চেষ্টা করেছিলাম

docker logs container > /tmp/stdout.log 2>/tmp/stderr.log

কিন্তু এটি দুটি পৃথক ফাইল লগ ইন দেয়। আমি ইতিমধ্যে চেষ্টা করেছি

docker logs container > /tmp/stdout.log

তবে এটি কার্যকর হয়নি।

উত্তর:


137

লগগুলি পুনঃনির্দেশ করার দরকার নেই।

ডিফল্টরূপে ডকার একটি লগ ফাইলে লগ করে। লগ ফাইল পাথ রান কমান্ড পরীক্ষা করতে:

docker inspect --format='{{.LogPath}}' containername

/var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.log

সেই লগ ফাইলটি খুলুন এবং বিশ্লেষণ করুন।

আপনি যদি লগগুলি পুনর্নির্দেশ করেন তবে আপনি পুনঃনির্দেশের আগে কেবল লগগুলি পাবেন। আপনি লাইভ লগ দেখতে সক্ষম হবেন না।

সম্পাদনা করুন:

লাইভ লগগুলি দেখতে আপনি কমান্ডের নীচে চালাতে পারেন

tail -f `docker inspect --format='{{.LogPath}}' containername`

বিঃদ্রঃ:

এই লগ ফাইলটি /var/lib/docker/containers/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334/f844a7b45ca5a9589ffaa1a5bd8dea0f4e79f0e2ff639c1d010d96afb4b53334-json.logকেবল তখনই তৈরি করা হবে যদি কোনও লগ নেই যদি ডকার জেনারেট করে লগ থাকে তবে এই ফাইলটি সেখানে থাকবে না। এটি যদি আমরা কমান্ডটি চালিত করি docker logs containernameএবং এটি কিছুই না ফেরায় তবে একই রকম । সেই দৃশ্যে এই ফাইলটি উপলব্ধ হবে না।


tail -f `docker inspect --format='{{.LogPath}}' myapp`- এটি সত্যিই JSON
এডম

ফাইলটি না থাকলে এটি ব্যর্থ হবে। মানে যদি ডকার কোনও লগ তৈরি না করে তবে এই ফাইলটি তৈরি করা হবে না। তবে ডকার যদি লগ উত্পন্ন করে তবে এই আদেশটি লাইভ লগগুলি দেখতে ভাল। ধন্যবাদ আদম। অন্যদের সহায়তা করার জন্য এটি আমার উত্তরে যুক্ত করা।
pl_rock

"ডিফল্টরূপে ডকার একটি লগ ফাইলে লগ করে।" - কোন প্রসঙ্গে? ডকার হোস্টে চলমান সমস্ত পাত্রে কোনও একক ফাইলে আউটপুট পাওয়া যায়? একক পাত্রে?
ক্রিস স্ট্রাইজিনস্কি

@ ক্রিসট্রিস্টিজাইস্কি ডকার কনটেইনার অনুযায়ী একটি লগ ফাইল তৈরি করেছেন
এডি হার্নান্দেজ

126

এই বিকল্পটি সম্পর্কে কীভাবে:

docker logs containername >& logs/myFile.log

এটি এমন লগগুলিকে পুনর্নির্দেশ করবে না যা প্রশ্নে জিজ্ঞাসা করা হয়েছিল, তবে সেগুলি একবার নির্দিষ্ট ফাইলে অনুলিপি করবে।


যদি আমি ভুল না হই তবে এই কমান্ডটি মূলত সমস্ত লগগুলি অনুলিপি করবে যখন থেকে ধারকটি আমার ফাইল.লগগুলিতে উপস্থাপন করা শুরু হয়েছিল। ঠিক আছে।?
এস অ্যান্ড্রু

@ এন্ড্রু মূলত হ্যাঁ! তবে ডকারের নতুন সংস্করণগুলি পরিবর্তিত হতে পারে। docker logs --helpনিশ্চিত হতে আরও ভাল
এডি হার্নান্দেজ

38

docker logs -f <yourContainer> &> your.log &

ব্যাখ্যা:

  • -f(অর্থাত্ --follow): সমস্ত বিদ্যমান লগগুলি লিখে এবং এরপরে যা কিছু ঘটে তা লগইন করে ( অনুসরণ করে )।
  • &> স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি উভয়ই পুনর্নির্দেশ করে।
  • সম্ভবত আপনি সেই পদ্ধতিটি পটভূমিতে চালাতে চান, এভাবে &
  • আপনি এর দ্বারা আউটপুট এবং স্টডার আলাদা করতে পারেন: > output.log 2> error.log(ব্যবহারের পরিবর্তে &>)।

9

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

docker logs container > container.log 2>&1

8

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

সুতরাং ডকার-রচনাতে, আপনাকে লগিং ড্রাইভারটি নির্ধারণ করতে হবে

  service1:
    image: webapp:0.0.1
    logging:
      driver: "fluentd"
      options:
        tag: service1 

  service2:
        image: myapp:0.0.1
        logging:
          driver: "fluentd"
          options:
            tag: service2

দ্বিতীয় পদক্ষেপটি হ'ল পরিষেবা 1 এবং পরিষেবা 2 উভয়ের জন্য লগগুলি সরবরাহ করতে ফ্লুয়েন্ট কনডকে আপডেট করা হবে

 <match service1>
   @type copy
   <store>
    @type file
    path /fluentd/log/service/service.*.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%z
  </store>
 </match> 
 <match service2>
    @type copy
   <store>
    @type file
    path /fluentd/log/service/service.*.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%
  </store>
 </match> 

এই কনফিগারেশনে, আমরা লগগুলিকে এই পথে কোনও একক ফাইলে লিখতে বলছি
/fluentd/log/service/service.*.log

এবং তৃতীয় পদক্ষেপটি স্বনির্ধারিত ফ্লুয়েন্টড চালানো হবে যা লগগুলিতে ফাইল লিখতে শুরু করবে।

ধাপে ধাপে নির্দেশের লিঙ্কটি এখানে

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


1

যেহেতু ডকার আমাদের জন্য স্টডআউট এবং স্ট্ডার একীভূত করে, আমরা অন্য শেল স্ট্রিমের মতো লগ আউটপুটকে চিকিত্সা করতে পারি। বর্তমান লগগুলিকে কোনও ফাইলে পুনর্নির্দেশ করতে, পুনর্নির্দেশ অপারেটরটি ব্যবহার করুন

$ docker logs test_container > output.log
docker logs -f test_container > output.log

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

$ docker logs test_container> /tmp/output.log

ডকার কমান্ড লাইনে আপেক্ষিক পাথগুলি গ্রহণ করবে না, সুতরাং আপনি যদি অন্য কোনও ডিরেক্টরি ব্যবহার করতে চান তবে আপনাকে সম্পূর্ণ পথটি ব্যবহার করতে হবে।


1

আপনি যদি উইন্ডোজে কাজ করেন এবং পাওয়ারশেল (আমার মতো) ব্যবহার করেন তবে আপনি stdoutএবং ক্যাপচারের জন্য নিম্নলিখিত লাইনটি ব্যবহার করতে পারেন stderr:

 docker logs <containerId> | Out-File 'C:/dev/mylog.txt'

আমি আশা করি এটি কাউকে সাহায্য করবে!


1
ধারকের নামের উপর ভিত্তি করে সমস্ত ধারক লগ ফাইলগুলিতে সংরক্ষণ করতে ...foreach ($element in $(docker ps -a --format "{{.Names}}")) {docker logs $element | Out-File "C:/dockerlogs/$element.log"}
xisket

1

টার্মিনালের কমান্ডটি হ'ল সবচেয়ে সহজ উপায় use

docker logs elk > /home/Desktop/output.log

কাঠামোটি হ'ল:

docker logs <Container Name> > path/filename.log

1

প্রথমে আপনার ধারক আইডিটি পরীক্ষা করুন

docker ps -a

আপনি কন্টেইনার আইডি কলামগুলিতে প্রথম সারিটি দেখতে পাচ্ছেন। সম্ভবত এটি "3fd0bfce2806" এর মতো দেখে মনে হচ্ছে শেলটি টাইপ করুন

docker inspect --format='{{.LogPath}}' 3fd0bfce2806

আপনি এরকম কিছু দেখতে পাবেন

/var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

তাহলে আপনি এটি হিসাবে দেখতে পারেন

cat /var/lib/docker/containers/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1/3fd0bfce2806b3f20c2f5aeea2b70e8a7cff791a9be80f43cdf045c83373b1f1-json.log

এটি JSON ফর্ম্যাটে হবে, আপনি ত্রুটিগুলি সনাক্ত করতে টাইমস্ট্যাম্প ব্যবহার করতে পারেন


0

একটি নির্দিষ্ট ডিরেক্টরিতে সমস্ত ধারক লগ অনুলিপি করতে স্ক্রিপ্টটি বাশ করুন:

#!/usr/bin/env bash

TARGET_DIR=~/logs/docker_logs
mkdir -p "$TARGET_DIR"
for name in `sudo docker ps --format '{{.Names}}'`;
do
    path=$(sudo docker inspect --format='{{.LogPath}}' $name)
    sudo cp -rf "$path" "$TARGET_DIR"/$name.log
done
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.