    001    /*
    002     * Licensed to the Apache Software Foundation (ASF) under one or more
    003     * contributor license agreements. See the NOTICE file distributed with
    004     * this work for additional information regarding copyright ownership.
    005     * The ASF licenses this file to You under the Apache license, Version 2.0
    006     * (the "License"); you may not use this file except in compliance with
    007     * the License. You may obtain a copy of the License at
    008     *
    009     *      http://www.apache.org/licenses/LICENSE-2.0
    010     *
    011     * Unless required by applicable law or agreed to in writing, software
    012     * distributed under the License is distributed on an "AS IS" BASIS,
    013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014     * See the license for the specific language governing permissions and
    015     * limitations under the license.
    016     */
    017    package org.apache.logging.log4j.core.lookup;
    018
    019    import java.util.Locale;
    020
    021    import org.apache.logging.log4j.core.LogEvent;
    022    import org.apache.logging.log4j.core.config.plugins.Plugin;
    023    import org.apache.logging.log4j.util.Strings;
    024
    025    /**
    026     * Looks up keys related to Java: Java version, JRE version, VM version, and so on.
    027     */
    028    @Plugin(name = "java", category = StrLookup.CATEGORY)
    029    public class JavaLookup extends AbstractLookup {
    030
    031        private final SystemPropertiesLookup spLookup = new SystemPropertiesLookup();
    032
    033        /**
    034         * Accessible through the Lookup key {@code hw}.
    035         * @return hardware processor information.
    036         */
    037        public String getHardware() {
    038            return "processors: " + Runtime.getRuntime().availableProcessors() + ", architecture: "
    039                    + getSystemProperty("os.arch") + this.getSystemProperty("-", "sun.arch.data.model")
    040                    + this.getSystemProperty(", instruction sets: ", "sun.cpu.isalist");
    041        }
    042
    043        /**
    044         * Accessible through the Lookup key {@code locale}.
    045         * @return system locale and file encoding information.
    046         */
    047        public String getLocale() {
    048            return "default locale: " + Locale.getDefault() + ", platform encoding: " + getSystemProperty("file.encoding");
    049        }
    050
    051        /**
    052         * Accessible through the Lookup key {@code os}.
    053         * @return operating system information.
    054         */
    055        public String getOperatingSystem() {
    056            return getSystemProperty("os.name") + " " + getSystemProperty("os.version")
    057                    + getSystemProperty(" ", "sun.os.patch.level") + ", architecture: " + getSystemProperty("os.arch")
    058                    + getSystemProperty("-", "sun.arch.data.model");
    059        }
    060
    061        /**
    062         * Accessible through the Lookup key {@code runtime}.
    063         * @return Java Runtime Environment information.
    064         */
    065        public String getRuntime() {
    066            return getSystemProperty("java.runtime.name") + " (build " + getSystemProperty("java.runtime.version")
    067                    + ") from " + getSystemProperty("java.vendor");
    068        }
    069
    070        private String getSystemProperty(final String name) {
    071            return spLookup.lookup(name);
    072        }
    073
    074        private String getSystemProperty(final String prefix, final String name) {
    075            final String value = getSystemProperty(name);
    076            if (Strings.isEmpty(value)) {
    077                return Strings.EMPTY;
    078            }
    079            return prefix + value;
    080        }
    081
    082        /**
    083         * Accessible through the Lookup key {@code vm}.
    084         * @return Java Virtual Machine information.
    085         */
    086        public String getVirtualMachine() {
    087            return getSystemProperty("java.vm.name") + " (build " + getSystemProperty("java.vm.version") + ", "
    088                    + getSystemProperty("java.vm.info") + ")";
    089        }
    090
    091        /**
    092         * Looks up the value of the environment variable.
    093         *
    094         * @param event
    095         *        The current LogEvent (is ignored by this StrLookup).
    096         * @param key
    097         *        the key to be looked up, may be null
    098         * @return The value of the environment variable.
    099         */
    100        @Override
    101        public String lookup(final LogEvent event, final String key) {
    102            // TODO Use a Java 7 switch
    103            if ("version".equals(key)) {
    104                return "Java version " + getSystemProperty("java.version");
    105            } else if ("runtime".equals(key)) {
    106                return getRuntime();
    107            } else if ("vm".equals(key)) {
    108                return getVirtualMachine();
    109            } else if ("os".equals(key)) {
    110                return getOperatingSystem();
    111            } else if ("hw".equals(key)) {
    112                return getHardware();
    113            } else if ("locale".equals(key)) {
    114                return getLocale();
    115            }
    116            throw new IllegalArgumentException(key);
    117        }
    118    }