feat: implement syslog logging (#181)

* feat: implement syslog logging

With this functionality in tree, macOS users could easily access
ooniprobe logs by filtering by process name in the console app.

Part of https://github.com/ooni/probe/issues/1289

* fix: build on windows

* fix: all build issues
This commit is contained in:
Simone Basso 2020-12-01 13:31:15 +01:00 committed by GitHub
commit 2381c50dc5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 112 additions and 7 deletions

View file

@ -0,0 +1,39 @@
#ifndef _WIN32
#include <syslog.h>
#endif
void ooniprobe_openlog(void) {
#ifndef _WIN32
(void)openlog("ooniprobe", LOG_PID, LOG_USER);
#endif
}
void ooniprobe_log_debug(const char *message) {
#ifndef _WIN32
(void)syslog(LOG_DEBUG, "%s", message);
#endif
}
void ooniprobe_log_info(const char *message) {
#ifndef _WIN32
(void)syslog(LOG_INFO, "%s", message);
#endif
}
void ooniprobe_log_warning(const char *message) {
#ifndef _WIN32
(void)syslog(LOG_WARNING, "%s", message);
#endif
}
void ooniprobe_log_err(const char *message) {
#ifndef _WIN32
(void)syslog(LOG_ERR, "%s", message);
#endif
}
void ooniprobe_log_crit(const char *message) {
#ifndef _WIN32
(void)syslog(LOG_CRIT, "%s", message);
#endif
}

View file

@ -0,0 +1,53 @@
// 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
}