MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Rotacja dziennika mongo nie działa w systemie Windows

Z pomocą Wernfried-Domscheit , wiele badań, tygodnie prób i błędów oraz frustracji wymyśliłem działające rozwiązanie w systemie Windows.

Wymagania wstępne
  • Masz usługę MongoDB działającą z plikiem konfiguracyjnym mongod.cfg
  • LogRotateWin jest zainstalowane. Jest to pakiet innej firmy do rotacji plików dziennika, oparty na implementacji uniksowej. Zapewnia wiele konfigurowalnych funkcji, takich jak kompresja, rotacja, usuwanie starych plików i inne. Pełną listę opcji znajdziesz tutaj Konfiguracja LogRotateWin .
  • Podstawowa znajomość harmonogramu zadań Windows.
  • Bardzo podstawowa wiedza na temat plików bat.
1. Dostosuj plik konfiguracyjny usługi MongoDB-Service
  1. Zatrzymaj usługę
  2. Otwórz plik mongod.cfg i znajdź linie kodu, w których systemLog jest skonfigurowany:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Upewnij się, że nadpisałeś ścieżkę do swojego mongod.log . Upewnij się również, że logAppend: true i logRotate: reopen są ustawione.

  1. Usuń bieżący plik mongod.log plik
  2. Uruchom ponownie usługę
2. Skonfiguruj konfigurację logrotate

To jest moja konfiguracja. Możesz to dostosować do własnych potrzeb. Ale nie używaj copy , copytruncate i create i nie usuń postrotate polecenia! (W wątku dyskusji na SourceForge zobaczyłem, że notifempty nie działa i rotate 10 skutkuje błędami uprawnień, zobacz moją zmianę pod tym postem)

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

Ta konfiguracja powoduje rotację dzienników nieskompresowanych codziennie lub jeśli rozmiar przekracza 100 megabajtów. Przechowywanych jest maksymalnie 50 logów, starsze pliki zostaną usunięte. Skrypt postrotate zostanie wykonany, gdy rotacja się powiedzie.

3. Utwórz plik notify_mongodb_service.bat plik

Plik ten wysyła polecenie do usługi MongoDB, że zostanie użyty nowy plik. Jeśli włączyłeś autoryzację, możesz dodać -u username -p password również.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Zmień ścieżkę na mongo.exe do lokalizacji w twoim systemie.
  • Zapisz plik i upewnij się, że ścieżka w logrotate konfiguracja jest taka sama! (linia między postrotate i endscript

Polecenie jest przechowywane w dodatkowym pliku, ponieważ LogRotateWin interpretuje nawiasy ({} ) polecenia mongo i zgłasza wyjątek.

4. Sprawdź, czy wszystko działa
  1. Otwórz folder dzienników. Powinieneś zobaczyć pojedynczy plik mongod.log .

  2. Otwórz terminal i sprawdź, czy działa rotacja logów ( -f wymusza logrotację, nawet jeśli nie został uruchomiony wyzwalacz):

logrotate logrotate.conf -f

Powinien pojawić się nowy plik dziennika. (dla mnie jest to mongod.log.1 ) mongod.log powinien być pusty.

  1. Uruchom coś, co zostanie zarejestrowane. Na przykład połącz się za pomocą monogdbCompass z MongoDB.

  2. Sprawdź mongod.log . Połączenie powinno być tam zarejestrowane.

5. Utwórz zadanie harmonogramu zadań, aby okresowo uruchamiać rotację logów

Nie będę mówił o tworzeniu harmonogramu zadań, ale oto przykład mojej konfiguracji. Możesz zaimportować ten plik i zmodyfikować go do swoich potrzeb.

Zmień także ścieżkę logrotate.exe do Twojej lokalizacji systemu.

To zadanie jest uruchamiane co godzinę, aby sprawdzić, czy wyzwolono jeden lub wiele wyzwalaczy 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>

Mam nadzieję, że pomogę komuś z tym przewodnikiem.

Edytuj 2022-05-01

Spotkałem się z problemem, który logrotate zgłasza wyjątek, gdy jest więcej niż 9 plików:

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>

Na razie Quickfix ma ustawić maksymalnie 9 plików.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Analizuj zabezpieczenia serwera

  2. mongodb-org konflikty z mongodb-10gen-server

  3. Docker mongodb udostępnia wolumin z systemem Mac OS X

  4. Sterownik PHP72 MongoDB z Homebrew na OSX

  5. Mongodb TTL nie działa