MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

mongo log xoay không hoạt động trên windows

Với sự trợ giúp của Wernfried-Domscheit , rất nhiều nghiên cứu, nhiều tuần thử và sai và thất vọng, tôi đã tìm ra giải pháp hoạt động trên windows.

Điều kiện tiên quyết
  • Bạn có MongoDB-Service đang chạy với tệp cấu hình mongod.cfg
  • LogRotateWin được cài đặt. Đây là một gói của bên thứ ba để xoay các tệp nhật ký, dựa trên việc triển khai unix. Nó cung cấp nhiều chức năng có thể tùy chỉnh như nén, khi áp dụng xoay, xóa tệp cũ và hơn thế nữa. Bạn có thể tìm thấy danh sách tùy chọn đầy đủ tại đây Cấu hình LogRotateWin .
  • Kiến thức cơ bản về Windows Taskscheduler.
  • Kiến thức rất cơ bản về tệp dơi.
1. Điều chỉnh tệp cấu hình của MongoDB-Service
  1. Dừng dịch vụ
  2. Mở mongod.cfg và tìm các dòng mã nơi systemLog được định cấu hình:
# where to write logging data. 
systemLog:
      destination: file
      logAppend: true
      path:  E:\MongoDB\Server\4.4\log\mongod.log
      logRotate: reopen

Hãy chắc chắn rằng bạn đã ghi đè đường dẫn đến mongod.log của mình . Ngoài ra, hãy chắc chắn rằng logAppend: truelogRotate: reopen được thiết lập.

  1. Xóa mongod.log hiện tại tệp
  2. Khởi động lại dịch vụ
2. Định cấu hình logrotate

Đây là cấu hình của tôi. Bạn có thể tùy chỉnh điều đó theo nhu cầu của riêng mình. Nhưng không sử dụng copy , copytruncatecreate không loại bỏ postrotate lệnh! (Trong chuỗi thảo luận của SourceForge, tôi thấy rằng notifempty không hoạt động và rotate 10 kết quả là lỗi quyền, hãy xem chỉnh sửa của tôi bên dưới bài đăng này)

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

Cấu hình này xoay các nhật ký không nén mỗi ngày hoặc nếu kích thước vượt quá 100 megabyte. Tối đa 50 nhật ký được lưu trữ, các tệp cũ hơn sẽ bị xóa. Tập lệnh postrotate sẽ được thực thi khi xoay vòng thành công.

3. Tạo notify_mongodb_service.bat tệp

Tệp này sẽ gửi một lệnh đến MongoDB-Service, một tệp mới sẽ được sử dụng. Nếu bạn đã bật ủy quyền, bạn có thể thêm -u username -p password cũng được.

E:\MongoDB\Server\4.4\bin\mongo.exe --eval "db.adminCommand({ logRotate: 1 })"
  • Thay đổi đường dẫn thành mongo.exe đến vị trí trên hệ thống của bạn.
  • Lưu tệp và đảm bảo rằng đường dẫn trong logrotate cấu hình giống nhau! (đường giữa postrotateendscript

Lệnh được lưu trữ trong một tệp bổ sung, vì LogRotateWin diễn giải các dấu ngoặc ({} ) của lệnh mongo và ném Ngoại lệ.

4. Kiểm tra để đảm bảo rằng tất cả đều hoạt động
  1. Mở thư mục nhật ký. Bạn sẽ thấy một tệp duy nhất mongod.log .

  2. Mở một thiết bị đầu cuối và kiểm tra xem logrotation có hoạt động không (-f buộc logrotation ngay cả khi không có trình kích hoạt nào được kích hoạt):

logrotate logrotate.conf -f

Một tệp nhật ký mới sẽ xảy ra. (đối với tôi thì đó là mongod.log.1 ) mongod.log nên để trống.

  1. Kích hoạt một cái gì đó sẽ được ghi lại. Ví dụ:kết nối với monogdbCompass với MongoDB của bạn.

  2. Kiểm tra mongod.log . Kết nối sẽ được ghi ở đó.

5. Tạo công việc Taskscheduler để chạy logrotation định kỳ

Tôi sẽ không nói về việc tạo taskcheduler nhưng đây là một ví dụ về cấu hình của tôi. Bạn có thể nhập tệp đó và sửa đổi tệp theo nhu cầu của mình.

Đồng thời thay đổi đường dẫn của logrotate.exe đến vị trí của hệ thống của bạn.

Công việc này chạy hàng giờ để kiểm tra xem một hoặc nhiều trình kích hoạt logrotate được kích hoạt:

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

Tôi hy vọng tôi có thể giúp ai đó về hướng dẫn đó.

Chỉnh sửa 2022-05-01

Tôi gặp phải sự cố logrotate ném ngoại lệ khi có nhiều hơn 9 tệp:

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 hiện tại là đặt tối đa 9 tệp.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Trường dự án trong tài liệu nhúng trong mảng nhúng

  2. Không thể kết nối mongoDB với Nodejs bằng Docker-compo

  3. Trình kết nối nguồn Mongodb Kafka chính thức được phân phối với nhiều tác vụ Không hoạt động

  4. Mongoose:CastError:Truyền tới ObjectId không thành công cho giá trị [đối tượng Đối tượng] tại đường dẫn _id

  5. MongoDB InsertBatch JObject - Lỗi tuần tự hóa