|
Packit |
63bb0d |
package pipeline
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
import (
|
|
Packit |
63bb0d |
"os"
|
|
Packit |
63bb0d |
"syscall"
|
|
Packit |
63bb0d |
"unsafe"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
// forceLog should rarely be used. It forceable logs an entry to the
|
|
Packit |
63bb0d |
// Windows Event Log (on Windows) or to the SysLog (on Linux)
|
|
Packit |
63bb0d |
func forceLog(level LogLevel, msg string) {
|
|
Packit |
63bb0d |
var el eventType
|
|
Packit |
63bb0d |
switch level {
|
|
Packit |
63bb0d |
case LogError, LogFatal, LogPanic:
|
|
Packit |
63bb0d |
el = elError
|
|
Packit |
63bb0d |
case LogWarning:
|
|
Packit |
63bb0d |
el = elWarning
|
|
Packit |
63bb0d |
case LogInfo:
|
|
Packit |
63bb0d |
el = elInfo
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
// We are logging it, ensure trailing newline
|
|
Packit |
63bb0d |
if len(msg) == 0 || msg[len(msg)-1] != '\n' {
|
|
Packit |
63bb0d |
msg += "\n" // Ensure trailing newline
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
reportEvent(el, 0, msg)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type eventType int16
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
const (
|
|
Packit |
63bb0d |
elSuccess eventType = 0
|
|
Packit |
63bb0d |
elError eventType = 1
|
|
Packit |
63bb0d |
elWarning eventType = 2
|
|
Packit |
63bb0d |
elInfo eventType = 4
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
var reportEvent = func() func(eventType eventType, eventID int32, msg string) {
|
|
Packit |
63bb0d |
advAPI32 := syscall.MustLoadDLL("advapi32.dll") // lower case to tie in with Go's sysdll registration
|
|
Packit |
63bb0d |
registerEventSource := advAPI32.MustFindProc("RegisterEventSourceW")
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
sourceName, _ := os.Executable()
|
|
Packit |
63bb0d |
sourceNameUTF16, _ := syscall.UTF16PtrFromString(sourceName)
|
|
Packit |
63bb0d |
handle, _, lastErr := registerEventSource.Call(uintptr(0), uintptr(unsafe.Pointer(sourceNameUTF16)))
|
|
Packit |
63bb0d |
if lastErr == nil { // On error, logging is a no-op
|
|
Packit |
63bb0d |
return func(eventType eventType, eventID int32, msg string) {}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
reportEvent := advAPI32.MustFindProc("ReportEventW")
|
|
Packit |
63bb0d |
return func(eventType eventType, eventID int32, msg string) {
|
|
Packit |
63bb0d |
s, _ := syscall.UTF16PtrFromString(msg)
|
|
Packit |
63bb0d |
_, _, _ = reportEvent.Call(
|
|
Packit |
63bb0d |
uintptr(handle), // HANDLE hEventLog
|
|
Packit |
63bb0d |
uintptr(eventType), // WORD wType
|
|
Packit |
63bb0d |
uintptr(0), // WORD wCategory
|
|
Packit |
63bb0d |
uintptr(eventID), // DWORD dwEventID
|
|
Packit |
63bb0d |
uintptr(0), // PSID lpUserSid
|
|
Packit |
63bb0d |
uintptr(1), // WORD wNumStrings
|
|
Packit |
63bb0d |
uintptr(0), // DWORD dwDataSize
|
|
Packit |
63bb0d |
uintptr(unsafe.Pointer(&s)), // LPCTSTR *lpStrings
|
|
Packit |
63bb0d |
uintptr(0)) // LPVOID lpRawData
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}()
|