Eu consegui fazer isso funcionar, mas você pode ter que jogar com a transparência / tamanho da fonte / cor de fundo para obtê-lo, então é fácil de ler.
Você precisará instalar o AutoHotKey e executar este script: link
Existem alguns comentários no código, mas brevemente ele irá: ler 5 linhas do final do arquivo de log especificado; crie uma janela e adicione isto como texto na janela; torne a janela transparente, sempre na parte superior e "não clicável"; e atualize o texto a cada 1 segundo (pode ser necessário aumentar isso, mas não vejo um grande impacto no desempenho - mesmo com um arquivo de log de 20 MB).
Para sair do script, clique com o botão direito do mouse no ícone AutoHotKey na bandeja do sistema e escolha Sair.
Se meus links estiverem quebrados, o código AHK segue:
#SingleInstance force
; Example: On-screen display (OSD) via transparent window:
FileName := "C:\xampplite\apache\logs\access.log"
NumLines = 5
CustomColor = FF8080 ; The transparent background color of the window, set this to something close to your text colour to avoid white highlighting
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow +E0x20 ; +ToolWindow avoids a taskbar button and an alt-tab menu item.
Gui, Color, %CustomColor%
Gui, Font, s12 ; Set a large font size (12-point).
errorTail := FileTail(FileName , NumLines) ; get the text from the file, last 5 lines
Gui, Add, Text, vMyText cRed Y+0, %errorTail% ; add it, colour is Red, R5 sets 5 rows
; choose one of these lines, first one show just the text, second one has a background for readability
WinSet, TransColor, %CustomColor% 200 ; Make all pixels of this color transparent and make the text itself translucent (250)
;Winset, Transparent, 150
SetTimer, UpdateOSD, 1000 ; 1 second timer set here
Gui, Show, x0 y600 NoActivate ; Set the x and y position. NoActivate avoids deactivating the currently active window.
return
UpdateOSD: ; the repeated timer routine
errorTail := FileTail(FileName, NumLines) ;get 5 lines
GuiControl,, MyText, %errorTail%
return
; ======================================================================================================================
; Function: Retrieve the last lines of a text file.
; AHK version: 1.1.07+
; Parameters:
; FileName - the name of the file, assumed to be in A_WorkingDir if an absolute path isn't specified
; Lines - number of lines to read - default: 10 (like Unix)
; NewLine - new line character(s) - default: 'r'n (Windows)
; Return values:
; On success: The required lines, if present
; On failure: ""
; Version: 1.0.00.00/2012-04-16/just me
; ======================================================================================================================
FileTail(FileName, Lines = 10, NewLine = "'r'n") {
Static MaxLineLength := 256 ; seems to be reasonable to start with
If !IsObject(File := FileOpen(FileName, "r"))
Return ""
Content := ""
LinesLength := MaxLineLength * Lines * (InStr(File.Encoding, "UTF-16") ? 2 : 1)
FileLength := File.Length
BytesToRead := 0
FoundLines := 0
While (BytesToRead < FileLength) && !(FoundLines) {
BytesToRead += LinesLength
If (BytesToRead < FileLength)
File.Pos := FileLength - BytesToRead
Else
File.Pos := 0
Content := RTrim(File.Read(), "'r'n")
If (FoundLines := InStr(Content, NewLine, 0, 0, Lines))
Content := SubStr(Content, FoundLines + StrLen(NewLine))
}
File.Close()
Return Content
}