3 回答

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
這是使用fsnotifylib 監(jiān)視日志文件的另一種方法。fsnotify監(jiān)控xxx.log所在的目錄,告訴lumberjackRotate()什么時(shí)候刪除xxx.log。
import (
"fmt"
"log"
"path/filepath"
"time"
"github.com/fsnotify/fsnotify"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
logPath := "./xxx.log"
logName := filepath.Base(logPath)
logger := &lumberjack.Logger{
// Log path
Filename: logPath,
// Log size MB
MaxSize: 10,
// Backup count
MaxBackups: 3,
// expire days
// MaxAge: 28,
// gzip compress
Compress: false,
}
watcher, err := fsnotify.NewWatcher()
if err != nil {
log.Fatal(err)
}
defer watcher.Close()
go func() {
for event := range watcher.Events {
if event.Op&fsnotify.Remove == fsnotify.Remove &&
event.Name == logName {
log.Println("rotate log", event.Name)
logger.Rotate()
}
}
}()
err = watcher.Add(filepath.Dir(logPath))
if err != nil {
log.Fatal(err)
}
for {
logger.Write([]byte(fmt.Sprintf("current time:%v\n", time.Now())))
time.Sleep(3 * time.Second)
}
}

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
問(wèn)題”
基于所述行為,我假設(shè)這發(fā)生在為文件實(shí)現(xiàn) POSIX 兼容行為的操作系統(tǒng)上(因此它運(yùn)行在具有 Unix 遺產(chǎn)的某些內(nèi)核上 - 例如 *BSD 或 Linux,或者它是 Mac OS 系統(tǒng))。在這些系統(tǒng)上,從文件系統(tǒng)中刪除文件對(duì)該文件系統(tǒng)上的文件存儲(chǔ)沒(méi)有任何影響——只要它至少在一個(gè)正在運(yùn)行的進(jìn)程中打開(kāi)。
具體來(lái)說(shuō),要引用POSIX 文檔open(2)
:
如果文件的鏈接計(jì)數(shù)為0,則當(dāng)與該文件關(guān)聯(lián)的所有文件描述符都關(guān)閉時(shí),該文件占用的空間將被釋放,該文件將不再可訪(fǎng)問(wèn)。
打開(kāi)文件被認(rèn)為將其鏈接計(jì)數(shù)增加 1,從其文件系統(tǒng)中刪除文件與將鏈接計(jì)數(shù)減 1 相同。您可以在此處
閱讀有關(guān)鏈接計(jì)數(shù)的更多信息。
假設(shè)您正在使用的日志記錄包保持日志文件處于打開(kāi)狀態(tài),因此您只需從文件系統(tǒng)的目錄中刪除文件名,但這絕不會(huì)影響日志記錄過(guò)程。
此外,當(dāng)任何文件名消失時(shí),不會(huì)通知打開(kāi)文件的進(jìn)程(在類(lèi) Unix 系統(tǒng)上,一個(gè)文件可能同時(shí)有多個(gè)名稱(chēng)——請(qǐng)閱讀硬鏈接)。
解決方案
通常,對(duì)于類(lèi) Unix 操作系統(tǒng),有一種方法可以明確要求進(jìn)程重新打開(kāi)其日志文件。
偶然地,SIGUSR1
為此使用了一個(gè)信號(hào),因此您可以設(shè)置一個(gè)處理程序(通過(guò)signal.Notify
)為此類(lèi)信號(hào)設(shè)置一個(gè)處理程序,然后將您的日志輪換代碼設(shè)置kill -USR1
為正在運(yùn)行的進(jìn)程,以告訴它重新打開(kāi)日志文件,這將是重新創(chuàng)建。
當(dāng)然,可以實(shí)施更多涉及的方案,因?yàn)槟梢允褂萌魏涡问降?a >IPC將該命令傳達(dá)給正在運(yùn)行的進(jìn)程。

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
刪除 xxx.log 后,您可以向正在運(yùn)行的進(jìn)程發(fā)送一個(gè)信號(hào),然后下面的代碼將處理該信號(hào)并告訴伐木工人創(chuàng)建新的日志文件。
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGUSR1)
go func() {
for _ = range sigs {
// call Rotate() method of lumberjack to create new log file
logger.Rotate()
}
}()
用于刪除和輪換日志的命令
# delete log file
rm path/to/xxx.log
# this command would not kill your process, just send a signal to it.
kill -USR1 <your process id>
- 3 回答
- 0 關(guān)注
- 240 瀏覽
添加回答
舉報(bào)