/** * Copyright (c) 2005-2013 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on 12/06/2005 */ package org.python.pydev.core.log; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.PrintStream; import java.util.HashMap; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.IOConsoleOutputStream; import org.eclipse.ui.console.MessageConsole; import org.python.pydev.core.CorePlugin; import org.python.pydev.core.FullRepIterable; import org.python.pydev.shared_core.io.FileUtils; import org.python.pydev.shared_ui.ConsoleColorCache; import org.python.pydev.shared_ui.utils.RunInUiThread; /** * @author Fabio */ public class Log { /** * Console used to log contents */ private static MessageConsole fConsole; private static IOConsoleOutputStream fOutputStream; /** * @param errorLevel IStatus.[OK|INFO|WARNING|ERROR] * @return CoreException that can be thrown for the given log event */ public static CoreException log(int errorLevel, String message, Throwable e) { return org.python.pydev.shared_core.log.Log.log(errorLevel, message, e); } public static CoreException log(Throwable e) { return log(IStatus.ERROR, e.getMessage() != null ? e.getMessage() : "No message gotten (null message).", e); } public static CoreException log(String msg) { return log(IStatus.ERROR, msg, new RuntimeException(msg)); } public static CoreException log(String msg, Throwable e) { return log(IStatus.ERROR, msg, e); } public static CoreException logInfo(Throwable e) { return log(IStatus.INFO, e.getMessage(), e); } public static CoreException logInfo(String msg) { return log(IStatus.INFO, msg, new RuntimeException(msg)); } public static CoreException logWarn(String msg) { return log(IStatus.WARNING, msg, new RuntimeException(msg)); } public static CoreException logInfo(String msg, Throwable e) { return log(IStatus.INFO, msg, e); } //------------ Log that writes to a new console private final static Object lock = new Object(); private final static StringBuffer logIndent = new StringBuffer(); public static void toLogFile(Object obj, String string) { synchronized (lock) { if (obj == null) { obj = new Object(); } Class<? extends Object> class1 = obj.getClass(); toLogFile(string, class1); } } public static void toLogFile(String string, Class<? extends Object> class1) { StringBuffer buffer = new StringBuffer(); buffer.append(logIndent); buffer.append(FullRepIterable.getLastPart(class1.getName())); buffer.append(": "); buffer.append(string); toLogFile(buffer.toString()); } public static String getLogOutputFile() { try { CorePlugin default1 = CorePlugin.getDefault(); if (default1 != null) { IPath stateLocation = default1.getStateLocation().append("PyDevLog.log"); return stateLocation.toOSString(); } } catch (Exception e) { Log.log(e); } return null; } private static boolean firstCall = true; private static void toLogFile(final String buffer) { final Runnable r = new Runnable() { @Override public void run() { synchronized (lock) { try { //Print to console view (must be in UI thread). IOConsoleOutputStream c = getConsoleOutputStream(); c.write(buffer.toString()); c.write(System.lineSeparator()); } catch (Throwable e) { log(e); } } } }; String file = getLogOutputFile(); synchronized (lock) { //Always print to stdout System.out.println(buffer); if (file == null) { return; } if (firstCall) { //On the first call, remove the file if it's already big (just so that we don't grow it indefinitely). try { File f = new File(file); if (f.length() > 1024 * 1024) { //1MB file: delete f.delete(); } } catch (Exception e) { Log.log(e); } finally { firstCall = false; } } //Print to file we can see later on even if not on the UI thread. FileUtils.appendStrToFile(buffer + System.lineSeparator(), file); } RunInUiThread.async(r, true); } private static IOConsoleOutputStream getConsoleOutputStream() { if (fConsole == null) { fConsole = new MessageConsole("PyDev Logging", CorePlugin.getImageCache().getDescriptor( "icons/python_logging.png")); fOutputStream = fConsole.newOutputStream(); HashMap<IOConsoleOutputStream, String> themeConsoleStreamToColor = new HashMap<IOConsoleOutputStream, String>(); themeConsoleStreamToColor.put(fOutputStream, "console.output"); fConsole.setAttribute("themeConsoleStreamToColor", themeConsoleStreamToColor); ConsoleColorCache.getDefault().keepConsoleColorsSynched(fConsole); ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { fConsole }); } return fOutputStream; } public static void toLogFile(Exception e) { String msg = getExceptionStr(e); toLogFile(msg); } public static String getExceptionStr(Exception e) { final ByteArrayOutputStream str = new ByteArrayOutputStream(); final PrintStream prnt = new PrintStream(str); e.printStackTrace(prnt); prnt.flush(); String msg = new String(str.toByteArray()); return msg; } public static void addLogLevel() { synchronized (lock) { logIndent.append(" "); } } public static void remLogLevel() { synchronized (lock) { if (logIndent.length() > 3) { logIndent.delete(0, 4); } } } }