Wernfried-Domscheit की सहायता से , बहुत सारे शोध, परीक्षण के सप्ताह और त्रुटि और निराशा मैंने विंडोज़ पर एक कार्यशील समाधान निकाला।
आवश्यकताएं
- आपके पास एक MongoDB-सेवा है जो एक कॉन्फ़िगरेशन फ़ाइल के साथ चल रही है
mongod.cfg
- LogRotateWin स्थापित है। यह यूनिक्स कार्यान्वयन के आधार पर लॉगफाइल्स को घुमाने के लिए एक तृतीय पक्ष पैकेज है। यह कई अनुकूलन योग्य कार्यक्षमता प्रदान करता है जैसे संपीड़न, घूर्णन लागू होने पर, पुरानी फ़ाइल हटाना और बहुत कुछ। आप एक पूर्ण विकल्प सूची यहां पा सकते हैं LogRotateWin Configuration ।
- Windows कार्य शेड्यूलर का बुनियादी ज्ञान।
- बैट फाइलों का बहुत बुनियादी ज्ञान।
- सेवा बंद करो
mongod.cfg
खोलें और उन कोड पंक्तियों को खोजें जहांsystemLog
कॉन्फ़िगर किया गया है:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: E:\MongoDB\Server\4.4\log\mongod.log
logRotate: reopen
सुनिश्चित करें, कि आप अपने mongod.log
. के पथ को अधिलेखित कर दें . यह भी सुनिश्चित करें कि logAppend: true
और logRotate: reopen
सेट हैं।
- मौजूदा
mongod.log
हटाएं फ़ाइल - सेवा फिर से शुरू करें
2. लॉगरोटेट कॉन्फ़िगरेशन कॉन्फ़िगर करें
यह मेरा विन्यास है। आप इसे अपनी आवश्यकताओं के अनुसार अनुकूलित कर सकते हैं। लेकिन copy
का उपयोग न करें , copytruncate
और create
और नहीं postrotate
हटाएं आज्ञा! (सोर्सफोर्ज के चर्चा सूत्र में मैंने देखा कि notifempty
काम नहीं कर रहा है और rotate 10
अनुमति त्रुटियों में परिणाम, इस पोस्ट के नीचे मेरा संपादन देखें)
E:\MongoDB\Server\4.4\log\mongod.log {
nocompress
daily
size 100m
missingok
rotate 50
postrotate
E:\logrotate\notify_mongodb_service.bat
endscript
}
यह कॉन्फ़िगरेशन लॉग को हर दिन असम्पीडित या आकार 100 मेगाबाइट से अधिक होने पर घुमाता है। अधिकतम 50 लॉग संग्रहीत हैं, पुरानी फाइलें हटा दी जाएंगी। रोटेशन सफल होने पर पोस्टरोटेट स्क्रिप्ट निष्पादित की जाएगी।
3. notify_mongodb_service.bat
फ़ाइल
यह फ़ाइल MongoDB-Service को एक कमांड भेजती है, कि एक नई फ़ाइल का उपयोग किया जाएगा। यदि आपने प्राधिकरण सक्षम किया है तो आप -u username -p password
add जोड़ सकते हैं साथ ही।
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- पथ को
mongo.exe
में बदलें आपके सिस्टम के स्थान पर। - फ़ाइल सहेजें और सुनिश्चित करें कि
logrotate
. में पथ कॉन्फ़िगरेशन समान है! (postrotate
. के बीच की रेखा औरendscript
कमांड को एक अतिरिक्त फ़ाइल में संग्रहीत किया जाता है, क्योंकि LogRotateWin ब्रैकेट्स की व्याख्या करता है ({}
) मोंगो कमांड का और एक अपवाद फेंकता है।
4. जांचें कि सब कुछ काम कर रहा है
-
लॉग का फ़ोल्डर खोलें। आपको एक ही फाइल दिखाई देनी चाहिए
mongod.log
। -
एक टर्मिनल खोलें और जांचें कि लॉगरोटेशन काम कर रहा है (
-f
कोई ट्रिगर ट्रिगर न होने पर भी लॉगरोटेशन को बल देता है):
logrotate logrotate.conf -f
एक नई लॉग फ़ाइल आनी चाहिए। (मेरे लिए यह mongod.log.1
. है )mongod.log
खाली होना चाहिए।
-
कुछ ऐसा ट्रिगर करें जिसे लॉग किया जाएगा। उदाहरण के लिए monogdbCompass से अपने MongoDB से कनेक्ट करें।
-
चेक
mongod.log
. कनेक्शन वहां लॉग होना चाहिए।
5. समय-समय पर लॉगरोटेशन चलाने के लिए टास्क शेड्यूलर जॉब बनाएं
मैं कार्य शेड्यूलर निर्माण के बारे में बात नहीं करूंगा लेकिन यहां मेरी कॉन्फ़िगरेशन का एक उदाहरण है। आप उस फ़ाइल को आयात कर सकते हैं और इसे अपनी आवश्यकताओं के अनुसार संशोधित कर सकते हैं।
logrotate.exe
. का पथ भी बदलें आपके सिस्टम के आपके स्थान पर।
यह कार्य यह जांचने के लिए हर घंटे चलता है कि लॉगरोटेट के एक या एक से अधिक ट्रिगर ट्रिगर हुए या नहीं:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2021-12-02T17:57:55.9541897</Date>
<Author>Grayknife</Author>
<Description>Execute Logrotate Hourly</Description>
<URI>\docker\LogRotate</URI>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<Repetition>
<Interval>PT1H</Interval>
<StopAtDurationEnd>false</StopAtDurationEnd>
</Repetition>
<StartBoundary>2021-12-02T18:00:00</StartBoundary>
<ExecutionTimeLimit>PT30M</ExecutionTimeLimit>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>1234</UserId>
<LogonType>Password</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>E:\logrotate\logrotate.exe</Command>
<Arguments>logrotate.conf</Arguments>
<WorkingDirectory>E:\logrotate</WorkingDirectory>
</Exec>
</Actions>
</Task>
मुझे उम्मीद है कि मैं उस गाइड के साथ किसी की मदद कर सकता हूं।
2022-05-01 संपादित करें
मुझे इस समस्या का सामना करना पड़ा कि logrotate
9 से अधिक फ़ाइलें होने पर अपवाद फेंकता है:
E:\logrotate>E:\logrotate\logrotate.exe logrotate.conf -f
logrotate: Force option set to true
logrotate: Exception: Cannot create a file when that file already exists.
logrotate: StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.__Error.WinIOError()
at System.IO.File.InternalMove(String sourceFileName, String destFileName, Boolean checkHost)
at logrotate.Program.AgeOutRotatedFiles(logrotateconf lrc, FileInfo fi, String rotate_path)
at logrotate.Program.RotateFile(logrotateconf lrc, FileInfo fi)
at logrotate.Program.Main(String[] args)
E:\logrotate>E:\logrotate\logrotate.exe logrotate.conf -f
logrotate: Force option set to true
logrotate: Exception: Access to the path 'E:\MongoDB\Server\4.4\log\mongod.log.10' is denied.
logrotate: StackTrace: at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.File.InternalDelete(String path, Boolean checkHost)
at System.IO.File.Delete(String path)
at logrotate.Program.DeleteRotateFile(String m_filepath, logrotateconf lrc)
at logrotate.Program.AgeOutRotatedFiles(logrotateconf lrc, FileInfo fi, String rotate_path)
at logrotate.Program.RotateFile(logrotateconf lrc, FileInfo fi)
at logrotate.Program.Main(String[] args)
E:\logrotate>
अभी के लिए क्विकफिक्स अधिकतम 9 फाइलें सेट करना है।