С помощта на Wernfried-Domscheit , много изследвания, седмици опити и грешки и разочарование разбрах работещо решение за Windows.
Предварителни условия
- Имате MongoDB-Service, работеща с конфигурационен файл
mongod.cfg
- LogRotateWin е инсталиран. Това е пакет на трета страна за завъртане на регистрационните файлове, базиран на изпълнението на unix. Предоставя много персонализируеми функционалности като компресия, когато се прилага завъртане, изтриване на стари файлове и други. Можете да намерите пълен списък с опции тук Конфигурация на LogRotateWin .
- Основни познания за Windows Taskscheduler.
- Много основни познания за bat файловете.
1. Коригирайте конфигурационния файл на MongoDB-Service
- Спрете услугата
- Отворете
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. Конфигурирайте конфигурацията на logrotate
Това е моята конфигурация. Можете да персонализирате това според вашите собствени нужди. Но не използвайте copy
, copytruncate
и create
ине премахнете postrotate
команди! (В дискусионната нишка на SourceForge видях, че 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 журнала, по-старите файлове ще бъдат изтрити. Скриптът postrotate ще бъде изпълнен, когато завъртането е успешно.
3. Създайте notify_mongodb_service.bat
файл
Този файл изпраща команда до MongoDB-Service, че ще бъде използван нов файл. Ако сте активирали оторизация, можете да добавите -u username -p password
също.
E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
- Променете пътя към
mongo.exe
към местоположението във вашата система. - Запазете файла и се уверете, че пътят в
logrotate
конфигурацията е същата! (редът междуpostrotate
иendscript
Командата се съхранява в допълнителен файл, тъй като LogRotateWin интерпретира скобите ({}
) на командата mongo и хвърля изключение.
4. Проверете дали всичко работи
-
Отворете папката с регистрационните файлове. Трябва да видите един файл
mongod.log
. -
Отворете терминал и проверете дали logrotation работи (
-f
принуждава logrotation дори ако не е задействан тригер):
logrotate logrotate.conf -f
Трябва да се появи нов лог файл. (за мен е mongod.log.1
) mongod.log
трябва да е празно.
-
Задействайте нещо, което ще бъде регистрирано. Например свържете се с monogdbCompass към вашата MongoDB.
-
Проверете
mongod.log
. Връзката трябва да се регистрира там.
5. Създайте задание на Taskscheduler, за да изпълнявате периодично logrotation
Няма да говоря за създаването на планировчик на задачи, но ето пример за моята конфигурация. Можете да импортирате този файл и да го промените според вашите нужди.
Също така променете пътя на logrotate.exe
към вашето местоположение на вашата система.
Това задание се изпълнява на всеки час, за да провери дали са задействани един или няколко тригера на logrotate:
<?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 файла.