54 lines
1.1 KiB
Go
54 lines
1.1 KiB
Go
|
// Package syslog contains a syslog handler.
|
||
|
//
|
||
|
// We use this handler on macOS systems to log messages
|
||
|
// when ooniprobe is running in the background.
|
||
|
package syslog
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"unsafe"
|
||
|
|
||
|
"github.com/apex/log"
|
||
|
)
|
||
|
|
||
|
/*
|
||
|
#include<stdlib.h>
|
||
|
|
||
|
void ooniprobe_openlog(void);
|
||
|
void ooniprobe_log_debug(const char *message);
|
||
|
void ooniprobe_log_info(const char *message);
|
||
|
void ooniprobe_log_warning(const char *message);
|
||
|
void ooniprobe_log_err(const char *message);
|
||
|
void ooniprobe_log_crit(const char *message);
|
||
|
*/
|
||
|
import "C"
|
||
|
|
||
|
// Default is the handler that emits logs with syslog
|
||
|
var Default log.Handler = newhandler()
|
||
|
|
||
|
type handler struct{}
|
||
|
|
||
|
func newhandler() handler {
|
||
|
C.ooniprobe_openlog()
|
||
|
return handler{}
|
||
|
}
|
||
|
|
||
|
func (h handler) HandleLog(e *log.Entry) error {
|
||
|
message := fmt.Sprintf("%s %+v", e.Message, e.Fields)
|
||
|
cstr := C.CString(message)
|
||
|
defer C.free(unsafe.Pointer(cstr))
|
||
|
switch e.Level {
|
||
|
case log.DebugLevel:
|
||
|
C.ooniprobe_log_debug(cstr)
|
||
|
case log.InfoLevel:
|
||
|
C.ooniprobe_log_info(cstr)
|
||
|
case log.WarnLevel:
|
||
|
C.ooniprobe_log_warning(cstr)
|
||
|
case log.ErrorLevel:
|
||
|
C.ooniprobe_log_err(cstr)
|
||
|
default:
|
||
|
C.ooniprobe_log_crit(cstr)
|
||
|
}
|
||
|
return nil
|
||
|
}
|