What you want is:
But, this will not work 100% of the time, and sometimes you might want alter-var-root.
Here's the trick. *print-level* is a dynamic Var. Alter-var-root only changes the root value of a Var, it can not change a dynamically binded value:
(def ^:dynamic x "I am root!")
x ; => "I am root!"
(binding [x "I am dynamically binded!"] x) ; => "I am dynamically binded!"
(alter-var-root #'x (constantly "I've had my root altered!"))
x ; => "I've had my root altered!"
(binding [x "I am dynamically binded!"] x) ; => "I am dynamically binded!"
So where is *print-level* binded you ask? Well, that depends on how you bootstrapped Clojure. Most of the time, such as when using lein, or clojure.main, those things will wrap your entire code in a binding, and they will bind a certain number of default dynamic var such as *print-level*. You can see the code for clojure.main here:
https://github.com/clojure/clojure/blob/master/src/clj/clojure/main.clj#L76
So in your case, you're probably bootstrapping Clojure using a mechanism that binds *print-level*, thus changing its root has no effect in your code, you have to change its binding, and the function to do that is set!.