sql >> データベース >  >> NoSQL >> MongoDB

mongoログローテーションはWindowsでは機能しません

    Wernfried-Domscheit の助けを借りて 、多くの調査、数週間の試行錯誤と欲求不満、私はWindowsで実用的な解決策を見つけました。

    前提条件
    • 構成ファイルmongod.cfgで実行されているMongoDBサービスがあります
    • LogRotateWin がインストールされています。これは、UNIXの実装に基づいてログファイルをローテーションするサードパーティのパッケージです。回転が適用されるときの圧縮、古いファイルの削除など、多くのカスタマイズ可能な機能を提供します。完全なオプションリストは、LogRotateWin構成 にあります。 。
    • Windowsタスクスケジューラの基本的な知識。
    • batファイルに関する非常に基本的な知識。
    1。 MongoDB-Serviceの構成ファイルを調整します
    1. サービスを停止する
    2. mongod.cfgを開きます systemLogがあるコード行を見つけます 構成されています:
    # where to write logging data. 
    systemLog:
          destination: file
          logAppend: true
          path:  E:\MongoDB\Server\4.4\log\mongod.log
          logRotate: reopen
    

    mongod.logへのパスを上書きしてください 。また、logAppend: trueであることも確認してください およびlogRotate: reopen 設定されています。

    1. 現在のmongod.logを削除します ファイル
    2. サービスを再開します
    2。ログローテーション構成を構成する

    これが私の構成です。自分のニーズに合わせてカスタマイズできます。ただし、copyは使用しないでください 、copytruncate およびcreate およびしない postrotateを削除します コマンド! (SourceForgeのディスカッションスレッドで、notifemptyを見ました。 が機能しておらず、rotate 10 結果として権限エラーが発生します。この投稿の下にある私の編集を参照してください)

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

    この構成では、ログが毎日非圧縮でローテーションされるか、サイズが100メガバイトを超えた場合にローテーションされます。最大50個のログが保存され、古いファイルは削除されます。ローテーションが成功すると、ローテーション後のスクリプトが実行されます。

    3。 notify_mongodb_service.batを作成します ファイル

    このファイルは、新しいファイルが使用されるというコマンドをMongoDB-Serviceに送信します。承認を有効にした場合は、-u username -p passwordを追加できます 同様に。

    E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
    
    • パスをmongo.exeに変更します システム上の場所に移動します。
    • ファイルを保存し、logrotateのパスを確認してください 構成は同じです! (postrotateの間の行 およびendscript

    LogRotateWinがブラケットを解釈するため、コマンドは追加のファイルに保存されます({} )mongoコマンドを実行し、例外をスローします。

    4。すべてが機能していることを確認します
    1. ログのフォルダを開きます。単一のファイルmongod.logが表示されます。 。

    2. ターミナルを開き、ログローテーションが機能していることを確認します(-f トリガーがトリガーされていない場合でも、ログローテーションを強制します):

    logrotate logrotate.conf -f
    

    新しいログファイルが作成されます。 (私にとってはmongod.log.1mongod.log 空にする必要があります。

    1. ログに記録されるものをトリガーします。たとえば、monogdbCompassを使用してMongoDBに接続します。

    2. mongod.logを確認してください 。そこに接続を記録する必要があります。

    5。ログローテーションを定期的に実行するタスクスケジューラジョブを作成します

    タスクスケジューラの作成については説明しませんが、ここに私の構成の例を示します。そのファイルをインポートして、必要に応じて変更できます。

    logrotate.exeのパスも変更します システムの場所に移動します。

    このジョブは1時間ごとに実行され、logrotateの1つまたは複数のトリガーがトリガーされたかどうかを確認します。

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

    そのガイドで誰かを助けられるといいのですが。

    2022-05-01を編集

    logrotateという問題に直面しました 9個を超えるファイルがある場合に例外をスローします:

    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は最大9つのファイルを設定することです。




    1. マングース:最新のドキュメントを探す

    2. MongoDBは、Javaで利用可能なデータベースを一覧表示します

    3. 複数の2dsphereインデックス、geoNearを実行するかどうかわからない

    4. mgo $ unwind集計結果を不明な要素の種類(0x2E)に