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 }