Como inicializar log4j corretamente?

Depois de adicionar log4j ao meu aplicativo, recebo a seguinte saída toda vez que executo meu aplicativo:

 log4j: WARN Nenhum appender foi encontrado para o logger (slideselector.facedata.FaceDataParser).
 log4j: WARN Por favor, inicialize o sistema log4j corretamente.

Parece que isso significa que um arquivo de configuração está faltando. Onde este arquivo de configuração deve ser localizado e qual é um bom conteúdo inicial?

Estou usando o java simples para desenvolver um aplicativo de desktop. Então não tem servidor web etc …

    O Log4j, por padrão, procura um arquivo chamado log4j.properties ou log4j.xml no caminho de class. Você pode controlar qual arquivo ele usa para inicializar a si mesmo definindo as propriedades do sistema conforme descrito aqui (Procure a seção “Procedimento de boot padrão”).

    Por exemplo:

    java -Dlog4j.configuration=customName .... 

    Faz com que o log4j procure por um arquivo chamado customName no caminho de class.

    Se você está tendo problemas, acho útil ligar o log4j.debug:

     -Dlog4j.debug 

    Ele irá imprimir em System.out muitas informações úteis sobre qual arquivo ele usou para inicializar a si mesmo, quais loggers / appenders foram configurados e como etc.

    O arquivo de configuração pode ser um arquivo de propriedades do java ou um arquivo xml. Aqui está uma amostra do formato do arquivo de propriedades retirado da página de documentação de introdução do log4j :

     log4j.rootLogger=debug, stdout, R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout # Pattern to output the caller's file name and line number. log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=example.log log4j.appender.R.MaxFileSize=100KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n 

    Embora a configuração do log4j seja adequada para projetos “reais”, você pode querer uma solução rápida e suja, por exemplo, se estiver apenas testando uma nova biblioteca.

    Se assim for, uma chamada para o método estático

     org.apache.log4j.BasicConfigurator.configure(); 

    irá configurar o log básico para o console, e as mensagens de erro serão perdidas.

    Se você acabou de se livrar de tudo (por exemplo, se você está em testes)

     org.apache.log4j.BasicConfigurator.configure(new NullAppender()); 

    De acordo com a página de perguntas frequentes do Apache Log4j :

    Por que vejo um aviso sobre “Nenhum appender encontrado para o logger” e “Por favor, configure o log4j corretamente”?

    Isso ocorre quando os arquivos de configuração padrão log4j.properties e log4j.xml não podem ser localizados e o aplicativo não executa nenhuma configuração explícita. log4j usa Thread.getContextClassLoader().getResource() para localizar os arquivos de configuração padrão e não verifica diretamente o sistema de arquivos. Conhecer o local apropriado para colocar log4j.properties ou log4j.xml requer o entendimento da estratégia de pesquisa do carregador de classs em uso. log4j não fornece uma configuração padrão, pois a saída para o console ou para o sistema de arquivos pode ser proibida em alguns ambientes.

    Basicamente, o aviso No appenders pode ser encontrado para o logger significa que você está usando log4j sistema de log, mas você não adicionou quaisquer Anexadores (como FileAppender, ConsoleAppender, SocketAppender, SyslogAppender, etc) em seu arquivo de configuração ou o arquivo de configuração está desaparecido.

    Existem três maneiras de configurar log4j: com um arquivo de propriedades ( log4j.properties ), com um arquivo XML e por meio do código Java ( rootLogger.addAppender(new NullAppender()); ).

    log4j.properties

    Se você tiver um arquivo de propriedades presente (por exemplo, ao instalar o Solr), será necessário colocar esse arquivo no diretório do caminho de class .

    classpath

    Aqui estão algumas sugestões de comandos no Linux para determinar o valor do seu classpath:

     $ echo $CLASSPATH $ ps wuax | grep -i classpath $ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf /usr/share/tomcat? 

    ou de Java: System.getProperty("java.class.path") .

    Log4j XML

    Abaixo está um arquivo de configuração XML básico para log4j no formato XML:

                   

    Tomcat

    Se você está usando o Tomcat, você pode colocar seu log4j.properties em: /usr/share/tomcat?/lib/ ou /var/lib/tomcat?/webapps/*/WEB-INF/lib/ folder.

    Solr

    Para a referência, o arquivo log4j.properties padrão do Solr se parece com:

     # Logging level solr.log=logs/ log4j.rootLogger=INFO, file, CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n #- size rotation with log cleanup. log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.MaxFileSize=4MB log4j.appender.file.MaxBackupIndex=9 #- File to log to and log format log4j.appender.file.File=${solr.log}/solr.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n log4j.logger.org.apache.zookeeper=WARN log4j.logger.org.apache.hadoop=WARN # set to INFO to enable infostream log messages log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF 

    Por que o log4j não pode localizar meu arquivo de propriedades em um aplicativo J2EE ou WAR?

    A resposta curta: as classs log4j e o arquivo de propriedades não estão dentro do escopo do mesmo carregador de class.

    O Log4j usa apenas o mecanismo padrão Class.forName() para carregar classs. Recursos são tratados da mesma forma. Veja a documentação de java.lang.ClassLoader para mais detalhes.

    Então, se você estiver com problemas, tente carregar a turma ou o recurso por conta própria. Se você não consegue encontrá-lo, nem o log4j. 😉


    Veja também:

    • Breve introdução ao log4j no site da Apache
    • Apache: Logging Services: FAQ no site do Apache

    Encontre um log4j.properties ou log4j.xml on-line que tenha um anexador raiz e coloque-o em seu caminho de class.

     ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout log4j.rootLogger=debug, stdout 

    irá registrar no console. Eu prefiro fazer o log em um arquivo para que você possa investigar depois.

     log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.maxFileSize=100KB log4j.appender.file.maxBackupIndex=5 log4j.appender.file.File=test.log log4j.appender.file.threshold=debug log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.rootLogger=debug,file 

    embora para aplicativos de log detalhado 100KB geralmente precisa ser aumentado para 1MB ou 10MB, especialmente para debugging.

    Pessoalmente, eu configuro vários loggers e defino o logger raiz para avisar ou o nível de erro, em vez de depurar.

    Você pode definir a localização do seu log4j.properties de dentro do seu aplicativo java usando:

     org.apache.log4j.PropertyConfigurator.configure(file/location/log4j.properties) 

    Mais informações estão disponíveis aqui: https://logging.apache.org/log4j/1.2/manual.html

    Outra maneira de fazer isso sem colocar o arquivo de propriedades no caminho de class é definir a propriedade diretamente do código java. Aqui está o código de exemplo.

     public class Log4JSample { public static void main(String[] args) { Properties properties=new Properties(); properties.setProperty("log4j.rootLogger","TRACE,stdout,MyFile"); properties.setProperty("log4j.rootCategory","TRACE"); properties.setProperty("log4j.appender.stdout", "org.apache.log4j.ConsoleAppender"); properties.setProperty("log4j.appender.stdout.layout", "org.apache.log4j.PatternLayout"); properties.setProperty("log4j.appender.stdout.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n"); properties.setProperty("log4j.appender.MyFile", "org.apache.log4j.RollingFileAppender"); properties.setProperty("log4j.appender.MyFile.File", "my_example.log"); properties.setProperty("log4j.appender.MyFile.MaxFileSize", "100KB"); properties.setProperty("log4j.appender.MyFile.MaxBackupIndex", "1"); properties.setProperty("log4j.appender.MyFile.layout", "org.apache.log4j.PatternLayout"); properties.setProperty("log4j.appender.MyFile.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n"); PropertyConfigurator.configure(properties); Logger logger = Logger.getLogger("MyFile"); logger.fatal("This is a FATAL message."); logger.error("This is an ERROR message."); logger.warn("This is a WARN message."); logger.info("This is an INFO message."); logger.debug("This is a DEBUG message."); logger.trace("This is a TRACE message."); } 

    }

    Você pode configurar o nível de log usando setLevel () .

    Os níveis são úteis para definir facilmente o tipo de informações que você deseja que o programa exiba.

    Por exemplo:

     Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages 

    O conjunto de níveis possíveis são:

    VESTÍGIO,

    DEPURAR,

    INFO,

    ADVERTIR,

    ERRO e

    FATAL

    De acordo com o manual de serviços de registro

     import org.apache.log4j.BasicConfigurator; 

    Chame esse método

     BasicConfigurator.configure(); 

    Para habilitar -Dlog4j.debug , eu vou para System, Advanced system settings, Environment variables e set system variable _JAVA_OPTIONS para -Dlog4j.debug .

    O que você está desenvolvendo? Você está usando o Apache Tomcat?

     log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n 

    Eu tenho propriedades como esta em um aplicativo Java meu.

    Meu log4j foi corrigido pelo arquivo de propriedades abaixo:

     ## direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout log4j.rootLogger=debug, stdout log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.maxFileSize=100KB log4j.appender.file.maxBackupIndex=5 log4j.appender.file.File=./logs/test.log log4j.appender.file.threshold=debug log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.rootLogger=debug,file 

    Eu criei o arquivo log4j.properties na pasta resources ao lado do arquivo hibernate.cfg.xml e preenchai com o texto abaixo:

     log4j.rootLogger=INFO, CONSOLE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n 

    agora me livrei de avisos e erros

    Simplesmente, crie log4j.properties na pasta src / main / assembly. Dependendo se você deseja que as mensagens de log sejam mostradas no console ou no arquivo que você modifica seu arquivo. O seguinte vai mostrar suas mensagens no console.

     # Root logger option log4j.rootLogger=INFO, stdout # Direct log messages to stdout 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 

    Como explicado anteriormente, existem duas abordagens

    Primeiro é simplesmente adicionar esta linha ao seu método principal:

     BasicConfigurator.configure(); 

    A segunda abordagem é include esse arquivo log4j.properties padrão em seu caminho de class:

    Ao tomar uma segunda abordagem, você precisa certificar-se de inicializar o arquivo corretamente.

    Por exemplo.

     Properties props = new Properties(); props.load(new FileInputStream("log4j property file path")); props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name"); 

    Certifique-se de criar a pasta necessária para armazenar os arquivos de log.

    Tente definir o atributo debug no log4j: configuration node como true.

      

    Ele imprime informações conforme o arquivo de configuração é lido e usado para configurar o ambiente log4j. Você pode ter mais detalhes para resolver seu problema.

    Logging APIA API Java Logging facilita a manutenção e manutenção de software nos sites dos clientes, produzindo relatórios de log adequados para análise por usuários finais, administradores de sistemas, engenheiros de serviço de campo e equipes de desenvolvimento de software. As APIs de registro capturam informações como falhas de segurança, erros de configuração, gargalos de desempenho e / ou bugs no aplicativo ou na plataforma. O pacote principal inclui suporte para a entrega de registros de log em formato de texto simples ou XML para memory, streams de saída, consoles, arquivos e sockets. Além disso, as APIs de registro são capazes de interagir com os serviços de registro que já existem no sistema operacional do host.

    Pacote java.util.logging «Fornece as classs e interfaces dos principais resources de registro da plataforma Java.


    Log4j 1.x «log4j é um popular utilitário de log baseado em Java. Log4j é um projeto de código aberto baseado no trabalho de muitos autores. Ele permite que o desenvolvedor controle quais instruções de log são enviadas para uma variedade de locais usando Anexadores [console, arquivos, database e email]. É totalmente configurável em tempo de execução usando arquivos de configuração externos.

    Log4j tem três componentes principais:

    • Registradores – [OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE]
    • Anexadores

      • Log de Apache Commons: ConsoleAppender, FileAppender, RollingFileAppender, DailyRollingFileAppender, JDBCAppender- Driver , SocketAppender

      • Log4J Appender para MongoDB: MongoDbAppender – Driver

    • Layouts – [PatternLayout, EnhancedPatternLayout]

    Os arquivos de configuração podem ser gravados em formato XML ou em propriedades Java (chave = valor).

    1. log4j_External.properties «Formato das propriedades Java (chave = valor)

    A string entre uma abertura ” $ { ” e fechamento ” } ” é interpretada como uma chave. O valor da variável substituída pode ser definido como uma propriedade do sistema ou no próprio arquivo de configuração. Definir opções específicas do appender. «Log4j.appender.appenderName.option = value, Para cada appender nomeado você pode configurar seu layout.

     log4j.rootLogger=INFO, FILE, FILE_PER_SIZE, FILE_PER_DAY, CONSOLE, MySql #log.path=./ log.path=E:/Logs # https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html # {%-5p - [WARN ,INFO ,ERROR], %5p 0- [ WARN, INFO,ERROR]} log.patternLayout=org.apache.log4j.PatternLayout log.pattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n # System.out | System.err log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.Target=System.err log4j.appender.CONSOLE.layout=${log.patternLayout} log4j.appender.CONSOLE.layout.ConversionPattern=${log.pattern} # File Appender log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=${log.path}/logFile.log #log4j:ERROR setFile(null,false) call failed. - Defaults setFile(null,true) #log4j.appender.FILE.Append = false log4j.appender.FILE.layout=${log.patternLayout} log4j.appender.FILE.layout.ConversionPattern=${log.pattern} # BackUP files for every Day. log4j.appender.FILE_PER_DAY=org.apache.log4j.DailyRollingFileAppender # [[ Current File ] - logRollingDayFile.log ], { [BackUPs] logRollingDayFile.log_2017-12-10, ... } log4j.appender.FILE_PER_DAY.File=${log.path}/logRollingDayFile.log log4j.appender.FILE_PER_DAY.DatePattern='_'yyyy-MM-dd log4j.appender.FILE_PER_DAY.layout=${log.patternLayout} log4j.appender.FILE_PER_DAY.layout.ConversionPattern=${log.pattern} # BackUP files for size rotation with log cleanup. log4j.appender.FILE_PER_SIZE=org.apache.log4j.RollingFileAppender # [[ Current File ] - logRollingFile.log ], { [BackUPs] logRollingFile.log.1, logRollingFile.log.2} log4j.appender.FILE_PER_SIZE.File=${log.path}/logRollingFile.log log4j.appender.FILE_PER_SIZE.MaxFileSize=100KB log4j.appender.FILE_PER_SIZE.MaxBackupIndex=2 log4j.appender.FILE_PER_SIZE.layout=${log.patternLayout} log4j.appender.FILE_PER_SIZE.layout.ConversionPattern=${log.pattern} # MySql Database - JDBCAppender log4j.appender.MySql=org.apache.log4j.jdbc.JDBCAppender log4j.appender.MySql.driver=com.mysql.jdbc.Driver log4j.appender.MySql.URL=jdbc:mysql://localhost:3306/automationlab log4j.appender.MySql.user=root log4j.appender.MySql.password= log4j.appender.MySql.layout=org.apache.log4j.EnhancedPatternLayout log4j.appender.MySql.layout.ConversionPattern=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m'); #log4j.appender.MySql.sql=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m'); # Direct log events[Messages] to MongoDB Collection - MongoDbAppender log.mongoDB.hostname=loalhost log.mongoDB.userName=Yash777 log.mongoDB.password=Yash@123 log.mongoDB.DB=MyLogDB log.mongoDB.Collection=Logs log4j.appender.MongoDB=org.log4mongo.MongoDbAppender log4j.appender.MongoDB.hostname=${log.mongoDB.hostname} log4j.appender.MongoDB.userName=${log.mongoDB.userName} log4j.appender.MongoDB.password=${log.mongoDB.password} log4j.appender.MongoDB.port=27017 log4j.appender.MongoDB.databaseName=${log.mongoDB.DB} log4j.appender.MongoDB.collectionName=${log.mongoDB.Collection} log4j.appender.MongoDB.writeConcern=FSYNCED 

    Estrutura do MySQL Table para tabela logdata

     CREATE TABLE IF NOT EXISTS `logdata` ( `Logger_Level` varchar(5) COLLATE utf8_unicode_ci NOT NULL, `DataTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `ClassName` varchar(30) COLLATE utf8_unicode_ci NOT NULL, `MethodName` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `LineNumber` int(10) NOT NULL, `Message` text COLLATE utf8_unicode_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 
    1. log4j_External.xml «XML log4j: configuração com arquivo DTD público
                                              

    1. Log4j Configuração da URL no programa Java:

    Para especificar uma configuração personalizada com um arquivo externo, a class usada deve implementar a interface do Configurador .

    quando os arquivos de configuração padrão “log4j.properties”, “log4j.xml” não estão disponíveis

    • Para “log4j.properties” você pode alimentar o método PropertyConfigurator .configure (java.net.URL).
    • Para “log4j.xml” DOMConfigurator será usado.
     public class LogFiles { // Define a static logger variable so that it references the Logger instance named "LogFiles". static final Logger log = Logger.getLogger( LogFiles.class ); @SuppressWarnings("deprecation") public static void main(String[] args) { System.out.println("CONFIGURATION_FILE « "+LogManager.DEFAULT_CONFIGURATION_FILE); System.out.println("DEFAULT_XML_CONFIGURATION_FILE = 'log4j.xml' « Default access modifier"); String fileName = //""; //"log4j_External.xml"; "log4j_External.properties"; String configurationFile = System.getProperty("user.dir")+"/src/" + fileName; if( fileName.contains(".xml") ) { DOMConfigurator.configure( configurationFile ); log.info("Extension *.xml"); } else if ( fileName.contains(".properties") ) { PropertyConfigurator.configure( configurationFile ); log.info("Extension *.properties"); } else { DailyRollingFileAppender dailyRollingAppender = new DailyRollingFileAppender(); dailyRollingAppender.setFile("E:/Logs/logRollingDayFile.log"); dailyRollingAppender.setDatePattern("'_'yyyy-MM-dd"); PatternLayout layout = new PatternLayout(); layout.setConversionPattern( "%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" ); dailyRollingAppender.setLayout(layout); dailyRollingAppender.activateOptions(); Logger rootLogger = Logger.getRootLogger(); rootLogger.setLevel(Level.DEBUG); rootLogger.addAppender(dailyRollingAppender); log.info("Configuring from Java Class."); } log.info("Console.Message."); method2(); methodException(0); } static void method2() { log.info("method2 - Console.Message."); } static void methodException(int b) { try { int a = 10/b; System.out.println("Result : "+ a); log.info("Result : "+ a); } catch (Exception ex) { // ArithmeticException: / by zero log.error(String.format("\n\tException occurred: %s", stackTraceToString(ex))); } } public static String stackTraceToString(Exception ex) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); return sw.toString(); } } 

    Se estivermos usando o wrapper logging do apache commons no topo do log4j, então precisamos ter ambos os jars disponíveis no classpath. Além disso, commons-logging.properties e log4j.properties/xml devem estar disponíveis no classpath.

    Também podemos passar a class de implementação e log4j.properties nome log4j.properties como JAVA_OPTS usando -Dorg.apache.commons.logging.Log= -Dlog4j.configuration= . O mesmo pode ser feito através da configuração de JAVA_OPTS em caso de aplicativo / servidor da web.

    Isso ajudará a externalizar as propriedades que podem ser alteradas na implementação.

    Esta é uma maneira alternativa usando .yaml

    Estrutura Lógica:

     Configuration: Properties: Appenders: Loggers: 

    Amostra:

     Configutation: name: Default Properties: Property: name: log-path value: "logs" Appenders: Console: name: Console_Appender target: SYSTEM_OUT PatternLayout: pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" File: name: File_Appender fileName: ${log-path}/logfile.log PatternLayout: pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" Loggers: Root: level: debug AppenderRef: - ref: Console_Appender Logger: - name: ...<...> level: debug AppenderRef: - ref: File_Appender level: error 

    Ref: LOG4J 2 CONFIGURAÇÃO: USANDO O YAML

    Para testes, uma maneira rápida e suja, incluindo a configuração do nível de registro:

     org.apache.log4j.BasicConfigurator.configure(); Logger.getRootLogger().setLevel(Level.WARN); // set to Level.DEBUG for full, or Level.OFF..