2012-09-25 22 views
9

Tengo un proyecto Eclipse Java que usa log4j. No puedo configurar el archivo de configuración log4j para que se acceda por la ruta del archivo. Tengo que exportar y ejecutar el proyecto en un contenedor.Cómo establecer el archivo de propiedades log4j?

Aquí es cómo tratar:

public class Wita { 
    static Logger logger; 
    public static void main(String[] args) { 
    System.setProperty("log4j.configuration", new File("").getCanonicalPath()+File.separatorChar+"resources"+File.separatorChar+"log4j.xml"); 
    // System.out.println(System.getProperty("log4j.configuration")); 
    logger = Logger.getLogger(Wita.class.getName()); 
    } 
} 

Sistema cabo imprime los C: \ Users \ roncsak \ eclipse_workspace \ WITA \ resources \ log4j.xml lo cual es bueno. WITA es la carpeta base del proyecto. Sin embargo, la ejecución del proyecto con -Dlog4j.debug argumento de los siguientes rendimientos también:

 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using context classloader [email protected] 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using [email protected] class loader. 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using ClassLoader.getSystemResource(). 
log4j: Could not find resource: [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml]. 

me gustaría cambiar el log4j.xml lo largo del tiempo, sin necesidad de construir otro archivo jar. ¿Cómo puedo hacer eso?

Respuesta

18

De "inicialización procedimiento por defecto" en http://logging.apache.org/log4j/1.2/manual.html:

  • Establecer la variable de cadena de recurso al valor de la propiedad del sistema log4j.configuration. La forma preferida de especificar el archivo de inicialización predeterminado es mediante la propiedad log4j.configuration system . En caso de que la propiedad del sistema log4j.configuration no esté definida como , establezca el recurso de variable de cadena en su valor predeterminado "log4j.properties".
  • Intenta convertir la variable de recurso en una URL.
  • Si la variable de recurso no se puede convertir en una URL, por ejemplo debido a un MalformedURLException, a continuación, busque el recurso de la ruta de clases llamando org.apache.log4j.helpers.Loader.getResource (recursos, Logger. clase) que devuelve una URL. Tenga en cuenta que la cadena "log4j.properties" constituye una URL mal formada. Consulte Loader.getResource (java.lang.String) para ver la lista de ubicaciones buscadas.

Así que hay que anteponer a file:log4j.configuration valor de la propiedad con el fin de que pueda ser tratado como URL.

Ver https://stackoverflow.com/a/7927278/603516.

Aún mejor código:

System.setProperty("log4j.configuration", new File("resources", "log4j.xml").toURL()); 
+0

¡Y funciona! ¡Muchas gracias! – roncsak

+4

'java.io.File.toURL()' ahora está obsoleto. En su lugar use: 'x.toURI(). ToURL()' – kevinarpe

+0

Funciona perfectamente, solo un "archivo:" me costó una mañana entera, quiero besarte amigo. – BenBen

5

Puede establecer VM argumento: -Dlog4j.configuration='path_to_log4j.xml'

o programáticamente:

String logFilePath = new File(<path_to_log4j.xml>); 
if (logFilePath == null || "".equalsIgnoreCase(logFilePath)) { 
    URL file = this.getClass().getResource(DEFAULT_CONF); 
    DOMConfigurator.configure(file); 
} else { 
    DOMConfigurator.configure(<default_config_file>); 
} 
0

Todos estos respuesta anterior no satisfizo así que he puesto aquí para alguien que podría necesita esto en el futuro:

  1. Es necesario especificar en su propiedad es. Ya sea por programa o por opción de comando está bien.

Programatically:

private static void setupLog4J(){ 
    try { 
     System.setProperty("log4j.configuration", new File(".", File.separatorChar+"log4j.properties").toURL().toString()); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
  1. crear su propio archivo log4j.properties:

# Logging level 
# Root logger option 
log4j.rootLogger=DEBUG, stdout, file 

# Redirect log messages to console 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p  %c{1}:%L - %m%n 

# Redirect log messages to a log file, support file rolling. 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=c:/project/resources/t-output/log4j-application.log 
log4j.appender.file.MaxFileSize=5MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

Espero que esto ayude.

Cuestiones relacionadas