blob: ac4b4ac309f1103a63e3eb8a9fe13aeb0c527838 [file] [log] [blame]
/**
* 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) ;
}
}
}