sql >> Databasteknik >  >> NoSQL >> MongoDB

mongologgrotation fungerar inte på Windows

Med hjälp av Wernfried-Domscheit , mycket forskning, veckor av försök och misstag och frustration jag kom på en fungerande lösning på Windows.

Förutsättningar
  • Du har en MongoDB-tjänst som körs med en konfigurationsfil mongod.cfg
  • LogRotateWin är installerad. Detta är ett tredjepartspaket för att rotera loggfilerna, baserat på unix-implementeringen. Det tillhandahåller många anpassningsbara funktioner som komprimering, när rotation används, radering av gamla filer och mer. Du kan hitta en fullständig lista med alternativ här LogRotateWin-konfiguration .
  • Grundläggande kunskaper om Windows Taskscheduler.
  • Mycket grundläggande kunskaper om bat-filer.
1. Justera konfigurationsfilen för MongoDB-tjänsten
  1. Stoppa tjänsten
  2. Öppna mongod.cfg och hitta kodraderna där systemLog är konfigurerad:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Se till att du skriver över sökvägen till din mongod.log . Se också till att logAppend: true och logRotate: reopen är inställda.

  1. Ta bort den nuvarande mongod.log fil
  2. Starta om tjänsten
2. Konfigurera logrotate-konfigurationen

Det här är min konfiguration. Du kan anpassa det efter dina egna behov. Men använd inte copy , copytruncate och create och inte ta bort postrotate kommandon! (I diskussionstråden för SourceForge såg jag att notifempty fungerar inte och rotate 10 resulterar i behörighetsfel, se min redigering nedanför detta inlägg)

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

Denna konfiguration roterar loggarna okomprimerade varje dag eller om storleken överskrider 100 megabyte. Maximalt 50 loggar lagras, äldre filer kommer att raderas. Det efterroterade skriptet kommer att köras när rotationen lyckades.

3. Skapa notify_mongodb_service.bat fil

Denna fil skickar ett kommando till MongoDB-tjänsten att en ny fil kommer att användas. Om du aktiverade auktorisering kan du lägga till -u username -p password likaså.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Ändra sökvägen till mongo.exe till platsen på ditt system.
  • Spara filen och se till att sökvägen i logrotate konfigurationen är densamma! (linjen mellan postrotate och endscript

Kommandot lagras i en extra fil, eftersom LogRotateWin tolkar parenteserna ({} ) av mongo-kommandot och kastar ett undantag.

4. Kontrollera att allt fungerar
  1. Öppna mappen med loggarna. Du bör se en enda fil mongod.log .

  2. Öppna en terminal och kontrollera att logrotation fungerar ( -f tvingar fram logrotationen även om ingen trigger utlöstes):

logrotate logrotate.conf -f

En ny loggfil bör uppstå. (för mig är det mongod.log.1 ) mongod.log bör vara tom.

  1. Utlösa något som kommer att loggas. Anslut till exempel med monogdbCompass till din MongoDB.

  2. Kontrollera mongod.log . Anslutningen ska loggas där.

5. Skapa ett Taskscheduler-jobb för att köra logrotation med jämna mellanrum

Jag kommer inte att prata om att skapa en schemaläggare men här är ett exempel på min konfiguration. Du kan importera den filen och ändra den efter dina behov.

Ändra även sökvägen till logrotate.exe till din plats på ditt system.

Det här jobbet körs varje timme för att kontrollera om en eller flera triggers av logrotate utlöstes:

<?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>

Jag hoppas att jag kunde hjälpa någon med den guiden.

Redigera 2022-05-01

Jag stötte på problemet att logrotate kastar undantag när det finns fler än 9 filer:

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>

Snabbfix för nu är att ställa in maximalt 9 filer.




  1. I MongoDB, om ett index är på 3 fält, kan vi använda det indexet när vi frågar på 2 fält? (jokertecken i det tredje fältet)

  2. Fältet $name måste vara ett ackumulatorobjekt

  3. Om jag använder MongoDB som vår huvuddatabas, ska jag använda en separat grafdatabas för att implementera relationer mellan enheter?

  4. Ta bort alla fält som är null