लॉगरोट अब गैर-रूट स्वामित्व के कारण सिम्लिंकड कॉन्फ़िगरेशन फ़ाइल नहीं पढ़ता है


15

हम वर्तमान में Ubuntu 12.04 LTS से 14.04 LTS तक रेल एप्लिकेशन सर्वर पर अपने माणिक पर अपग्रेड कर रहे हैं, और ध्यान दिया है कि लॉग फाइलें अब घूमती नहीं हैं।

दोनों मशीनों पर हमारे पास /var/app-name/config/logrotateहमारे यूनिक्स उपयोगकर्ता के पास एक फाइल है deployer, जिसमें एक मान्य लॉगोटेट फाइल इस प्रकार है:

/var/app-name/log/*.log {
  daily
  rotate 365
  delaycompress
  compress
  dateext
  dateformat -%Y%m%d
  missingok
  copytruncate
}

यह तो /etc/logrotate.d/निर्देशिका में समरूप हैapp-name

हमारे उबुन्टु 12.04 सर्वर पर हमारे पास 3.7.8 लॉगोट्रेट है जो ठीक चलता है। यह var/app-name/log/निर्देशिका में चला जाता है और लॉग आउट फ़ाइलों को घुमाता है

लेकिन उबंटू 14.04 सर्वर पर हमारे पास 3.8.7 लोगरोट है, जो हमारे आवेदन के लिए लॉगफाइल्स को घुमाता नहीं है।

जब मैं इसे डीबग करता हूं तो मुझे sudo logrotate -d -f /etc/logrotate/.confनिम्न आउटपुट मिलते हैं:

Ignoring /etc/logrotate.d/app-name because the file owner is wrong (should be root).

इस कोड में नीचे दिए गए, ऐसा लगता है कि यह परिवर्तन 3.8.x रिलीज़ स्ट्रीम के लिए जोड़ा गया था: https://github.com/demands/logrotate/commit/b8ce386a969c60e5c8ee78023624a1ba0aab1526

अगर मैं बदल फ़ाइल का स्वामित्व सांकेतिक रूप से लिंक करने के लिए /var/app-name/config/logrotateकरने के लिए rootउसे फिर से काम करने के लिए शुरू होता है। लेकिन यह फ़ाइल मेरे आवेदन का हिस्सा है, और हम इस स्थिति में उपयोग करने वाले कैपिस्ट्रानो परिनियोजन फ्रेमवर्क द्वारा बनाए गए हैं, मुझे इसके स्वामित्व में परिवर्तन नहीं करना होगा, जब यह ठीक काम करता था।

तो लॉगरिडेट द्वारा अनुशंसित / समर्थित सिमिंकड कॉन्फिग फाइल हैं?

और यदि ऐसा है, तो क्या इसे मेरी फ़ाइल (स्वामित्व वाली deployer) का उपयोग करने से मना कर दिया जाना चाहिए, जिसे /etc/logrotate.dनिर्देशिका में सम्‍मिलित किया गया है , बग के रूप में देखा जाए?

या क्या आवेदन-विशिष्ट लॉग रोटेशन के लिए एक और अनुशंसित दृष्टिकोण है?

( यूनिक्स StackExchange पर भी पूछा गया )


अच्छा प्रश्न! मैं देखता हूं कि यूआईडी == 0 के बजाय उपयोगकर्ता नाम "रूट" के खिलाफ जांच के बारे में बाद में कुछ चर्चा हुई थी , लेकिन यह भी इस सवाल को ट्रिगर नहीं करता था कि रूट स्वामित्व की आवश्यकता क्यों है।
agtoever

जवाबों:


6

समस्या यह है कि एक लॉगरेट कॉन्फिग फ़ाइल किसी भी कमांड को रूट (प्रीरोटेट / पोस्ट्रोटेट स्टैंजस का उपयोग करके) चला सकती है। इसलिए, आप प्रभावी रूप से अपने deployerउपयोगकर्ता रूट विशेषाधिकारों को फाइल में एक्सेस लिखकर दे रहे होंगे /etc/logrotate.d/। तो नहीं, यह बग नहीं है।

यदि आप अपने तैनाती वाले उपयोगकर्ता पर भरोसा करते हैं, तो मुझे लगता है कि आप फ़ाइलों को कॉपी करने के लिए इसे sudo अधिकार देकर समस्या को हल कर सकते हैं /etc/logrotate.d/। यह मानते हुए कि, तैनाती करने वाला उपयोगकर्ता वही उपयोगकर्ता नहीं है जो वेब ऐप के रूप में चल रहा है।


हमारा दृष्टिकोण हमेशा से था कि डायरेक्टरी बाहरी से एप्लिकेशन फाइल में डायरेक्टरी से सिमलिंक करना पसंद करते थे, जैसे कि प्रत्येक तैनाती न केवल नए एप्लिकेशन को धकेलती है, बल्कि किसी भी कॉन्फ़िगरेशन फ़ाइल में परिवर्तन भी करती है। यहां तक ​​कि तैनाती के अधिकार को आवेदन निर्देशिका के बाहर कोड को तैनात करने का अधिकार देना इस दृष्टिकोण का उल्लंघन करता है - लेकिन समान रूप से एक आवेदन फ़ाइल को रूट करने के लिए स्वामित्व वाली पोस्ट-तैनाती एक बुरी चीज (टीएम) की तरह भी महसूस होती है। शायद मूल दृष्टिकोण इसलिए कर सकते हैं logrotate साथ 3.8.0+ अच्छी तरह से अब काम नहीं करेंगे
phantomwhale

2
@phantomwhale आपके मूल दृष्टिकोण ने स्पष्ट रूप से आपके तैनाती उपयोगकर्ता को पूर्ण मूल विशेषाधिकार दिए हैं। यह लॉगोटेट 3.8 में नया नहीं है। यदि आप अभी भी कॉन्फ़िगरेशन को अपडेट करने की अनुमति देते हुए तैनातीकर्ता के अधिकारों को प्रतिबंधित करना चाहते हैं, तो मुझे लगता है कि आपको लॉगोटेट के अलावा कुछ और उपयोग करने की आवश्यकता है।
पेले

2

मुझे एहसास है कि मैं पार्टी के लिए देर से आता हूं, लेकिन मुझे एक समान मुद्दा था और मुझे लगा कि मैं अपना समाधान साझा करूंगा।

मेरी समस्याएं तब शुरू हुईं, जब logrotateमैंने जो कॉन्फ़िगरेशन लिखा था, उसे नहीं पढ़ा। मैं रूट के स्वामित्व वाले फ़ोल्डर में नए कॉन्फ़िगरेशन को तैनात नहीं करना चाहता था क्योंकि मैं नहीं चाहता था कि उपयोगकर्ता को कुछ भी रूट एक्सेस मिले ।

सबसे पहले मैंने logrotateतैनात उपयोगकर्ता के रूप में चलने की कोशिश की , लेकिन इसने राज्य फ़ाइल तक पहुँच के बारे में शिकायत की /var/lib/logrotate/state। फिर मैंने मैन पेज पढ़ा। आप उपयोग करने वाले राज्य फ़ाइल को निर्दिष्ट कर सकते हैं logrotate! इसलिए, logrotateकस्टम राज्य फ़ाइल के साथ परिनियोजित उपयोगकर्ता के रूप में निष्पादित करने के लिए एक दैनिक क्रोन स्थापित करना मेरे लिए एक बेहतर समाधान लगता था । इस तरह, उपयोगकर्ता या एप्लिकेशन को किसी रूट एक्सेस की आवश्यकता नहीं है।

यहां बताया गया है कि आप राज्य फ़ाइल कैसे निर्दिष्ट करते हैं:

logrotate --state /path/to/status /path/to/custom_logrotate.conf

अब आप किसी भी उपयोगकर्ता और कॉन्फ़िगरेशन के स्वामी के रूप में लॉगोटेट चला सकते हैं जो आपको पसंद है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.