sql >> Database teknologi >  >> NoSQL >> MongoDB

mongo log rotation virker ikke på windows

Med hjælp fra Wernfried-Domscheit , en masse research, uger med forsøg og fejl og frustration fandt jeg ud af en fungerende løsning på Windows.

Forudsætninger
  • Du har en MongoDB-Service, der kører med en konfigurationsfil mongod.cfg
  • LogRotateWin er installeret. Dette er en tredjepartspakke til at rotere logfilerne, baseret på unix-implementeringen. Det giver mange brugerdefinerbare funktioner som komprimering, når rotation anvendes, sletning af gamle filer og mere. Du kan finde en komplet liste over muligheder her LogRotateWin-konfiguration .
  • Grundlæggende kendskab til Windows Taskscheduler.
  • Meget grundlæggende viden om bat-filer.
1. Juster konfigurationsfilen for MongoDB-Service
  1. Stop tjenesten
  2. Åbn mongod.cfg og find kodelinjerne hvor systemLog er konfigureret:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Sørg for, at du overskriver stien til din mongod.log . Vær også sikker på, at logAppend: true og logRotate: reopen er indstillet.

  1. Slet den nuværende mongod.log fil
  2. Genstart tjenesten
2. Konfigurer logrotate-konfigurationen

Dette er min konfiguration. Du kan tilpasse det til dine egne behov. Men brug ikke copy , copytruncate og create og ikke fjern postrotate kommandoer! (I diskussionstråden til SourceForge så jeg den notifempty virker ikke, og rotate 10 resulterer i tilladelsesfejl, se min redigering under dette indlæg)

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

Denne konfiguration roterer logfilerne ukomprimeret hver dag, eller hvis størrelsen oversteg 100 megabyte. Der gemmes maksimalt 50 logfiler, ældre filer vil blive slettet. Det efterroterede script vil blive udført, når rotationen lykkedes.

3. Opret notify_mongodb_service.bat fil

Denne fil sender en kommando til MongoDB-tjenesten, at en ny fil vil blive brugt. Hvis du har aktiveret autorisation, kan du tilføje -u username -p password også.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Skift stien til mongo.exe til placeringen på dit system.
  • Gem filen, og sørg for, at stien i logrotate konfigurationen er den samme! (linjen mellem postrotate og endscript

Kommandoen er gemt i en ekstra fil, fordi LogRotateWin fortolker parenteserne ({} ) af mongo-kommandoen og kaster en undtagelse.

4. Tjek, at alt fungerer
  1. Åbn mappen med logfilerne. Du bør se en enkelt fil mongod.log .

  2. Åbn en terminal og kontroller, at logrotation fungerer ( -f tvinger logrotationen, selvom ingen trigger blev udløst):

logrotate logrotate.conf -f

Der skulle opstå en ny logfil. (for mig er det mongod.log.1 ) mongod.log skal være tom.

  1. Udløs noget, der vil blive logget. Forbind for eksempel med monogdbCompass til din MongoDB.

  2. Tjek mongod.log . Forbindelsen skal logges der.

5. Opret et Taskscheduler-job for at køre logrotation med jævne mellemrum

Jeg vil ikke tale om oprettelse af opgaveplanlægning, men her er et eksempel på min konfiguration. Du kan importere den fil og ændre den til dine behov.

Skift også stien til logrotate.exe til din placering af dit system.

Dette job kører hver time for at kontrollere, om en eller flere triggere af logrotate udløste:

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

Jeg håber, jeg kunne hjælpe nogen med den guide.

Rediger 2022-05-01

Jeg stod over for det problem, at logrotate kaster undtagelse, når der er mere end 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>

Quickfix for nu er at indstille maksimalt 9 filer.




  1. gem adgangskode som saltet hash i mongodb i brugersamling ved hjælp af python/bcrypt

  2. Kan jeg lave en tekstforespørgsel med mongodb c#-driveren

  3. Scriptet forsøgte at oprette en global variabel

  4. Mongodb - er pålidelighedsproblemer stadig betydelige?