diff --git a/ChangeLog.md b/ChangeLog.md
index 1a1d19a0..44185f5d 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,8 +1,12 @@
+# v2.5.22
+IMPROVEMENTS
+- redirect logs into stderr instead of stdout, fix [969](https://github.com/Altinity/clickhouse-backup/issues/969)
+
 # v2.5.21
 IMPROVEMENTS
 - switch from `docker-compose` (python) to `docker compose` (golang)
 - add parallel integration test execution fix [888](https://github.com/Altinity/clickhouse-backup/issues/888)
-- 
+ 
 BUG FIXES
 - properly handle log_pointer=1 corner case for `check_replica_before_attach: true`, fix [967](https://github.com/Altinity/clickhouse-backup/issues/967)
 - properly handle empty output for `list` command when `remote_storage: custom`, fix [963](https://github.com/Altinity/clickhouse-backup/issues/963), thanks @straysh
diff --git a/cmd/clickhouse-backup/main.go b/cmd/clickhouse-backup/main.go
index ecce7b4d..9c83f9b8 100644
--- a/cmd/clickhouse-backup/main.go
+++ b/cmd/clickhouse-backup/main.go
@@ -23,7 +23,7 @@ var (
 )
 
 func main() {
-	log.SetHandler(logcli.New(os.Stdout))
+	log.SetHandler(logcli.New(os.Stderr))
 	cliapp := cli.NewApp()
 	cliapp.Name = "clickhouse-backup"
 	cliapp.Usage = "Tool for easy backup of ClickHouse with cloud support"
diff --git a/test/integration/integration_test.go b/test/integration/integration_test.go
index 356fcf58..1d37788b 100644
--- a/test/integration/integration_test.go
+++ b/test/integration/integration_test.go
@@ -42,7 +42,7 @@ var dockerPool *pool.ObjectPool
 
 // setup log level
 func init() {
-	log.SetHandler(logcli.New(os.Stdout))
+	log.SetHandler(logcli.New(os.Stderr))
 	logLevel := "info"
 	if os.Getenv("LOG_LEVEL") != "" && os.Getenv("LOG_LEVEL") != "info" {
 		logLevel = os.Getenv("LOG_LEVEL")