1 | package dmg.cells.nucleus; |
2 | |
3 | import java.util.Iterator; |
4 | import java.util.List; |
5 | import java.util.ArrayList; |
6 | import java.util.Formatter; |
7 | import java.util.Collection; |
8 | import java.util.Collections; |
9 | import java.util.Comparator; |
10 | import java.util.Map; |
11 | import java.util.HashMap; |
12 | |
13 | import ch.qos.logback.classic.Level; |
14 | import ch.qos.logback.classic.Logger; |
15 | import ch.qos.logback.classic.LoggerContext; |
16 | import ch.qos.logback.core.Appender; |
17 | import ch.qos.logback.classic.spi.ILoggingEvent; |
18 | |
19 | import org.slf4j.LoggerFactory; |
20 | |
21 | import dmg.util.Args; |
22 | |
23 | public class LogbackShell |
24 | { |
25 | private LoggerContext _context; |
26 | |
27 | public LogbackShell() |
28 | { |
29 | _context = (LoggerContext) LoggerFactory.getILoggerFactory(); |
30 | } |
31 | |
32 | private Logger getLogger(String name) |
33 | { |
34 | return name.equals("root") |
35 | ? _context.getLogger(Logger.ROOT_LOGGER_NAME) |
36 | : _context.getLogger(name); |
37 | } |
38 | |
39 | private List<Logger> getLoggers() |
40 | { |
41 | return _context.getLoggerList(); |
42 | } |
43 | |
44 | private Map<String,Appender<ILoggingEvent>> getAppenders() |
45 | { |
46 | Map<String,Appender<ILoggingEvent>> appenders = |
47 | new HashMap<String,Appender<ILoggingEvent>>(); |
48 | for (Logger logger: getLoggers()) { |
49 | Iterator<Appender<ILoggingEvent>> i = logger.iteratorForAppenders(); |
50 | while (i.hasNext()) { |
51 | Appender<ILoggingEvent> appender = i.next(); |
52 | appenders.put(appender.getName(), appender); |
53 | } |
54 | } |
55 | return appenders; |
56 | } |
57 | |
58 | private List<Appender<ILoggingEvent>> getAppenders(Logger logger) |
59 | { |
60 | Iterator<Appender<ILoggingEvent>> appenders = |
61 | logger.iteratorForAppenders(); |
62 | List<Appender<ILoggingEvent>> result = |
63 | new ArrayList<Appender<ILoggingEvent>>(); |
64 | while (appenders.hasNext()) { |
65 | result.add(appenders.next()); |
66 | } |
67 | return result; |
68 | } |
69 | |
70 | private List<String> getNames(List<Appender<ILoggingEvent>> appenders) |
71 | { |
72 | List<String> result = new ArrayList<String>(appenders.size()); |
73 | for (Appender<ILoggingEvent> appender: appenders) { |
74 | result.add(appender.getName()); |
75 | } |
76 | return result; |
77 | } |
78 | |
79 | private String toString(Level level) |
80 | { |
81 | return (level == null) ? "" : level.toString(); |
82 | } |
83 | |
84 | public final static String hh_log_logger_ls = "[-a]"; |
85 | public final static String fh_log_logger_ls = |
86 | "Lists logger instances. Loggers that inherit all properties are\n" + |
87 | "not listed unless the -a option is specified."; |
88 | public String ac_log_logger_ls(Args args) |
89 | { |
90 | final String format = "%-5s %-30s %s\n"; |
91 | |
92 | boolean all = (args.getOpt("a") != null); |
93 | Formatter f = new Formatter(); |
94 | f.format(format, "Level", "Appenders", "Logger"); |
95 | f.format(format, "-----", "---------", "------"); |
96 | for (Logger logger: getLoggers()) { |
97 | List<Appender<ILoggingEvent>> appenders = getAppenders(logger); |
98 | boolean hasAppenders = !appenders.isEmpty(); |
99 | boolean isEndOfRoad = !logger.isAdditive(); |
100 | boolean hasLevel = (logger.getLevel() != null); |
101 | boolean isRoot = (logger.getName().equals(Logger.ROOT_LOGGER_NAME)); |
102 | if (all || hasAppenders || isEndOfRoad || hasLevel || isRoot) { |
103 | f.format(format, |
104 | toString(logger.getLevel()), |
105 | getNames(appenders), |
106 | logger.getName()); |
107 | } |
108 | } |
109 | return f.toString(); |
110 | } |
111 | |
112 | public final static String hh_log_logger_set = |
113 | "<logger> OFF|ERROR|WARN|INFO|DEBUG|TRACE|ALL"; |
114 | public final static String fh_log_logger_set = |
115 | "Sets log level of <logger>. Notice that the preferred method to\n" + |
116 | "adjust log levels in dCache is to manipulate the appender log\n" + |
117 | "levels through the 'log set' and 'log reset' commands."; |
118 | public String ac_log_logger_set_$_2(Args args) |
119 | { |
120 | String name = args.argv(0); |
121 | Level level = Level.valueOf(args.argv(1)); |
122 | Logger logger = getLogger(name); |
123 | if (logger == null) { |
124 | throw new IllegalArgumentException("Logger not found: " + name); |
125 | } |
126 | |
127 | logger.setLevel(level); |
128 | return "Log level of " + name + " set to " + level; |
129 | } |
130 | |
131 | public final static String hh_log_logger_reset = |
132 | "<logger>"; |
133 | public final static String fh_log_logger_reset = |
134 | "Resets the log level of <logger>. The effective log level will be\n" + |
135 | "inherited from the parent logger. Notice that the preferred method\n" + |
136 | "to adjust log levels in dCache is to manipulate the appender log\n" + |
137 | "levels through the 'log set' and 'log reset' commands."; |
138 | public String ac_log_logger_reset_$_1(Args args) |
139 | { |
140 | String name = args.argv(0); |
141 | Logger logger = getLogger(name); |
142 | if (logger == null) { |
143 | throw new IllegalArgumentException("Logger not found: " + name); |
144 | } |
145 | |
146 | logger.setLevel(null); |
147 | return "Log level of " + name + " was reset"; |
148 | } |
149 | |
150 | public final static String hh_log_attach = |
151 | "<logger> <appender>"; |
152 | public final static String fh_log_attach = |
153 | "Attach <logger> to output module <appender>."; |
154 | public String ac_log_attach_$_2(Args args) |
155 | { |
156 | String name = args.argv(0); |
157 | String appender = args.argv(1); |
158 | Logger logger = getLogger(name); |
159 | if (logger == null) { |
160 | throw new IllegalArgumentException("Logger not found: " + name); |
161 | } |
162 | |
163 | Appender<ILoggingEvent> app = getAppenders().get(appender); |
164 | if (app == null) { |
165 | throw new IllegalArgumentException("Appender not found: " + appender); |
166 | } |
167 | |
168 | logger.addAppender(app); |
169 | |
170 | return name + " attached to " + appender; |
171 | } |
172 | |
173 | public final static String hh_log_detach = |
174 | "<logger> <appender>"; |
175 | public final static String fh_log_detach = |
176 | "Detach <logger> from output module <appender>."; |
177 | public String ac_log_detach_$_2(Args args) |
178 | { |
179 | String name = args.argv(0); |
180 | String appender = args.argv(1); |
181 | Logger logger = getLogger(name); |
182 | if (logger == null) { |
183 | throw new IllegalArgumentException("Logger not found: " + name); |
184 | } |
185 | |
186 | logger.detachAppender(appender); |
187 | |
188 | return name + " detached from " + appender; |
189 | } |
190 | } |