Log4j: How to configure simplest possible file logging?

后端 未结 4 803
无人及你
无人及你 2020-11-29 20:21

My story:

I want to make a thing which is as simple as a simplest possible log4j logger that logs rows to a file. I have found several examples with some fun

相关标签:
4条回答
  • 2020-11-29 20:53

    I have one generic log4j.xml file for you:

    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
    <log4j:configuration debug="false">
    
        <appender name="default.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="%d{ISO8601} %-5p [%c{1}] - %m%n" />
            </layout>
        </appender>
    
        <appender name="default.file" class="org.apache.log4j.FileAppender">
            <param name="file" value="/log/mylogfile.log" />
            <param name="append" value="false" />
            <param name="threshold" value="debug" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
            </layout>
        </appender>
    
        <appender name="another.file" class="org.apache.log4j.FileAppender">
            <param name="file" value="/log/anotherlogfile.log" />
            <param name="append" value="false" />
            <param name="threshold" value="debug" />
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" />
            </layout>
        </appender>
    
        <logger name="com.yourcompany.SomeClass" additivity="false">
            <level value="debug" />
            <appender-ref ref="another.file" />
        </logger>
    
        <root>
            <priority value="info" />
            <appender-ref ref="default.console" />
            <appender-ref ref="default.file" />
        </root>
    </log4j:configuration>
    

    with one console, two file appender and one logger poiting to the second file appender instead of the first.

    EDIT

    In one of the older projects I have found a simple log4j.properties file:

    # For the general syntax of property based configuration files see
    # the documentation of org.apache.log4j.PropertyConfigurator.
    
    # The root category uses two appenders: default.out and default.file.
    # The first one gathers all log output, the latter only starting with 
    # the priority INFO.
    # The root priority is DEBUG, so that all classes can be logged unless 
    # defined otherwise in more specific properties.
    log4j.rootLogger=DEBUG, default.out, default.file
    
    # System.out.println appender for all classes
    log4j.appender.default.out=org.apache.log4j.ConsoleAppender
    log4j.appender.default.out.threshold=DEBUG
    log4j.appender.default.out.layout=org.apache.log4j.PatternLayout
    log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n
    
    log4j.appender.default.file=org.apache.log4j.FileAppender
    log4j.appender.default.file.append=true
    log4j.appender.default.file.file=/log/mylogfile.log
    log4j.appender.default.file.threshold=INFO
    log4j.appender.default.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n
    

    For the description of all the layout arguments look here: log4j PatternLayout arguments

    0 讨论(0)
  • 2020-11-29 21:01
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
    
       <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
          <param name="Threshold" value="INFO" />
          <param name="File" value="sample.log"/>
          <layout class="org.apache.log4j.PatternLayout">
             <param name="ConversionPattern" value="%d %-5p  [%c{1}] %m %n" />
          </layout>
       </appender>
    
      <root> 
        <priority value ="debug" /> 
        <appender-ref ref="fileAppender" /> 
      </root> 
    
    </log4j:configuration>
    

    Log4j can be a bit confusing. So lets try to understand what is going on in this file: In log4j you have two basic constructs appenders and loggers.

    Appenders define how and where things are appended. Will it be logged to a file, to the console, to a database, etc.? In this case you are specifying that log statements directed to fileAppender will be put in the file sample.log using the pattern specified in the layout tags. You could just as easily create a appender for the console or the database. Where the console appender would specify things like the layout on the screen and the database appender would have connection details and table names.

    Loggers respond to logging events as they bubble up. If an event catches the interest of a specific logger it will invoke its attached appenders. In the example below you have only one logger the root logger - which responds to all logging events by default. In addition to the root logger you can specify more specific loggers that respond to events from specific packages. These loggers can have their own appenders specified using the appender-ref tags or will otherwise inherit the appenders from the root logger. Using more specific loggers allows you to fine tune the logging level on specific packages or to direct certain packages to other appenders.

    So what this file is saying is:

    1. Create a fileAppender that logs to file sample.log
    2. Attach that appender to the root logger.
    3. The root logger will respond to any events at least as detailed as 'debug' level
    4. The appender is configured to only log events that are at least as detailed as 'info'

    The net out is that if you have a logger.debug("blah blah") in your code it will get ignored. A logger.info("Blah blah"); will output to sample.log.

    The snippet below could be added to the file above with the log4j tags. This logger would inherit the appenders from <root> but would limit the all logging events from the package org.springframework to those logged at level info or above.

      <!-- Example Package level Logger -->
        <logger name="org.springframework">
            <level value="info"/>
        </logger>   
    
    0 讨论(0)
  • 2020-11-29 21:01

    Here's a simple one that I often use:

    # Set up logging to include a file record of the output
    # Note: the file is always created, even if there is 
    # no actual output.
    log4j.rootLogger=error, stdout, R
    
    # Log format to standard out
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=   %5p\t[%d] [%t] (%F:%L)\n     \t%m%n\n
    
    # File based log output
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=owls_conditions.log
    log4j.appender.R.MaxFileSize=10000KB
    # Keep one backup file
    log4j.appender.R.MaxBackupIndex=1
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=   %5p\t[%d] [%t] (%F:%L)\n     \t%m%n\n
    

    The format of the log is as follows:

    ERROR   [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.java:44)
            http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog.
    

    Such a format is defined by the string %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n. You can read the meaning of conversion characters in log4j javadoc for PatternLayout.

    Included comments should help in understanding what it does. Further notes:

    • it logs both to console and to file; in this case the file is named owls_conditions.log: change it according to your needs;
    • files are rotated when they reach 10000KB, and one back-up file is kept
    0 讨论(0)
  • 2020-11-29 21:07

    Here is a log4j.properties file that I've used with great success.

    logDir=/var/log/myapp
    
    log4j.rootLogger=INFO, stdout
    #log4j.rootLogger=DEBUG, stdout
    
    log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n
    log4j.appender.stdout.DatePattern='.'yyyy-MM-dd
    log4j.appender.stdout.File=${logDir}/myapp.log
    log4j.appender.stdout.append=true
    

    The DailyRollingFileAppender will create new files each day with file names that look like this:

    myapp.log.2017-01-27
    myapp.log.2017-01-28
    myapp.log.2017-01-29
    myapp.log  <-- today's log
    

    Each entry in the log file will will have this format:

    01/30/2017 12:59:47 AM|INFO |Component1   | calling foobar(): userId=123, returning totalSent=1
    01/30/2017 12:59:47 AM|INFO |Component2   | count=1 > 0, calling fooBar()
    

    Set the location of the above file by using -Dlog4j.configuration, as mentioned in this posting:

    java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp
    

    In your Java code, be sure to set the name of each software component when you instantiate your logger object. I also like to log to both the log file and standard output, so I wrote this small function.

    private static final Logger LOGGER = Logger.getLogger("Component1");
    
    public static void log(org.apache.log4j.Logger logger, String message) {
    
        logger.info(message);
        System.out.printf("%s\n", message);
    }
    
    public static String stackTraceToString(Exception ex) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        ex.printStackTrace(pw);
        return sw.toString();
    }
    

    And then call it like so:

    LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));
    
    0 讨论(0)
提交回复
热议问题