How to initialize log4j properly?

前端 未结 24 3017
太阳男子
太阳男子 2020-11-22 06:49

After adding log4j to my application I get the following output every time I execute my application:

log4j:WARN No appenders could be found for logger (slideselec         


        
相关标签:
24条回答
  • 2020-11-22 07:15

    My log4j got fixed by below property file:

    ## 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
    
    0 讨论(0)
  • 2020-11-22 07:15

    Logging API - The Java Logging API facilitates software servicing and maintenance at customer sites by producing log reports suitable for analysis by end users, system administrators, field service engineers, and software development teams. The Logging APIs capture information such as security failures, configuration errors, performance bottlenecks, and/or bugs in the application or platform. The core package includes support for delivering plain text or XML formatted log records to memory, output streams, consoles, files, and sockets. In addition, the logging APIs are capable of interacting with logging services that already exist on the host operating system.

    Package java.util.logging « Provides the classes and interfaces of the Java platform's core logging facilities.


    Log4j 1.x « log4j is a popular Java-based logging utility. Log4j is an open source project based on the work of many authors. It allows the developer to control which log statements are output to a variety of locations by using Appenders [console, files, DB and email]. It is fully configurable at runtime using external configuration files.

    Log4j has three main components:

    • Loggers - [OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE]
    • Appenders

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

      • Log4J Appender for MongoDB: MongoDbAppender - Driver

    • Layouts - [PatternLayout, EnhancedPatternLayout]

    Configuration files can be written in XML or in Java properties (key=value) format.

    1. log4j_External.properties « Java properties (key=value) format

    The string between an opening "${" and closing "}" is interpreted as a key. The value of the substituted variable can be defined as a system property or in the configuration file itself. Set appender specific options. « log4j.appender.appenderName.option=value, For each named appender you can configure its 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
    

    MySQL Table structure for table 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:configuration with public DTD file
    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE log4j:configuration PUBLIC
      "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
    <log4j:configuration debug="false">
    
        <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
            <param name="target" value="System.out" />
            <param name="threshold" value="debug" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
            </layout>
        </appender>
    
        <appender name="FILE" class="org.apache.log4j.FileAppender">
            <param name="file" value="E:/Logs/logFile.log" />
            <param name="append" value="false" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
            </layout>
        </appender>
    
        <appender name="FILE_PER_SIZE" class="org.apache.log4j.RollingFileAppender">
            <param name="file" value="E:/Logs/logRollingFile.log" />
            <param name="immediateFlush" value="true"/>
            <param name="maxFileSize" value="100KB" />
            <param name="maxBackupIndex" value="2"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
            </layout>
        </appender>
    
        <appender name="FILE_PER_DAY" class="org.apache.log4j.DailyRollingFileAppender">
            <param name="file" value="E:/Logs/logRollingDayFile.log" />
            <param name="datePattern" value="'_'yyyy-MM-dd" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n"/>
            </layout>
        </appender>
    
        <root>
            <priority value="info" />
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FILE" />
            <appender-ref ref="FILE_PER_SIZE" />
            <appender-ref ref="FILE_PER_DAY" />
        </root>
    </log4j:configuration>
    

    1. Log4j Configuration from the URL in Java program:

    In order to specify a custom configuration with an external file, the used class must implement the Configurator interface.

    when default configuration files "log4j.properties", "log4j.xml" are not available

    • For "log4j.properties" you can fed to the PropertyConfigurator.configure(java.net.URL) method.
    • For "log4j.xml" DOMConfigurator will be used.
    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();
        }
    }
    
    0 讨论(0)
  • 2020-11-22 07:16

    While setting up log4j properly is great for "real" projects you might want a quick-and-dirty solution, e.g. if you're just testing a new library.

    If so a call to the static method

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

    will setup basic logging to the console, and the error messages will be gone.

    0 讨论(0)
  • 2020-11-22 07:17

    As per Apache Log4j FAQ page:

    Why do I see a warning about "No appenders found for logger" and "Please configure log4j properly"?

    This occurs when the default configuration files log4j.properties and log4j.xml can not be found and the application performs no explicit configuration. log4j uses Thread.getContextClassLoader().getResource() to locate the default configuration files and does not directly check the file system. Knowing the appropriate location to place log4j.properties or log4j.xml requires understanding the search strategy of the class loader in use. log4j does not provide a default configuration since output to the console or to the file system may be prohibited in some environments.

    Basically the warning No appenders could be found for logger means that you're using log4j logging system, but you haven't added any Appenders (such as FileAppender, ConsoleAppender, SocketAppender, SyslogAppender, etc.) into your configuration file or the configuration file is missing.

    There are three ways to configure log4j: with a properties file (log4j.properties), with an XML file and through Java code (rootLogger.addAppender(new NullAppender());).

    log4j.properties

    If you've property file present (e.g. when installing Solr), you need to place this file within your classpath directory.

    classpath

    Here are some command suggestions in Linux how to determine your classpath value:

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

    or from Java: System.getProperty("java.class.path").

    Log4j XML

    Below is a basic XML configuration file for log4j in XML format:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
      <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
        <param name="Target" value="System.out"/> 
        <layout class="org.apache.log4j.PatternLayout"> 
          <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> 
        </layout> 
      </appender> 
    
      <root> 
        <priority value ="debug" /> 
        <appender-ref ref="console" /> 
      </root>
      
    </log4j:configuration>
    

    Tomcat

    If you're using Tomcat, you may place your log4j.properties into: /usr/share/tomcat?/lib/ or /var/lib/tomcat?/webapps/*/WEB-INF/lib/ folder.

    Solr

    For the reference, Solr default log4j.properties file looks like:

    #  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
    

    Why can't log4j find my properties file in a J2EE or WAR application?

    The short answer: the log4j classes and the properties file are not within the scope of the same classloader.

    Log4j only uses the default Class.forName() mechanism for loading classes. Resources are handled similarly. See the documentation for java.lang.ClassLoader for more details.

    So, if you're having problems, try loading the class or resource yourself. If you can't find it, neither will log4j. ;)


    See also:

    • Short introduction to log4j at Apache site
    • Apache: Logging Services: FAQ at Apache site
    0 讨论(0)
  • 2020-11-22 07:17

    Simply, create log4j.properties under src/main/assembly folder. Depending on if you want log messages to be shown in the console or in the file you modify your file. The following is going to show your messages in the 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
    
    0 讨论(0)
  • 2020-11-22 07:17

    If we are using apache commons logging wrapper on top of log4j, then we need to have both the jars available in classpath. Also, commons-logging.properties and log4j.properties/xml should be available in classpath.

    We can also pass implementation class and log4j.properties name as JAVA_OPTS either using -Dorg.apache.commons.logging.Log=<logging implementation class name> -Dlog4j.configuration=<file:location of log4j.properties/xml file>. Same can be done via setting JAVA_OPTS in case of app/web server.

    It will help to externalize properties which can be changed in deployment.

    0 讨论(0)
提交回复
热议问题