sql >> Database >  >> NoSQL >> MongoDB

mongo-logrotatie werkt niet op Windows

Met de hulp van Wernfried-Domscheit , veel onderzoek, weken van vallen en opstaan ​​en frustratie heb ik een werkende oplossing voor Windows bedacht.

Vereisten
  • U heeft een MongoDB-service met een configuratiebestand mongod.cfg
  • LogRotateWin is geinstalleerd. Dit is een pakket van derden om de logbestanden te roteren, gebaseerd op de unix-implementatie. Het biedt veel aanpasbare functionaliteiten zoals compressie, wanneer roteren wordt toegepast, het verwijderen van oude bestanden en meer. U kunt hier een volledige optielijst vinden LogRotateWin-configuratie .
  • Basiskennis van Windows Taskscheduler.
  • Zeer basiskennis van bat-bestanden.
1. Pas het configuratiebestand van de MongoDB-Service aan
  1. Stop de service
  2. Open de mongod.cfg en zoek de coderegels waar de systemLog is geconfigureerd:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Zorg ervoor dat u het pad naar uw mongod.log . overschrijft . Zorg er ook voor dat logAppend: true en logRotate: reopen zijn ingesteld.

  1. Verwijder de huidige mongod.log bestand
  2. Herstart de service
2. Configureer de logrotate-configuratie

Dit is mijn configuratie. Dat kun je aanpassen aan je eigen wensen. Maar gebruik geen copy , copytruncate en create en niet verwijder de postrotate commando's! (In de discussiethread van SourceForge zag ik dat notifempty werkt niet en rotate 10 resulteert in toestemmingsfouten, zie mijn bewerking onder dit bericht)

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

Deze configuratie roteert de logboeken elke dag ongecomprimeerd of als de grootte 100 megabyte overschrijdt. Er worden maximaal 50 logs opgeslagen, oudere bestanden worden verwijderd. Het postrotate-script wordt uitgevoerd wanneer de rotatie is gelukt.

3. Maak de notify_mongodb_service.bat bestand

Dit bestand stuurt een commando naar de MongoDB-Service, dat een nieuw bestand zal worden gebruikt. Als je autorisatie hebt ingeschakeld, kun je -u username -p password . toevoegen ook.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Verander het pad naar mongo.exe naar de locatie op uw systeem.
  • Sla het bestand op en zorg ervoor dat het pad in de logrotate configuratie is hetzelfde! (de lijn tussen postrotate en endscript

De opdracht wordt opgeslagen in een extra bestand, omdat de LogRotateWin de haakjes interpreteert ({} ) van het mongo-commando en gooit een Exception.

4. Controleer of alles werkt
  1. Open de map met de logboeken. Je zou een enkel bestand mongod.log moeten zien .

  2. Open een terminal en controleer of logrotatie werkt ( -f dwingt de logrotatie zelfs als er geen trigger is geactiveerd):

logrotate logrotate.conf -f

Er zou een nieuw logbestand moeten verschijnen. (voor mij is het mongod.log.1 )De mongod.log moet leeg zijn.

  1. Activeer iets dat wordt gelogd. Maak bijvoorbeeld verbinding met monogdbCompass naar uw MongoDB.

  2. Controleer mongod.log . De verbinding moet daar worden vastgelegd.

5. Maak een Taskscheduler-taak om periodiek logrotatie uit te voeren

Ik zal het niet hebben over het maken van takenplanners, maar hier is een voorbeeld van mijn configuratie. U kunt dat bestand importeren en aanpassen aan uw behoeften.

Verander ook het pad van de logrotate.exe naar uw locatie van uw systeem.

Deze taak wordt elk uur uitgevoerd om te controleren of een of meerdere triggers van logrotate zijn geactiveerd:

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

Ik hoop dat ik iemand kan helpen met die gids.

Bewerk 2022-05-01

Ik liep tegen het probleem aan dat logrotate genereert uitzondering wanneer er meer dan 9 bestanden zijn:

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>

Quickfix is ​​voorlopig om maximaal 9 bestanden in te stellen.




  1. MongoDB:tekst zoeken en sorteren op datum

  2. database converteren van mysql naar mongoDb

  3. Hoe vind ik een object waarvan de eigenschappen foo of bar gelijk zijn aan een querywaarde?

  4. BASH BSON-parser