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    }