MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

ротацията на mongo log не работи на windows

С помощта на Wernfried-Domscheit , много изследвания, седмици опити и грешки и разочарование разбрах работещо решение за Windows.

Предварителни условия
  • Имате MongoDB-Service, работеща с конфигурационен файл mongod.cfg
  • LogRotateWin е инсталиран. Това е пакет на трета страна за завъртане на регистрационните файлове, базиран на изпълнението на unix. Предоставя много персонализируеми функционалности като компресия, когато се прилага завъртане, изтриване на стари файлове и други. Можете да намерите пълен списък с опции тук Конфигурация на LogRotateWin .
  • Основни познания за Windows Taskscheduler.
  • Много основни познания за bat файловете.
1. Коригирайте конфигурационния файл на MongoDB-Service
  1. Спрете услугата
  2. Отворете 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 са зададени.

  1. Изтрийте текущия mongod.log файл
  2. Рестартирайте услугата
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. Проверете дали всичко работи
  1. Отворете папката с регистрационните файлове. Трябва да видите един файл mongod.log .

  2. Отворете терминал и проверете дали logrotation работи ( -f принуждава logrotation дори ако не е задействан тригер):

logrotate logrotate.conf -f

Трябва да се появи нов лог файл. (за мен е mongod.log.1 ) mongod.log трябва да е празно.

  1. Задействайте нещо, което ще бъде регистрирано. Например свържете се с monogdbCompass към вашата MongoDB.

  2. Проверете 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 файла.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Не може да се свърже с Mongo DB чрез Spark

  2. MongoDB безкраен Find ToListAsync

  3. Намерете документи в MongoDB, чиито с поле на масив е подмножество на масив от заявка

  4. node.js база данни

  5. Премахване на подполета от mongoDb документ