Docker به طور خودکار خروجی استاندارد کانتینر و خطاها (stdout/stderr) را در فایل‌های گزارش جمع‌آوری می‌کند. این فایل‌ها توسط Daemon Docker نگهداری می‌شوند و شما به راحتی می‌توانید آن‌ها را مشاهده نمایید تا بفهمید در containerهای شما چه می‌گذرد.

 

log‌ها، حاوی خروجی‌هایی هستند که شما در ترمینال خود هنگام اتصال به یک container در حالت تعاملی (it-) مشاهده می‌کنید. گزارش‌ها تنها در صورتی در دسترس خواهند بود که فرآیند پیش‌زمینه در container شما واقعاً یک مقدار خروجی منتشر نماید. شما باید مطمئن شوید که کانتینرهایتان، خطاها را در stderr جمع آوری می‌کنند تا دستورات Docker بتوانند آن‌ها را آشکار نمایند.

شما می‌توانید گزارش‌های مربوط به کانتینر را در هر زمانی در طول چرخه عمر آن مشاهده کنید. هنگامی‌که یک container در حال اجرا است، می‌توانید گزارش‌ها را بصورت real time (لحظه‌ای) مشاهده نمایید. برای کانتینرهای متوقف شده، تمام گزارش‌های ثبت شده قبل از متوقف شدن آن‌ها قابل دسترسی است.

 

این مطلب نیز ممکن است برای شما مفید باشد: خالی کردن فایل گزارش در لینوکس

 

مشاهده گزارش‌های container

به منظور مشاهده logهای کانتینر، از دستور docker logs استفاده کنید:

docker logs my-container

نام یا شناسه کانتینر مورد نظر را جایگزین my-container نمایید. شما می‌توانید از docker ps -a برای دریافت شناسه‌ها و نام‌های کانتینرهای خود استفاده کنید.

 

دستور logs کل خروجی log کانتینر را در ترمینال شما چاپ می‌کند. این خروجی پیوسته نخواهد بود. اگر می‌خواهید به صورت پیوسته آن را مشاده نمایید، پرچم follow-- را به دستور اضافه کنید. این، معادل استفاده از tail -f با فایل‌های گزارش معمولی در دستگاه شما است.

 

سفارشی سازی خروجی

دستور docker logs از گزینه‌های زیادی پشتیبانی می‌کند که به شما امکان می‌دهند، خروجی دستور را تنظیم نمایید. برخی از این گزینه‌ها به شرح زیر است:

timestamps- : نمایش timestampهای کامل در ابتدای هر خط log.

until- و since-- : این پرچم‌ها به شما امکان می‌دهند، تنها خطوط ثبت‌شده در یک دوره زمانی خاص را مشاهده کنید. بدین منظور باید یا از یک timestamp کامل (2021-04-30T20:00:00Z) یا یک زمان نسبی (مثلاً 1h به معنی یک ساعت قبل) استفاده نمایید.

tail- : تعداد معینی از خطوط لاگ را در خروجی نمایش می‌دهد. به عنوان مثال tail 10--، ده خط آخر ثبت شده توسط container را نمایش می‌دهد.

details- : این یک پرچم ویژه است که اطلاعات اضافی را بر اساس گزینه‌های ارسال شده به درایور ثبت گزارش به خروجی اضافه می‌کند. در بخش بعدی به درایورهای ثبت گزارش سیستم نگاهی خواهیم کرد. مقادیر معمولی که با details-- نمایش داده می‌شوند، شامل برچسب‌های container و متغیرهای محیطی هستند.

شما می‌توانید، این پرچم‌ها را ترکیب کنید تا گزارش‌ها را در قالب مورد نیاز خود دریافت نمایید. اگر از follow برای نمایش مداوم داده‌های گزارش استفاده می‌کنید، پرچم‌های until ،since و tail اثر نمی‌کند.

 

این مطلب نیز ممکن است برای شما مفید باشد: گزارش اطلاعات فرایندها با دستور ps

 

درایورهای گزارش نویسی Docker

Docker، لاگ‌های کانتینر را با استفاده از یکی از چندین درایور گزارش جمع آوری و ذخیره می‌کند. شما می‌توانید درایور گزارش نویسی فعال را بر اساس هر کانتینر تنظیم نمایید. اگر هیچ درایور گزارش نویسی مشخص نشده باشد، داکر از درایور json-file استفاده می‌کند.

این درایور، گزارش‌های کانتینر را در یک فایل JSON ذخیره می‌کند. قالب JSON تقریباً برای انسان قابل خواندن است و می‌تواند به راحتی توسط ابزارهای شخص ثالث استفاده شود. اگر نمی‌خواهید مستقیماً به فایل‌های log دسترسی پیدا کنید، تغییر به درایور local باعث کاهش مصرف فضای ذخیره سازی شما می‌شود؛ چراکه از یک قالب ذخیره سازی سفارشی استفاده می‌کند.

سایر درایورهای گزارش نویسی داخلی عبارتند از: syslog (برروی daemon syslog در حال اجرا بر روی دستگاه شما می‌نویسد)، journald  (از یک نمونه journald در حال اجرا استفاده می‌کند) و fluentd (از یک daemon fluentd استفاده می‌کند). درایورها برای Amazon CloudWatch ،Google Cloud Platform ،Event Tracing در ویندوز در دسترس هستند.

Docker از درایورهای گزارش نویسی شخص ثالث از طریق افزونه‌ها پشتیبانی می‌کند. شما می‌توانید درایورها را در Docker Hub پیدا کنید. به منظور نصب یک درایور افزونه، docker plugin install plugin-name را اجرا نمایید. سپس شما می‌توانید آن را به‌عنوان یک درایور گزارش نویسی به صورت plugin-name ارجاع دهید.

 

تعیین درایور گزارش نویسی

شما می‌توانید با ارسال پرچم log-driver-- به دستور docker run، درایور گزارش نویسی را برای یک کانتینر مشخص کنید:

docker run --log-driver systemd my-image:latest

با به‌روزرسانی پیکربندی Daemon Docker، درایور پیش‌فرض گزارش نویسی سراسری را می‌توان تغییر داد. بدین منظور /etc/docker/daemon.json را ویرایش (یا ایجاد)  کنید. کلید log-driver را برروی نام یک درایور گزارش نویسی تنظیم نمایید. Docker از این درایور برای همه کانتینرهای ایجاد شده بدون یک پرچم log-driver-- استفاده خواهد کرد.

{
    "log-driver": "systemd"
}

بسیاری از درایورهای گزارش نویسی با گزینه‌های پیکربندی خاص خود ارائه می‌شوند. این‌ها با استفاده از پرچم log-opts container-- یا log-opts در daemon.json تنظیم می‌شوند. در زیر، یک مثال مربوط به درایور پیش فرض json-file است. این دستور، به Docker می‌گوید زمانی که فایل بزرگ‌تر از 8 مگابایت شد، یک فایل جدید ایجاد نماید. دقت کنید که حداکثر پنج فایل در هر زمان نگهداری خواهند شد.

docker run

docker run --log-driver json-file --log-opts max-size=8M --log-opts max-file=5

/etc/docker/daemon.json

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "8M",
        "max-file": 5
    }
}

 

حالت‌های تحویل درایور

گزارش‌ها را می‌توان در یکی از حالت‌های مسدود یا غیر مسدود تحویل داد. به صورت پیش‌فرض Docker تحویل مسدود را انجام می‌دهد. گزارش‌های مربوط به کانتینر بلافاصله برای درایور ارسال می‌شود. این، تحویل گزارش را تضمین می‌کند؛ اما ممکن است بر عملکرد نیز تأثیر بگذارد؛ چراکه برنامه منتظر می‌ماند تا نوشتن گزارش کامل شود. اگر درایور گزارش نویسی مشغول باشد، می‌تواند منجر به تأخیر محسوس شود.

در حالت غیر مسدود، داکر گزارش‌ها را در یک بافر درون حافظه می‌نویسد. بنابراین کانتینر، نیازی ندارد که منتظر تکمیل گزارش درایور بماند. این می‌تواند به طور قابل توجهی عملکرد را در ماشین‌های فعال با ذخیره سازی پایین بهبود بخشد.

با توجه به شرح بالا، در حالت غیر مسدود کننده ممکن است گزارش‌های مربوطه از دست برود. این ممکن است زمانی اتفاق بیفتد که گزارش‌ها تند‌تر از سرعت درایور منتشر می‌شوند. در چنین صورتی بافر درون حافظه سرریز شده و باعث حذف لاگ‌های ذخیره شده قبل از تحویل به درایور می‌گردد.

شما می‌توانید با تنظیم گزینه mode، و با ارائه گزینه log-opts-- یا daemon.json، تحویل غیر مسدود را فعال کنید. همچنین می‌توانید اندازه بافر log در حافظه را با گزینه max-buffer-size تنظیم نمایید. تنظیم آن برروی یک مقدار زیاد، خطر از دست رفتن گزارش‌ها را کاهش می‌دهد، به شرطی که RAM کافی در دسترس داشته باشید.

docker run --log-opt mode=non-blocking --log-opt max-buffer-size=8M my-image:latest

 

این مطلب نیز ممکن است برای شما مفید باشد: پیکربندی گزارش های دسترسی و خطای Nginx

 

ثبت گزارش با بهترین شیوه‌ها

کانتینرهای شما باید تا حد امکان با سیستم گزارش دهی Docker کار کنند. انتشار گزارش‌ها به stdout و stderr، به Docker و سایر ابزارها اجازه می‌دهد تا آن‌ها را به روشی استاندارد جمع‌آوری کنند.

خروجی گزارش نیازی به درج timestamp ندارد. چراکه درایورهای گزارش نویسی Docker به طور خودکار زمان وقوع یک رویداد را ثبت می‌نمایند.

گاهی اوقات ممکن است، نیازهای گزارش نویسی پیچیده‌ای داشته باشید که لاگ‌های docker به تنهایی نمی‌توانند آن‌ها را برآورده کنند. در چنین صورتی ممکن است لازم باشد روش گزارش نویسی خود را در container خود پیاده سازی نمایید. شما می‌توانید logها را (با استفاده از یک Docker volume) مستقیماً روی سیستم فایل ذخیره کنید، یا با یک سرویس API خارجی تماس بگیرید.

برخی از پشته‌ها به یک container گزارش نویسی اختصاصی نیاز دارند که در کنار کانتینرهای برنامه شما قرار می‌گیرد. کانتینر گزارش نویسی (اغلب به آن "sidecar" گفته می‌شود)، فایل‌های گزارش موقتی‌ای را می‌خواند که کانتینرهای برنامه شما در یک Docker volume مشترک ایجاد می‌کنند. Sidecar، جمع‌آوری این گزارش‌ها را در قالبی مدیریت می‌کند که می‌تواند در یک سرویس نظارت بر گزارش آپلود شود.

این رویکرد می‌تواند برای استقرارهای پیچیده‌تر مفید باشد؛ اگرچه تنظیم و مقیاس آن دشوارتر است.

 

 

 

منبع:

cloudsavvyit