如何正确初始化log4j?

发布于 2024-07-27 16:16:52 字数 302 浏览 5 评论 0 原文

将 log4j 添加到我的应用程序后,每次执行应用程序时都会得到以下输出:

log4j:WARN No appenders could be found for logger (slideselector.facedata.FaceDataParser).
log4j:WARN Please initialize the log4j system properly.

这似乎意味着配置文件丢失。 该配置文件应该位于哪里以及什么是好的开始内容?

我正在使用纯 java 来开发桌面应用程序。 所以没有网络服务器等...

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 (slideselector.facedata.FaceDataParser).
log4j:WARN Please initialize the log4j system properly.

It seems this means a configuration file is missing.
Where should this config file be located and what is a good start content?

I'm using plain java for developing a desktop application. So no webserver etc...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(24

美人如玉 2024-08-03 16:16:53

您可以使用以下方法从 Java 应用程序内部设置 log4j.properties 的位置:

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

更多信息可在此处获取:https://logging.apache.org/log4j/1.2/manual.html

You can set the location of your log4j.properties from inside your java app by using:

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

More information is available here: https://logging.apache.org/log4j/1.2/manual.html

南渊 2024-08-03 16:16:53

另一种不将属性文件放在类路径上的方法是直接从 java 代码设置属性。 这是示例代码。

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.");
}

}

Another way to do it without putting the property file on the classpath, is to set the property from the java code directly. Here is the sample code.

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.");
}

}

羁绊已千年 2024-08-03 16:16:53
import org.apache.log4j.BasicConfigurator;

调用此方法

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

Call this method

BasicConfigurator.configure();
笑,眼淚并存 2024-08-03 16:16:53

您可以使用 setLevel()

这些级别可用于轻松设置您希望程序显示的信息类型。

例如:

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

可能的级别集是:

跟踪,

调试,

信息,

警告,

错误和

致命

根据日志服务手册

You can set up the log level by using setLevel().

The levels are useful to easily set the kind of informations you want the program to display.

For example:

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

The set of possible levels are:

TRACE,

DEBUG,

INFO,

WARN,

ERROR and

FATAL

According to Logging Services manual

静若繁花 2024-08-03 16:16:53

要启用 -Dlog4j.debug,我转到系统、高级系统设置、环境变量,并将系统变量 _JAVA_OPTIONS 设置为 -Dlog4j .debug

To enable -Dlog4j.debug, I go to System, Advanced system settings, Environment variables and set system variable _JAVA_OPTIONS to -Dlog4j.debug.

尸血腥色 2024-08-03 16:16:53

简单地,在 src/main/ assembly 文件夹下创建 log4j.properties 。 根据您希望日志消息显示在控制台还是文件中,您可以修改文件。 以下将在控制台中显示您的消息。

# 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

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
看轻我的陪伴 2024-08-03 16:16:53

你正在开发什么? 您使用的是 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

我的 Java 应用程序中有这样的属性。

What are you developing in? Are you using 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

I have a properties like this in a Java app of mine.

梦里兽 2024-08-03 16:16:53

我在 hibernate.cfg.xml 文件旁边的 resources 文件夹中创建了文件 log4j.properties 并用下面的文本填充它:

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

现在我得到了消除警告和错误

I've created file log4j.properties in resources folder next to hibernate.cfg.xml file and filled it with text below:

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

now I got rid of warnings and errors

℡寂寞咖啡 2024-08-03 16:16:53

我的 log4j 通过以下属性文件修复:

## 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

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
蓝眼睛不忧郁 2024-08-03 16:16:53

如前所述,有两种方法。

第一种方法是将这一行添加到您的 main 方法中:

BasicConfigurator.configure();

第二种方法是将这个标准 log4j.properties 文件添加到您的类路径中:

在采用第二种方法时,您需要确保正确初始化该文件。

例如。

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");

确保创建所需的文件夹来存储日志文件。

As explained earlier there are 2 approaches

First one is to just add this line to your main method:

BasicConfigurator.configure();

Second approach is to add this standard log4j.properties file to your classpath:

While taking second approach you need to make sure you initialize the file properly.

Eg.

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");

Make sure you create required folder to store log files.

神经暖 2024-08-03 16:16:53

尝试将 log4j:configuration 节点中的调试属性设置为 true。

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">

当配置文件被读取并用于配置 log4j 环境时,它会打印出信息。 您可能会获得更多详细信息来解决您的问题。

Try to set debug attribut in log4j:configuration node to true.

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">

It prints out information as the configuration file is read and used to configure the log4j environment. You may be got more details to resolve your problem.

柒七 2024-08-03 16:16:53

日志记录 API - Java 日志 API 通过生成适合最终用户、系统管理员、现场服务工程师和软件开发团队分析的日志报告,促进客户站点的软件服务和维护。 日志记录 API 捕获应用程序或平台中的安全故障、配置错误、性能瓶颈和/或错误等信息。 核心包包括对将纯文本或 XML 格式的日志记录传送到内存、输出流、控制台、文件和套接字的支持。 此外,日志记录 API 能够与主机操作系统上已存在的日志记录服务进行交互。

java.util.logging « 提供 Java 平台核心日志记录工具的类和接口。


Log4j 1.x « log4j 是一种流行的基于 Java 的日志记录实用程序。 Log4j 是一个基于许多作者工作的开源项目。 它允许开发人员通过使用 Appender [控制台、文件、数据库和电子邮件] 来控制将哪些日志语句输出到各个位置。 它可以在运行时使用外部配置文件进行完全配置。

Log4j 具有三个主要组件:

  • 记录器 - [关闭、致命、错误、警告、信息、调试、追踪]
  • 附加程序

    <块引用>


  • 布局 - [PatternLayout、EnhancedPatternLayout]



配置文件可以用 XML 或 Java 属性(键=值)格式编写。

  1. log4j_External.properties « Java 属性(键=值)格式

开头“${”和结尾“}”之间的字符串被解释为键。 替换变量的值可以定义为系统属性或配置文件本身。
设置附加程序特定选项。 « log4j.appender.appenderName.option=value,对于每个命名的appender,您可以配置其布局。

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

logdata 的 MySQL 表结构

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;
  • log4j_External.xml « XML log4j:使用公共 DTD 文件的配置
  • <?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>
    

  • 通过 Java 程序中的 URL 配置 Log4j:
  • 为了使用外部文件指定自定义配置,所使用的类必须实现配置器界面

    当默认配置文件“log4j.properties”、“log4j.xml”不可用时

    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();
        }
    }
    

    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

    • 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

    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();
        }
    }
    
    乄_柒ぐ汐 2024-08-03 16:16:53

    对于测试,一种快速肮脏的方法包括设置日志级别:

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

    For testing, a quick-dirty way including setting log level:

    org.apache.log4j.BasicConfigurator.configure();
    org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.WARN);
    
    // set to Level.DEBUG for full, or Level.OFF..
    
    要走干脆点 2024-08-03 16:16:53

    对我来说,解决方法是将“log4j.properties”放入“src”文件夹中。

    The fix for me was to put "log4j.properties" into the "src" folder.

    风和你 2024-08-03 16:16:53

    如果我们在 log4j 之上使用 apache commons 日志包装器,那么我们需要在类路径中提供这两个 jar。 此外,commons-logging.properties 和 log4j.properties/xml 应该在类路径中可用。

    我们还可以使用 -Dorg.apache.commons.logging.Log= 将实现类和 log4j.properties 名称作为 JAVA_OPTS 传递。 -Dlog4j.configuration=<文件:log4j.properties/xml 文件的位置>。 对于应用程序/Web 服务器,可以通过设置 JAVA_OPTS 来完成相同的操作。

    它将有助于外部化可以在部署中更改的属性。

    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.

    眼睛会笑 2024-08-03 16:16:53

    替代方法

    这是使用 .yaml逻辑结构的

    Configuration:
        Properties:
        Appenders:
        Loggers:
    

    :示例:

    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: <package>.<subpackage>.<subsubpackage>.<...>
                  level: debug
                  AppenderRef:
                     - ref: File_Appender
                     level: error             
    

    参考: LOG4J 2 配置:使用 YAML

    This is an alternative way using .yaml

    Logic Structure:

    Configuration:
        Properties:
        Appenders:
        Loggers:
    

    Sample:

    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: <package>.<subpackage>.<subsubpackage>.<...>
                  level: debug
                  AppenderRef:
                     - ref: File_Appender
                     level: error             
    

    Ref: LOG4J 2 CONFIGURATION: USING YAML

    太傻旳人生 2024-08-03 16:16:53

    Maven 解决方案:

    我遇到了与上面相同的问题,对于 Maven 解决方案,我使用了 2 个依赖项。 如果您希望一个简单的项目使用具有标准配置的记录器,则此配置仅用于快速测试。 我可以想象,如果您需要更多信息和/或微调您自己的日志记录级别,您稍后会想要创建一个配置文件。

        <properties>
            <slf4jVersion>1.7.28</slf4jVersion>
        </properties>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${slf4jVersion}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-jdk14</artifactId>
                <version>${slf4jVersion}</version>
            </dependency>
    

    Maven solution:

    I came across all the same issues as above, and for a maven solution I used 2 dependencies. This configuration is only meant for quick testing if you want a simple project to be using a logger, with a standard configuration. I can imagine you want to make a configuration file later on if you need more information and or finetune your own logging levels.

        <properties>
            <slf4jVersion>1.7.28</slf4jVersion>
        </properties>
    
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${slf4jVersion}</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-jdk14</artifactId>
                <version>${slf4jVersion}</version>
            </dependency>
    
    心凉怎暖 2024-08-03 16:16:53

    我刚刚这样做了,问题就解决了。

    遵循以下博客

    https://intellij-support.jetbrains.com/hc/en-us/community/posts/206875685-How-to-fix-log4j- WARN-console-messages-when-running-an-Application-inside-IntelliJ-Idea

    但他在这里说如下

    要解决此问题,只需将以下 log4j.resources 文件输入到您的 main/resources 文件夹中项目

    而不是创建 log4j.resources,而是创建 log4j.properties。 右键单击 IntelliJ 中的资源 -> 新-> 资源包 - 只需将其命名为 log4j

    I just did this and the issue was fixed.

    Followed the below blog

    https://intellij-support.jetbrains.com/hc/en-us/community/posts/206875685-How-to-fix-log4j-WARN-console-messages-when-running-an-Application-inside-IntelliJ-Idea

    But here he says like below

    To fix that just enter the following log4j.resources file into main/resources folder of your project

    instead of creating log4j.resources, create log4j.properties. Right Click on Resource in IntelliJ -> New -> Resource Bundle - Just name it as log4j

    夜血缘 2024-08-03 16:16:53

    如果即使在资源测试文件夹中添加 log4j.propertieslog4j.xml 文件后,Intellij IDEA 仍出现此错误,则可能 Intellij IDEA 尚未意识到文件的存在。

    因此,添加文件后,右键单击该文件并选择重新编译 log4j.xml

    If you are having this error on Intellij IDEA even after adding the log4j.properties or log4j.xml file on your resources test folder, maybe the Intellij IDEA is not aware yet about the existence of the file.

    So, after add the file, right click on the file and choose Recompile log4j.xml.

    瑾兮 2024-08-03 16:16:52

    Log4j 默认情况下会在类路径中查找名为 log4j.propertieslog4j.xml 的文件。

    您可以通过设置系统属性来控制它使用哪个文件来初始化自身,如此处所述(查找“默认初始化过程”部分)。

    例如:

    java -Dlog4j.configuration=customName ....
    

    将导致 log4j 在类路径上查找名为 customName 的文件。

    如果您遇到问题,我发现打开 log4j.debug 很有帮助:

    -Dlog4j.debug
    

    它将向 System.out 打印许多有用的信息,包括用于初始化自身的文件、配置了哪些记录器/附加程序以及如何配置等

    。可以是 java 属性文件或 xml 文件。 以下是取自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
    

    Log4j by default looks for a file called log4j.properties or log4j.xml on the classpath.

    You can control which file it uses to initialize itself by setting system properties as described here (Look for the "Default Initialization Procedure" section).

    For example:

    java -Dlog4j.configuration=customName ....
    

    Will cause log4j to look for a file called customName on the classpath.

    If you are having problems I find it helpful to turn on the log4j.debug:

    -Dlog4j.debug
    

    It will print to System.out lots of helpful information about which file it used to initialize itself, which loggers / appenders got configured and how etc.

    The configuration file can be a java properties file or an xml file. Here is a sample of the properties file format taken from the log4j intro documentation page:

    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
    
    断爱 2024-08-03 16:16:52

    虽然正确设置 log4j 对于“真实”项目非常有用,但您可能需要一个快速而肮脏的解决方案,例如,如果您只是测试一个新库。

    如果是这样,对静态方法的调用

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

    将设置控制台的基本日志记录,并且错误消息将消失。

    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.

    方觉久 2024-08-03 16:16:52

    如果你只是摆脱一切(例如,如果你正在测试)

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

    If you just get rid of everything (e.g. if you are in tests)

    org.apache.log4j.BasicConfigurator.configure(new NullAppender());
    
    爱的那么颓废 2024-08-03 16:16:52

    根据 Apache Log4j 常见问题页面

    为什么我会看到有关“未找到记录器的附加程序”和“请正确配置 log4j”的警告?

    当找不到默认配置文件log4j.propertieslog4j.xml并且应用程序未执行显式配置时,就会发生这种情况。 log4j 使用Thread.getContextClassLoader().getResource() 来定位默认配置文件,并不直接检查文件系统。 了解放置 log4j.properties 或 log4j.xml 的适当位置需要了解所使用的类加载器的搜索策略。 log4j 不提供默认配置,因为在某些环境中可能禁止输出到控制台或文件系统。

    基本上警告 无法找到记录器的附加程序 意味着您正在使用 log4j 日志系统,但您尚未在配置文件中添加任何 Appender(例如 FileAppender、ConsoleAppender、SocketAppender、SyslogAppender 等)或配置文件丢失。

    配置 log4j 的方法有三种:使用属性文件 (log4j.properties)、使用 XML 文件 和通过 Java 代码 (rootLogger.addAppender(new NullAppender());)。

    log4j.properties

    如果您有属性文件(例如安装 Solr 时),则需要将此文件放在 类路径 目录。

    类路径

    以下是 Linux 中如何确定类路径值的一些命令建议:

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

    或者从 Java 中:System.getProperty("java.class.path")

    Log4j XML

    下面是 XML 格式的 log4j 的基本 XML 配置文件:

    <?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

    如果您使用 Tomcat,则可以将 log4j.properties 放入: /usr/share/tomcat?/ lib//var/lib/tomcat?/webapps/*/WEB-INF/lib/ 文件夹。

    Solr

    作为参考,Solr 默认 log4j.properties 文件如下所示:

    #  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 myproperties file in a J2EE or WAR application?

    简短的回答:log4j 类和属性文件不在同一类加载器的范围内。

    Log4j 仅使用默认的 Class.forName() 机制来加载类。 资源的处理方式类似。 有关更多详细信息,请参阅 java.lang.ClassLoader 文档。

    因此,如果您遇到问题,请尝试自行加载类或资源。 如果你找不到它,log4j 也找不到。 ;)


    另请参阅:

    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:

    写给空气的情书 2024-08-03 16:16:52

    在线查找具有根附加程序的 log4j.properties 或 log4j.xml,并将其放在类路径中。

    ### 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=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
    

    尽管对于详细的日志记录应用程序,100KB 通常需要增加到 1MB 或 10MB,特别是对于调试而言。

    我个人设置了多个记录器,并将根记录器设置为警告或错误级别而不是调试。

    Find a log4j.properties or log4j.xml online that has a root appender, and put it on your classpath.

    ### 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
    

    will log to the console. I prefer logging to a file so you can investigate afterwards.

    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
    

    although for verbose logging applications 100KB usually needs to be increased to 1MB or 10MB, especially for debug.

    Personally I set up multiple loggers, and set the root logger to warn or error level instead of debug.

    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文