/******************************************************************************* * Copyright (c) 2006, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.osgi.internal.log; import java.io.File; import java.io.Writer; import java.util.Dictionary; import java.util.Hashtable; import org.eclipse.core.runtime.adaptor.EclipseStarter; import org.eclipse.osgi.framework.log.FrameworkLog; import org.eclipse.osgi.framework.log.FrameworkLogEntry; import org.eclipse.osgi.internal.framework.EquinoxConfiguration; import org.eclipse.osgi.service.datalocation.Location; import org.eclipse.osgi.storage.StorageUtil; import org.osgi.framework.*; public class EquinoxLogServices { static final String EQUINOX_LOGGER_NAME = "org.eclipse.equinox.logger"; //$NON-NLS-1$ static final String PERF_LOGGER_NAME = "org.eclipse.performance.logger"; //$NON-NLS-1$ private static final String PROP_LOG_ENABLED = "eclipse.log.enabled"; //$NON-NLS-1$ // The eclipse log file extension */ private static final String LOG_EXT = ".log"; //$NON-NLS-1$ private final LogServiceManager logServiceManager; private final EquinoxLogFactory eclipseLogFactory; private final EquinoxLogWriter logWriter; private final EquinoxLogWriter perfWriter; private final FrameworkLog rootFrameworkLog; public EquinoxLogServices(EquinoxConfiguration environmentInfo) { Location configuration = environmentInfo.getEquinoxLocations().getConfigurationLocation(); String logFilePath = environmentInfo.getConfiguration(EclipseStarter.PROP_LOGFILE); if (logFilePath == null) { logFilePath = Long.toString(System.currentTimeMillis()) + EquinoxLogServices.LOG_EXT; } File logFile = new File(logFilePath); if (!logFile.isAbsolute()) { File configAreaDirectory = null; if (configuration != null) // TODO assumes the URL is a file: url configAreaDirectory = new File(configuration.getURL().getPath()); if (configAreaDirectory != null) { logFile = new File(configAreaDirectory, logFilePath); } else { logFile = null; } } boolean enabled = "true".equals(environmentInfo.getConfiguration(PROP_LOG_ENABLED, "true")); //$NON-NLS-1$ //$NON-NLS-2$ if (logFile != null) { environmentInfo.setConfiguration(EclipseStarter.PROP_LOGFILE, logFile.getAbsolutePath()); logWriter = new EquinoxLogWriter(logFile, EQUINOX_LOGGER_NAME, enabled, environmentInfo); File perfLogFile = new File(logFile.getParentFile(), "performance.log"); //$NON-NLS-1$ perfWriter = new EquinoxLogWriter(perfLogFile, PERF_LOGGER_NAME, true, environmentInfo); } else { logWriter = new EquinoxLogWriter((Writer) null, EQUINOX_LOGGER_NAME, enabled, environmentInfo); perfWriter = new EquinoxLogWriter((Writer) null, PERF_LOGGER_NAME, true, environmentInfo); } if ("true".equals(environmentInfo.getConfiguration(EclipseStarter.PROP_CONSOLE_LOG))) //$NON-NLS-1$ logWriter.setConsoleLog(true); String logHistoryMaxProp = environmentInfo.getConfiguration(EquinoxConfiguration.PROP_LOG_HISTORY_MAX); int logHistoryMax = 0; if (logHistoryMaxProp != null) { try { logHistoryMax = Integer.parseInt(logHistoryMaxProp); } catch (NumberFormatException e) { // ignore and use 0 } } logServiceManager = new LogServiceManager(logHistoryMax, logWriter, perfWriter); eclipseLogFactory = new EquinoxLogFactory(logWriter, logServiceManager); rootFrameworkLog = eclipseLogFactory.createFrameworkLog(null, logWriter); } private ServiceRegistration<?> frameworkLogReg; private ServiceRegistration<?> perfLogReg; /** * @throws BundleException */ public void start(BundleContext context) throws BundleException { logServiceManager.start(context); frameworkLogReg = StorageUtil.register(FrameworkLog.class.getName(), eclipseLogFactory, context); perfLogReg = registerPerformanceLog(context); } /** * @throws BundleException */ public void stop(BundleContext context) throws BundleException { frameworkLogReg.unregister(); perfLogReg.unregister(); logServiceManager.stop(context); } public FrameworkLog getFrameworkLog() { return rootFrameworkLog; } private ServiceRegistration<?> registerPerformanceLog(BundleContext context) { Object service = createPerformanceLog(context.getBundle()); String serviceName = FrameworkLog.class.getName(); Dictionary<String, Object> serviceProperties = new Hashtable<>(7); Dictionary<String, String> headers = context.getBundle().getHeaders(); serviceProperties.put(Constants.SERVICE_VENDOR, headers.get(Constants.BUNDLE_VENDOR)); serviceProperties.put(Constants.SERVICE_RANKING, Integer.valueOf(Integer.MIN_VALUE)); serviceProperties.put(Constants.SERVICE_PID, context.getBundle().getBundleId() + '.' + service.getClass().getName()); serviceProperties.put(FrameworkLog.SERVICE_PERFORMANCE, Boolean.TRUE.toString()); return context.registerService(serviceName, service, serviceProperties); } private FrameworkLog createPerformanceLog(Bundle systemBundle) { return eclipseLogFactory.createFrameworkLog(systemBundle, perfWriter); } public void log(String entry, int severity, String message, Throwable throwable) { log(entry, severity, message, throwable, null); } public void log(String entry, int severity, String message, Throwable throwable, FrameworkLogEntry[] children) { getFrameworkLog().log(new FrameworkLogEntry(entry, severity, 0, message, 0, throwable, children)); } }