blob: 88b297d12f263dcf1684f31b624cffb8c4dc1f29 [file] [log] [blame]
;; Licensed to the Apache Software Foundation (ASF) under one
;; or more contributor license agreements. See the NOTICE file
;; distributed with this work for additional information
;; regarding copyright ownership. The ASF licenses this file
;; to you under the Apache License, Version 2.0 (the
;; "License"); you may not use this file except in compliance
;; with the License. You may obtain a copy of the License at
;;
;; http://www.apache.org/licenses/LICENSE-2.0
;;
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.
(ns backtype.storm.command.set-log-level
(:use [clojure.tools.cli :only [cli]])
(:use [backtype.storm thrift log])
(:import [org.apache.logging.log4j Level])
(:import [backtype.storm.generated LogConfig LogLevel LogLevelAction])
(:gen-class))
(defn- get-storm-id
"Get topology id for a running topology from the topology name."
[nimbus name]
(let [info (.getClusterInfo nimbus)
topologies (.get_topologies info)
topology (first (filter (fn [topo] (= name (.get_name topo))) topologies))]
(if topology
(.get_id topology)
(throw (.IllegalArgumentException (str name " is not a running topology"))))))
(defn- parse-named-log-levels [action]
"Parses [logger name]=[level string]:[optional timeout],[logger name2]...
e.g. ROOT=DEBUG:30
root logger, debug for 30 seconds
org.apache.foo=WARN
org.apache.foo set to WARN indefinitely"
(fn [^String s]
(let [log-args (re-find #"(.*)=([A-Z]+):?(\d*)" s)
name (if (= action LogLevelAction/REMOVE) s (nth log-args 1))
level (Level/toLevel (nth log-args 2))
timeout-str (nth log-args 3)
log-level (LogLevel.)]
(if (= action LogLevelAction/REMOVE)
(.set_action log-level action)
(do
(.set_action log-level action)
(.set_target_log_level log-level (.toString level))
(.set_reset_log_level_timeout_secs log-level
(Integer. (if (= timeout-str "") "0" timeout-str)))))
{name log-level})))
(defn- merge-together [previous key val]
(assoc previous key
(if-let [oldval (get previous key)]
(merge oldval val)
val)))
(defn -main [& args]
(let [[{log-setting :log-setting remove-log-setting :remove-log-setting} [name] _]
(cli args ["-l" "--log-setting"
:parse-fn (parse-named-log-levels LogLevelAction/UPDATE)
:assoc-fn merge-together]
["-r" "--remove-log-setting"
:parse-fn (parse-named-log-levels LogLevelAction/REMOVE)
:assoc-fn merge-together])
log-config (LogConfig.)]
(doseq [[log-name log-val] (merge log-setting remove-log-setting)]
(.put_to_named_logger_level log-config log-name log-val))
(log-message "Sent log config " log-config " for topology " name)
(with-configured-nimbus-connection nimbus
(.setLogConfig nimbus (get-storm-id nimbus name) log-config))))