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
- Dừng dịch vụ
- Mở
mongod.cfg
và tìm các dòng mã nơisystemLog
đượ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: true
và logRotate: reopen
được thiết lập.
- Xóa
mongod.log
hiện tại tệp - 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
, copytruncate
và create
và 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ữapostrotate
vàendscript
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
-
Mở thư mục nhật ký. Bạn sẽ thấy một tệp duy nhất
mongod.log
. -
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.
-
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.
-
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.