sql >> Databáze >  >> NoSQL >> MongoDB

rotace protokolu mongo nefunguje na windows

S pomocí Wernfried-Domscheit , spousta výzkumu, týdny pokusů a omylů a frustrace Zjistil jsem funkční řešení pro Windows.

Předpoklady
  • Máte spuštěnou službu MongoDB s konfiguračním souborem mongod.cfg
  • LogRotateWin je nainstalován. Toto je balíček třetí strany pro rotaci souborů protokolu na základě implementace unixu. Poskytuje mnoho přizpůsobitelných funkcí, jako je komprese, při použití rotace, mazání starých souborů a další. Úplný seznam možností naleznete zde Konfigurace LogRotateWin .
  • Základní znalost nástroje Windows Taskscheduler.
  • Velmi základní znalost souborů bat.
1. Upravte konfigurační soubor MongoDB-Service
  1. Zastavte službu
  2. Otevřete mongod.cfg a najděte řádky kódu, kde je systemLog je nakonfigurováno:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Ujistěte se, že jste přepsali cestu k vašemu mongod.log . Ujistěte se také, že logAppend: true a logRotate: reopen jsou nastaveny.

  1. Smažte aktuální mongod.log soubor
  2. Restartujte službu
2. Nakonfigurujte konfiguraci logrotate

Toto je moje konfigurace. Můžete si to přizpůsobit svým vlastním potřebám. Ale nepoužívejte copy , copytruncate a create a ne odstranit postrotate příkazy! (V diskusním vláknu SourceForge jsem viděl, že notifempty nefunguje a rotate 10 vede k chybám oprávnění, viz moje úprava pod tímto příspěvkem)

E:\MongoDB\Server\4.4\log\mongod.log {
  nocompress
  daily
  size 100m
  missingok
  rotate 50
  postrotate
    E:\logrotate\notify_mongodb_service.bat
  endscript
}

Tato konfigurace otáčí nekomprimované protokoly každý den nebo pokud velikost přesáhne 100 megabajtů. Je uloženo maximálně 50 protokolů, starší soubory budou smazány. Skript postrotate se spustí, když rotace proběhne úspěšně.

3. Vytvořte soubor notify_mongodb_service.bat soubor

Tento soubor odešle službě MongoDB-Service příkaz, že bude použit nový soubor. Pokud jste povolili autorizaci, můžete přidat -u username -p password také.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Změňte cestu na mongo.exe do umístění ve vašem systému.
  • Uložte soubor a ujistěte se, že cesta je uvedena v logrotate konfigurace je stejná! (čára mezi postrotate a endscript

Příkaz je uložen v extra souboru, protože LogRotateWin interpretuje závorky ({} ) příkazu mongo a vyvolá výjimku.

4. Zkontrolujte, zda vše funguje
  1. Otevřete složku protokolů. Měli byste vidět jeden soubor mongod.log .

  2. Otevřete terminál a zkontrolujte, zda logrotation funguje ( -f vynutí logrotaci, i když nebyl spuštěn žádný trigger):

logrotate logrotate.conf -f

Měl by vzniknout nový soubor protokolu. (pro mě je to mongod.log.1 )Program mongod.log by měl být prázdný.

  1. Spusťte něco, co bude zaznamenáno. Připojte se například pomocí monogdbCompass k vašemu MongoDB.

  2. Zkontrolujte mongod.log . Připojení by tam mělo být zaprotokolováno.

5. Chcete-li pravidelně spouštět logrotation
, vytvořte úlohu Taskscheduler Job

Nebudu mluvit o vytváření taskcheduleru, ale zde je příklad mé konfigurace. Tento soubor můžete importovat a upravit podle svých potřeb.

Změňte také cestu souboru logrotate.exe k umístění vašeho systému.

Tato úloha se spouští každou hodinu a kontroluje, zda se spustil jeden nebo více spouštěčů 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>

Doufám, že bych mohl někomu pomoci s tímto průvodcem.

Upravit 2022-05-01

Čelil jsem problému, že logrotate vyvolá výjimku, když je více než 9 souborů:

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>

Rychlá oprava nyní znamená nastavit maximálně 9 souborů.




  1. Android Studio:připojení k serveru MongoDB pomocí ovladače Mongo Java Driver

  2. Podmínka dotazu MongoDb na porovnání 2 polí

  3. mongodb mongoTemplate získat odlišné pole s některými kritérii

  4. Seřaďte dokumenty podle hodnoty v posledním prvku pole, který odpovídá filtru. Mongodb