001
014
015 package com.liferay.util.log4j;
016
017 import com.liferay.portal.kernel.io.unsync.UnsyncByteArrayOutputStream;
018 import com.liferay.portal.kernel.log.LogFactory;
019 import com.liferay.portal.kernel.log.LogFactoryUtil;
020 import com.liferay.portal.kernel.util.PropsKeys;
021 import com.liferay.portal.kernel.util.PropsUtil;
022 import com.liferay.portal.kernel.util.ServerDetector;
023 import com.liferay.portal.kernel.util.StreamUtil;
024 import com.liferay.portal.kernel.util.StringPool;
025 import com.liferay.portal.kernel.util.StringUtil;
026
027 import java.io.IOException;
028 import java.io.InputStream;
029 import java.io.Reader;
030 import java.io.StringReader;
031
032 import java.net.URL;
033
034 import java.util.Enumeration;
035 import java.util.HashMap;
036 import java.util.HashSet;
037 import java.util.List;
038 import java.util.Map;
039 import java.util.Set;
040 import java.util.concurrent.ConcurrentHashMap;
041
042 import org.apache.log4j.Appender;
043 import org.apache.log4j.Level;
044 import org.apache.log4j.LogManager;
045 import org.apache.log4j.Logger;
046 import org.apache.log4j.WriterAppender;
047 import org.apache.log4j.xml.DOMConfigurator;
048
049 import org.dom4j.Document;
050 import org.dom4j.Element;
051 import org.dom4j.io.SAXReader;
052
053
057 public class Log4JUtil {
058
059 public static void configureLog4J(ClassLoader classLoader) {
060 configureLog4J(classLoader.getResource("META-INF/portal-log4j.xml"));
061
062 try {
063 Enumeration<URL> enu = classLoader.getResources(
064 "META-INF/portal-log4j-ext.xml");
065
066 while (enu.hasMoreElements()) {
067 configureLog4J(enu.nextElement());
068 }
069 }
070 catch (IOException ioe) {
071 java.util.logging.Logger logger =
072 java.util.logging.Logger.getLogger(Log4JUtil.class.getName());
073
074 logger.log(
075 java.util.logging.Level.WARNING,
076 "Unable to load portal-log4j-ext.xml", ioe);
077 }
078
079 if (ServerDetector.isJBoss5()) {
080 Logger rootLogger = LogManager.getRootLogger();
081
082 Enumeration<Appender> enu = rootLogger.getAllAppenders();
083
084 while (enu.hasMoreElements()) {
085 Appender appender = enu.nextElement();
086
087 if (appender instanceof WriterAppender) {
088 WriterAppender writerAppender = (WriterAppender)appender;
089
090 writerAppender.activateOptions();
091 }
092 }
093 }
094 }
095
096 public static void configureLog4J(URL url) {
097 if (url == null) {
098 return;
099 }
100
101 String urlContent = _getURLContent(url);
102
103 if (urlContent == null) {
104 return;
105 }
106
107
108
109 DOMConfigurator domConfigurator = new DOMConfigurator();
110
111 Reader urlReader = new StringReader(urlContent);
112
113 domConfigurator.doConfigure(
114 urlReader, LogManager.getLoggerRepository());
115
116 Set<String> currentLoggerNames = new HashSet<String>();
117
118 Enumeration<Logger> enu = LogManager.getCurrentLoggers();
119
120 while (enu.hasMoreElements()) {
121 Logger logger = enu.nextElement();
122
123 currentLoggerNames.add(logger.getName());
124 }
125
126 try {
127 SAXReader saxReader = new SAXReader();
128
129 Reader reader = new StringReader(urlContent);
130
131 Document document = saxReader.read(reader, url.toExternalForm());
132
133 Element rootElement = document.getRootElement();
134
135 List<Element> categoryElements = rootElement.elements("category");
136
137 for (Element categoryElement : categoryElements) {
138 String name = categoryElement.attributeValue("name");
139
140 Element priorityElement = categoryElement.element("priority");
141
142 String priority = priorityElement.attributeValue("value");
143
144 setLevel(name, priority, false);
145 }
146 }
147 catch (Exception e) {
148 e.printStackTrace();
149 }
150 }
151
152 public static Map<String, String> getCustomLogSettings() {
153 return new HashMap<String, String>(_customLogSettings);
154 }
155
156 public static String getOriginalLevel(String className) {
157 Level level = Level.ALL;
158
159 Enumeration<Logger> enu = LogManager.getCurrentLoggers();
160
161 while (enu.hasMoreElements()) {
162 Logger logger = enu.nextElement();
163
164 if (className.equals(logger.getName())) {
165 level = logger.getLevel();
166
167 break;
168 }
169 }
170
171 return level.toString();
172 }
173
174 public static void initLog4J(
175 String serverId, String liferayHome, ClassLoader classLoader,
176 LogFactory logFactory, Map<String, String> customLogSettings) {
177
178 System.setProperty(
179 ServerDetector.SYSTEM_PROPERTY_KEY_SERVER_DETECTOR_SERVER_ID,
180 serverId);
181
182 _liferayHome = liferayHome;
183
184 configureLog4J(classLoader);
185
186 try {
187 LogFactoryUtil.setLogFactory(logFactory);
188 }
189 catch (Exception e) {
190 e.printStackTrace();
191 }
192
193 for (String name : customLogSettings.keySet()) {
194 String priority = customLogSettings.get(name);
195
196 setLevel(name, priority, false);
197 }
198 }
199
200 public static void setLevel(String name, String priority, boolean custom) {
201 Logger logger = Logger.getLogger(name);
202
203 logger.setLevel(Level.toLevel(priority));
204
205 java.util.logging.Logger jdkLogger = java.util.logging.Logger.getLogger(
206 name);
207
208 jdkLogger.setLevel(_getJdkLevel(priority));
209
210 if (custom) {
211 _customLogSettings.put(name, priority);
212 }
213 }
214
215
219 private static byte[] _getBytes(InputStream inputStream)
220 throws IOException {
221
222 UnsyncByteArrayOutputStream unsyncByteArrayOutputStream =
223 new UnsyncByteArrayOutputStream();
224
225 StreamUtil.transfer(inputStream, unsyncByteArrayOutputStream, -1, true);
226
227 return unsyncByteArrayOutputStream.toByteArray();
228 }
229
230 private static java.util.logging.Level _getJdkLevel(String priority) {
231 if (StringUtil.equalsIgnoreCase(priority, Level.DEBUG.toString())) {
232 return java.util.logging.Level.FINE;
233 }
234 else if (StringUtil.equalsIgnoreCase(
235 priority, Level.ERROR.toString())) {
236
237 return java.util.logging.Level.SEVERE;
238 }
239 else if (StringUtil.equalsIgnoreCase(priority, Level.WARN.toString())) {
240 return java.util.logging.Level.WARNING;
241 }
242 else {
243 return java.util.logging.Level.INFO;
244 }
245 }
246
247 private static String _getLiferayHome() {
248 if (_liferayHome == null) {
249 _liferayHome = PropsUtil.get(PropsKeys.LIFERAY_HOME);
250 }
251
252 return _liferayHome;
253 }
254
255 private static String _getURLContent(URL url) {
256 Map<String, String> variables = new HashMap<String, String>();
257
258 variables.put("@liferay.home@", _getLiferayHome());
259
260 String spiId = System.getProperty("spi.id");
261
262 if (spiId == null) {
263 spiId = StringPool.BLANK;
264 }
265
266 variables.put("@spi.id@", spiId);
267
268 String urlContent = null;
269
270 InputStream inputStream = null;
271
272 try {
273 inputStream = url.openStream();
274
275 byte[] bytes = _getBytes(inputStream);
276
277 urlContent = new String(bytes, StringPool.UTF8);
278 }
279 catch (Exception e) {
280 e.printStackTrace();
281
282 return null;
283 }
284 finally {
285 StreamUtil.cleanUp(inputStream);
286 }
287
288 for (Map.Entry<String, String> variable : variables.entrySet()) {
289 urlContent = StringUtil.replace(
290 urlContent, variable.getKey(), variable.getValue());
291 }
292
293 if (ServerDetector.getServerId() != null) {
294 return urlContent;
295 }
296
297 int x = urlContent.indexOf("<appender name=\"FILE\"");
298
299 int y = urlContent.indexOf("</appender>", x);
300
301 if (y != -1) {
302 y = urlContent.indexOf("<", y + 1);
303 }
304
305 if ((x != -1) && (y != -1)) {
306 urlContent = urlContent.substring(0, x) + urlContent.substring(y);
307 }
308
309 urlContent = StringUtil.replace(
310 urlContent, "<appender-ref ref=\"FILE\" />", StringPool.BLANK);
311
312 return urlContent;
313 }
314
315 private static Map<String, String> _customLogSettings =
316 new ConcurrentHashMap<String, String>();
317 private static String _liferayHome;
318
319 }