/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jena.atlas.logging; import java.io.* ; import java.nio.file.Files ; import java.nio.file.Path ; import java.nio.file.Paths ; import java.util.Properties ; import org.apache.jena.atlas.AtlasException ; import org.apache.jena.atlas.lib.StrUtils ; import org.apache.log4j.PropertyConfigurator ; import org.apache.log4j.xml.DOMConfigurator ; import org.slf4j.Logger ; /** Setup and control of logging - needs access to log4j binaries */ public class LogCtl { static public void set(Logger logger, String level) { setLevel(logger.getName(), level) ; } /** @deprecated Use {@link #setLevel(String, String)} */ @Deprecated static public void set(Class<? > logger, String level) { setLevel(logger.getName(), level) ; } /** @deprecated Use {@link #setLevel(String, String)} */ @Deprecated static public void set(String logger, String level) { setLevel(logger,level) ; } static public void setLevel(Class<? > logger, String level) { setLevel(logger.getName(), level) ; } static public void setLevel(String logger, String level) { setLevelLog4j(logger,level) ; setLevelJUL(logger,level) ; } private static void setLevelJUL(String logger, String levelName) { java.util.logging.Level level = java.util.logging.Level.ALL ; if ( levelName.equalsIgnoreCase("info") ) level = java.util.logging.Level.INFO ; else if ( levelName.equalsIgnoreCase("debug") ) level = java.util.logging.Level.FINE ; else if ( levelName.equalsIgnoreCase("warn") || levelName.equalsIgnoreCase("warning") ) level = java.util.logging.Level.WARNING ; else if ( levelName.equalsIgnoreCase("error") ) level = java.util.logging.Level.SEVERE ; else if ( levelName.equalsIgnoreCase("OFF") ) level = java.util.logging.Level.OFF ; if ( level != null ) java.util.logging.Logger.getLogger(logger).setLevel(level) ; } private static void setLevelLog4j(String logger, String levelName) { try { org.apache.log4j.Level level = org.apache.log4j.Level.ALL ; if ( levelName.equalsIgnoreCase("info") ) level = org.apache.log4j.Level.INFO ; else if ( levelName.equalsIgnoreCase("debug") ) level = org.apache.log4j.Level.DEBUG ; else if ( levelName.equalsIgnoreCase("warn") || levelName.equalsIgnoreCase("warning") ) level = org.apache.log4j.Level.WARN ; else if ( levelName.equalsIgnoreCase("error") ) level = org.apache.log4j.Level.ERROR ; else if ( levelName.equalsIgnoreCase("OFF") ) level = org.apache.log4j.Level.OFF ; if ( level != null ) org.apache.log4j.LogManager.getLogger(logger).setLevel(level) ; } catch (NoClassDefFoundError ex) { // For when it is not on the class path } } /** @deprecated Do not use - to be removed - use {@link #setLevel(String, String)} */ @Deprecated static public void logLevel(String logger, org.apache.log4j.Level level1, java.util.logging.Level level2) { if ( level1 != null ) org.apache.log4j.LogManager.getLogger(logger).setLevel(level1) ; if ( level2 != null ) java.util.logging.Logger.getLogger(logger).setLevel(level2) ; } /** * Turn on a logger (all levels). Works for Log4j and Java logging as the * logging provider to Apache common logging or slf4j. */ static public void enable(Logger logger) { enable(logger.getName()) ; } static public void enable(String logger) { setLevel(logger, "all") ; } /** * Turn on a logger (all levels). Works for Log4j and Java logging as the * logging provider to Apache common logging or slf4j. */ static public void enable(Class<? > logger) { org.apache.log4j.LogManager.getLogger(logger).setLevel(org.apache.log4j.Level.ALL) ; java.util.logging.Logger.getLogger(logger.getName()).setLevel(java.util.logging.Level.ALL) ; } /** * Turn on a logger (all levels). Works for Log4j and Java logging as the * logging provider to Apache common logging or slf4j. */ static public void disable(String logger) { setLevel(logger, "OFF") ; } /** * Turn on a logger (all levels). Works for Log4j and Java logging as the * logging provider to Apache common logging or slf4j. */ static public void disable(Class<? > logger) { setLevel(logger.getName(), "OFF") ; } /** * Set to info level. Works for Log4j and Java logging as the logging * provider to Apache common logging or slf4j. */ static public void setInfo(String logger) { setLevel(logger, "info") ; } /** * Set to info level. Works for Log4j and Java logging as the logging * provider to Apache common logging or slf4j. */ static public void setInfo(Class<? > logger) { setLevel(logger.getName(), "info") ; } /** * Set to warning level. Works for Log4j and Java logging as the logging * provider to Apache common logging or slf4j. */ static public void setWarn(String logger) { setLevel(logger, "warn") ; } /** * Set to warning level. Works for Log4j and Java logging as the logging * provider to Apache common logging or slf4j. */ static public void setWarn(Class<? > logger) { setLevel(logger.getName(), "warn") ; } /** * Set to error level. Works for Log4j and Java logging as the logging * provider to Apache common logging or slf4j. */ static public void setError(String logger) { setLevel(logger, "error") ; } /** * Set to error level. Works for Log4j and Java logging as the logging * provider to Apache common logging or slf4j. */ static public void setError(Class<? > logger) { setLevel(logger.getName(), "error") ; } private static String log4Jsetup = StrUtils.strjoinNL ( "## Command default log4j setup" ,"## Plain output with level, to stderr" ,"log4j.appender.jena.plainlevel=org.apache.log4j.ConsoleAppender" ,"log4j.appender.jena.plainlevel.target=System.err" ,"log4j.appender.jena.plainlevel.layout=org.apache.log4j.PatternLayout" ,"log4j.appender.jena.plainlevel.layout.ConversionPattern=%-5p %m%n" // , "## Plain output to stdout, unadorned output format" // ,"log4j.appender.jena.plain=org.apache.log4j.ConsoleAppender" // ,"log4j.appender.jena.plain.target=System.out" // ,"log4j.appender.jena.plain.layout=org.apache.log4j.PatternLayout" // ,"log4j.appender.jena.plain.layout.ConversionPattern=%m%n" ,"## Everything" ,"log4j.rootLogger=INFO, jena.plainlevel" ,"log4j.logger.com.hp.hpl.jena=WARN" ,"log4j.logger.org.apache.jena=WARN" ,"log4j.logger.org.apache.jena.tdb.loader=INFO" , "## Parser output" , "log4j.additivity.org.apache.jena.riot=false" , "log4j.logger.org.apache.jena.riot=INFO, jena.plainlevel" ) ; /** * Set logging * <ol> * <li>Check for -Dlog4j.configuration.</li> * <li>Looks for log4j.properties file in current directory.</li> * </ol> * Return true if we think Log4J is not initialized. */ public static void setLog4j() { if ( System.getProperty("log4j.configuration") == null ) { String fn = "log4j.properties" ; File f = new File(fn) ; if ( f.exists() ) System.setProperty("log4j.configuration", "file:" + fn) ; } } /** Set log4j properties (XML or properties file) */ public static void setLog4j(String filename) { if ( filename.toLowerCase().endsWith(".xml") ) DOMConfigurator.configure(filename) ; else PropertyConfigurator.configure(filename) ; } /** * Set logging, suitable for a command line application. * If "log4j.configuration" not set, then use the built-in default, * else just leave to log4j startup. */ public static void setCmdLogging() { setCmdLogging(log4Jsetup) ; } /** * Set logging, suitable for a command line application. * If "log4j.configuration" not set, then use the provided default * (log4j properties syntax) else just leave to log4j startup. */ public static void setCmdLogging(String defaultConfig) { if (System.getProperty("log4j.configuration") == null ) resetLogging(defaultConfig) ; } public static void resetLogging(String config) { Properties p = new Properties() ; InputStream in = new ByteArrayInputStream(StrUtils.asUTF8bytes(config)) ; try { p.load(in) ; } catch (IOException ex) {} PropertyConfigurator.configure(p) ; System.setProperty("log4j.configuration", "set") ; } // ---- java.util.logging - because that's always present. // Need: org.slf4j:slf4j-jdk14 private static String defaultProperties = StrUtils.strjoinNL ("handlers=org.apache.jena.atlas.logging.java.ConsoleHandlerStream" // These are the defaults. //,"org.apache.atlas.jena.logging.java.ConsoleHandlerStream.level=INFO" //,"org.apache.jena.atlas.logging.java.ConsoleHandlerStream.formatter=org.apache.jena.atlas.logging.java.TextFormatter" //,"org.apache.jena.atlas.logging.java.TextFormatter.format=%5$tT %3$-5s %2$-20s :: %6$s" ) ; private static String JUL_LOGGING = "logging.properties" ; public static void setJavaLogging() { Path p = Paths.get(JUL_LOGGING) ; if ( Files.exists(p) ) setJavaLogging(JUL_LOGGING) ; else setJavaLoggingDft(); } public static void setJavaLogging(String file) { try { InputStream details = new FileInputStream(file) ; details = new BufferedInputStream(details) ; java.util.logging.LogManager.getLogManager().readConfiguration(details) ; } catch (Exception ex) { throw new AtlasException(ex) ; } } public static void setJavaLoggingDft() { try { InputStream details = new ByteArrayInputStream(defaultProperties.getBytes("UTF-8")) ; java.util.logging.LogManager.getLogManager().readConfiguration(details) ; } catch (Exception ex) { throw new AtlasException(ex) ; } } }