جعل تطبيق عامل الميناء الكتابة إلى ستدوت

أنا نشر تطبيق 3 طرف في الامتثال ل 12 عامل استشاري، واحدة من النقاط تقول أن سجلات التطبيق يجب أن تطبع إلى ستدوت/ستدير: ثم تجميع البرمجيات يمكن جمعها.

ومع ذلك ، يمكن للتطبيق الكتابة فقط إلى الملفات أو سجل النظام. كيف يمكنني طباعة هذه السجلات بدلا من ذلك?

يتم إعطاء وصفة مذهلة في نجينكس دوكيرفيل:

# forward request and error logs to docker log collectorRUN ln -sf /dev/stdout /var/log/nginx/access.log \    && ln -sf /dev/stderr /var/log/nginx/error.log

ببساطة ، يمكن للتطبيق الاستمرار في الكتابة إليه كملف، ولكن نتيجة لذلك ستذهب الأسطر إلى stdout &أمبير; stderr!

لعملية الخلفية في حاوية عامل الميناء ، على سبيل المثال الاتصال مع إكسيك ل /بن/باش كنت قادرا على استخدام.

echo "test log1" >> /proc/1/fd/1

هذا يرسل الإخراج إلى ستدوت من بيد 1 ، وهو واحد بيك آب عامل الميناء حتى.

في سؤال آخر, قتل عملية الطفل عندما يخرج الوالد، حصلت على الرد الذي ساعد على حل هذا.

بهذه الطريقة ، نقوم بتكوين التطبيق بحيث يسجل إلى ملف ، وبشكل مستمر tail -f ذلك. لحسن الحظ, tail يمكن قبول --pid PID: سيخرج عند خروج العملية المحددة. وضعنا $$ هناك: بيد من قذيفة الحالية.

كخطوة أخيرة ، فإن التطبيق الذي تم إطلاقه هو exec'إد ، وهو ما يعني أن قذيفة الحالية يتم استبدال تماما مع هذا التطبيق.

سيناريو عداء, run.sh، سيبدو مثل هذا:

#! /usr/bin/env bashset -eurm -rf /var/log/my-application.logtail --pid $$ -F /var/log/my-application.log &exec /path/to/my-application --logfile /var/log/my-application.log

ملاحظة: باستخدام tail -F نحن قائمة أسماء الملفات ، وسوف قراءتها حتى لو كانت تظهر في وقت لاحق!

وأخيرا ، فإن دوكيرفيل أضيق الحدود:

FROM ubuntuADD run.sh /root/run.shCMD ['/root/run.sh']

ملاحظة: للعمل على بعض الغريب للغاية tail -f السلوك (الذي يقول " تم استبداله بملف بعيد. التخلي عن هذا الاسم") حاولت نهج آخر: يتم إنشاء جميع ملفات السجل المعروفة & أمبير; اقتطاع على بدء: بهذه الطريقة أنا ضمان وجودها, وبعد ذلك فقط tail ذيل لهم:

#! /usr/bin/env bashset -euLOGS=/var/log/myapp/( umask 0 && truncate -s0 $LOGS/http.{access,error}.log )tail --pid $$ -n0 -F $LOGS/* &exec /usr/sbin/apache2 -DFOREGROUND

ل إنجن إكس يمكن أن يكون لديك nginx.conf مشيرا إلى /dev/stderr و /dev/stdout مثل هذا

user  nginx;worker_processes  4;error_log  /dev/stderr;http {    access_log  /dev/stdout  main;...

و الخاص بك Dockerfile يجب أن يكون الدخول

/usr/sbin/nginx -g 'daemon off;'

في حالتي جعل ارتباط رمزي إلى ستدوت لم تنجح بدلا من ذلك تشغيل الأمر التالي

ln -sf /proc/self/fd/1 /var/log/main.log 

لقد كان فقط لحل هذه المشكلة مع أباتشي 2 ، وتصارع مع استخدام كوستوملوغ لمحاولة إعادة توجيه إلى /proc/1/fd/1 ولكن لا يمكن الحصول على هذا العمل. في تنفيذ بلدي ، أباتشي لم يكن يعمل كما pid 1، إذن إجابة كوليبتو لم يعمل كما هو. نهج بيتر بدا مقنعا ، لذلك أنا دمج اثنين والنتيجة تعمل بشكل رائع:

# Redirect apache log output to docker log collectorRUN ln -sf /proc/1/fd/1 /var/log/apache2/access.log \    && ln -sf /proc/1/fd/2 /var/log/apache2/error.log

من الناحية الفنية هذا يحافظ على أباتشي access.log و error.log الذهاب الى stdout و stderr بقدر ما يتعلق الأمر جامع سجل عامل الميناء، ولكن سيكون من الرائع إذا كانت هناك طريقة لفصل الاثنين خارج الحاوية ، مثل التبديل ل docker logs من شأنه أن يظهر واحد فقط أو آخر...

هل يمكن أن يكون عملية الخفي استخدام سيسلوغ ولها عملية الأمامية التي تطبع?

انهم ذاهبون بالفعل إلى سيسلوغ. يمكنك فقط التقاطها من هناك!

@مايكلهامبتون, يبدو على ما يرام, ولكن عامل الميناء يدير عملية واحدة يمكن أن يكتب إلى ستدوت, وهذا يبدو وكأنه الجمع بين اثنين منهم?

@قريجر ، نقطة جيدة! الآن ، إذا كان أي شخص لديه خبرة معها … ?