diff --git a/Taskfile.yml b/Taskfile.yml
index b7313f4d13319627727838e8df5302c52eefc042..1c9a46effeb030aca31e4a26e5efd6dd1bb82d5f 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -17,6 +17,8 @@ tasks:
     
   test:
     desc: Execute unit tests in Go.
+    env:
+      TEST_BY_TASK: true
     cmds:
       - echo "Execute unit tests in Go."
       - go test -cover -v ./...
@@ -25,6 +27,8 @@ tasks:
 
   test-fuzz:
     desc: Conduct fuzzing tests.#
+    env:
+      TEST_BY_TASK: true
     cmds:  
       - echo "Conduct fuzzing tests."
       - go test -v -fuzztime=30s -fuzz=Fuzz ./...
diff --git a/devenv.nix b/devenv.nix
index 4a6a2525c3cb66b28cf658f2c310ee1c12ab377d..9c0b1eb81a0f3cd9c3ac85a057ac5ac581411f9f 100644
--- a/devenv.nix
+++ b/devenv.nix
@@ -133,8 +133,6 @@ EOF
     #set -euo pipefail
     set -x
     
-    export TEST_BY_TASK=true
-
     PATH="''${PATH}":${pkgs.coreutils}/bin
     PATH="''${PATH}":${pkgs.findutils}/bin
     PATH="''${PATH}":${pkgs.jq}/bin/
@@ -256,6 +254,8 @@ tasks:
     
   test:
     desc: Execute unit tests in Go.
+    env:
+      TEST_BY_TASK: true
     cmds:
       - echo "Execute unit tests in Go."
       - go test -cover -v ./...
@@ -264,6 +264,8 @@ tasks:
 
   test-fuzz:
     desc: Conduct fuzzing tests.#
+    env:
+      TEST_BY_TASK: true
     cmds:  
       - echo "Conduct fuzzing tests."
       - go test -v -fuzztime=30s -fuzz=Fuzz ./...
diff --git a/go.mod b/go.mod
index 4f9576d2a58058f88e8563c1ae8d5265b938e559..453b642b900262b3bcdf1f2b98b3bef15e81ef98 100644
--- a/go.mod
+++ b/go.mod
@@ -40,6 +40,8 @@ require (
 	github.com/tklauser/go-sysconf v0.3.12 // indirect
 	github.com/tklauser/numcpus v0.6.1 // indirect
 	github.com/yusufpapurcu/wmi v1.2.3 // indirect
+	go.uber.org/multierr v1.11.0 // indirect
+	go.uber.org/zap v1.26.0 // indirect
 	golang.org/x/mod v0.8.0 // indirect
 	golang.org/x/net v0.10.0 // indirect
 	golang.org/x/sys v0.13.0 // indirect
diff --git a/go.sum b/go.sum
index 8181d581e3cb81249dffb5aa0dc01d56dd18750a..996f88a55e76433e7690f3b90894f5a5f24de26e 100644
--- a/go.sum
+++ b/go.sum
@@ -80,6 +80,10 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
 github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
+go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
diff --git a/issue-1_test.go b/issue-1_test.go
index 63578ba3c92c512a9c3df3ad2e41ab3992afe084..ce9a16c7818569048c2183b259b7686b949198af 100644
--- a/issue-1_test.go
+++ b/issue-1_test.go
@@ -12,8 +12,7 @@ import (
 func TestRoundTrip(t *testing.T) {
 
 	if os.Getenv("TEST_BY_TASK") != "" {
-		t.Skip("Skipping test because CI_SERVER is set")
-		// TODO: run this test in CI
+		t.Skip("Skipping test because TEST_BY_TASK is set")
 	}
 
 	// type JobImport struct {
diff --git a/logger.go b/logger.go
new file mode 100644
index 0000000000000000000000000000000000000000..46e253a97efec361ccb9f148eecf440f89b46c34
--- /dev/null
+++ b/logger.go
@@ -0,0 +1,20 @@
+package jobqueue
+
+import "go.uber.org/zap"
+
+type Logger interface {
+	Info(msg string, keysAndValues ...interface{})
+	Error(msg string, keysAndValues ...interface{})
+}
+
+type ZapAdapter struct {
+	logger *zap.Logger
+}
+
+func (z *ZapAdapter) Info(msg string, keysAndValues ...interface{}) {
+	z.logger.Info(msg, zap.Any("info", keysAndValues))
+}
+
+func (z *ZapAdapter) Error(msg string, keysAndValues ...interface{}) {
+	z.logger.Error(msg, zap.Any("error", keysAndValues))
+}
diff --git a/manager.go b/manager.go
index 3edc059d05a7b7dd77aa77bf2eedc12fbd9a4680..7771d2eb3589423d054e30017da27375c05fccb0 100644
--- a/manager.go
+++ b/manager.go
@@ -26,6 +26,7 @@ type Manager struct {
 	stateManager StateManager
 
 	cronInstance *cron.Cron
+	logger       Logger
 
 	mu sync.Mutex
 }
@@ -212,7 +213,7 @@ func (m *Manager) Stop() error {
 
 	m.eventBus.Unsubscribe(QueueJob, m.jobEventCh)
 	m.eventBus.Unsubscribe(JobReady, m.jobEventCh)
-	
+
 	close(m.jobEventCh)
 
 	var wrappedErr error
@@ -247,6 +248,10 @@ func (m *Manager) Stop() error {
 	return wrappedErr
 }
 
+func (m *Manager) SetLogger(logger Logger) {
+	m.logger = logger
+}
+
 func (m *Manager) handleJobEvents() {
 
 	for event := range m.jobEventCh {
diff --git a/scheduler_test.go b/scheduler_test.go
index 9b6da3fbab43dd85c86453451fb57aa564c703f9..c2ce7f5052952809f95d601ceffa2f4693354a20 100644
--- a/scheduler_test.go
+++ b/scheduler_test.go
@@ -82,10 +82,16 @@ func TestCronScheduler_BasicFunctionality(t *testing.T) {
 	eventBus := NewEventBus()
 
 	job := NewJob[DummyResult]("test-job", &DummyRunnable{})
+	c := cron.New(cron.WithSeconds())
 
 	genericJob := GenericJob(job)
-	cronScheduler := CronScheduler{cron: cron.New(cron.WithSeconds()), Spec: "*/1 * * * * *"}
+	cronScheduler := CronScheduler{
+		cron: c,
+		Spec: "* * * * * *",
+	}
 	_ = cronScheduler.Schedule(genericJob, eventBus)
+	c.Start()
+	defer c.Stop()
 
 	jobChannel := make(chan interface{})
 
@@ -109,20 +115,20 @@ func TestCronScheduler_StopScheduler(t *testing.T) {
 
 	c := cron.New(cron.WithSeconds())
 
-	cronScheduler := CronScheduler{cron: c, Spec: "*/1 * * * * *"}
+	cronScheduler := CronScheduler{cron: c, Spec: "* * * * * *"}
 
 	job := NewJob[DummyResult]("test-job", &DummyRunnable{})
 
 	genericJob := GenericJob(job)
 	_ = cronScheduler.Schedule(genericJob, eventBus)
+	c.Start()
+	defer c.Stop()
 
 	jobChannel := make(chan interface{})
 
 	go func() {
 		for _ = range jobChannel {
-
 			atomic.AddInt32(&count, 1)
-
 		}
 	}()