如何正确初始化 log4j?

Posted

技术标签:

【中文标题】如何正确初始化 log4j?【英文标题】:How to initialize log4j properly? 【发布时间】:2010-11-11 12:57:14 【问题描述】:

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

log4j:WARN 找不到记录器的附加程序 (slideselector.facedata.FaceDataParser)。 log4j:WARN 请正确初始化 log4j 系统。

这似乎意味着缺少配置文件。 这个配置文件应该放在哪里,什么是好的开始内容?

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

【问题讨论】:

对于像我这样的所有 maven 人:将 log4j.properties 放入 src/main/resources !! log4j 文档中有一个很basic sample of a log4j.xml file。 翻阅Log4j的简短手册很有帮助:logging.apache.org/log4j/1.2/manual.html 【参考方案1】:

如果即使在资源测试文件夹中添加了log4j.propertieslog4j.xml 文件后,Intellij IDEA 仍出现此错误,则 Intellij IDEA 可能还不知道该文件的存在。

所以,添加文件后,右键单击该文件并选择Recompile log4j.xml

【讨论】:

【参考方案2】:

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

您可以按照here 所述设置系统属性来控制它用于初始化自身的文件(查找“默认初始化过程”部分)。

例如:

java -Dlog4j.configuration=customName ....

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

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

-Dlog4j.debug

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

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

【讨论】:

因此,要从不在类路径上的文件加载配置文件,您必须这样做: -Dlog4j.configuration=file:/c:/my/folder/log4j.properties 这是实际上是一个 URL。 一个也许有人会觉得有用的小技巧:您还可以通过启用代码中的相应属性来打开 log4j 调试器 - System.setProperty("log4j .debug", ""); 你把java -Dlog4j.configuration=customName放在哪里?我尝试了 Project / Preferences / Run/Debug Settings ,选择了一些配置,单击了 Edit,Arguments 选项卡,VM arguments。 customName 是否包含 .xml 扩展名? 在尝试了许多变体之后,这有效:-Dlog4j.configuration=file:///C:/mydir/subdir/log4j.properties 上面的示例:-Dlog4j.configuration=file:/c: /my/folder/log4j.properties 失败。 我真的希望手册能够更多地强调-Dlog4j.debug 可以帮助您调试配置。【参考方案3】:

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

关注下面的博客

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.properties,而不是创建 log4j.resources。右键单击 IntelliJ 中的资源 -> 新建 -> 资源包 - 将其命名为 log4j

【讨论】:

【参考方案4】:

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>

【讨论】:

【参考方案5】:

我的解决方法是将“log4j.properties”放入“src”文件夹。

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

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


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

Log4j 具有三个主要组件:

Loggers - [关闭、致命、错误、警告、信息、调试、跟踪]

附加器

Apache Commons 日志记录: ConsoleAppender、FileAppender、RollingFileAppender、DailyRollingFileAppender、JDBCAppender-Driver、SocketAppender

用于 MongoDB 的 Log4J Appender: MongoDbAppender - Driver

布局 - [PatternLayout,EnhancedPatternLayout]

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

    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 - %dyyyy-MM-dd HH:mm:ss.SSS %C1:%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', '%dyyyy-MM-dd HH:mm:ss', '%C', '%M', '%L', '%m');
#log4j.appender.MySql.sql=INSERT INTO `logdata` VALUES ('%p', '%dyyyy-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: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 - %dyyyy-MM-dd HH:mm:ss.SSS %C1:%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 - %dyyyy-MM-dd HH:mm:ss.SSS %C1:%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 - %dyyyy-MM-dd HH:mm:ss.SSS %C1:%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 - %dyyyy-MM-dd HH:mm:ss.SSS %C1:%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:

为了使用外部文件指定自定义配置,使用的类必须实现Configurator interface

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

对于“log4j.properties”,您可以将其提供给PropertyConfigurator.configure(java.net.URL) 方法。 对于“log4j.xml”,将使用DOMConfigurator
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 - %dyyyy-MM-dd HH:mm:ss.SSS %C1:%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();
    

【讨论】:

【参考方案8】:

这是使用 .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] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %msg%n"

       File:
          name: File_Appender
          fileName: $log-path/logfile.log
          PatternLayout:
            pattern: "[%-5level] %dyyyy-MM-dd HH:mm:ss.SSS [%t] %c1 - %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 CONFIGURATION: USING YAML

【讨论】:

【参考方案9】:
import org.apache.log4j.BasicConfigurator;

调用这个方法

BasicConfigurator.configure();

【讨论】:

具体来说,这会写入System.out。无参数配置方法的 javadoc 说:Add a ConsoleAppender that uses PatternLayout using the PatternLayout#TTCC_CONVERSION_PATTERN and prints to System.out to the root category.【参考方案10】:

根据Apache Log4j FAQ page:

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

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

基本上警告 No appenders could be found for logger 意味着您正在使用 log4j 日志系统,但您还没有添加任何 Appender(例如 FileAppender、ConsoleAppender、SocketAppender、SyslogAppender , 等) 到您的配置文件中或配置文件丢失。

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

log4j.properties

如果您有属性文件(例如在安装 Solr 时),您需要将此文件放在您的 classpath 目录中。

类路径

以下是 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 %c1 - %m%n"/> 
    </layout> 
  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="console" /> 
  </root>
  
</log4j:configuration>

雄猫

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

太阳能

作为参考,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 - %dyyyy-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

为什么 log4j 在 J2EE 或 WAR 应用程序中找不到我的属性文件?

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

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

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


另见:

Short introduction to log4j Apache 网站 Apache: Logging Services: FAQ 在 Apache 网站上

【讨论】:

【参考方案11】:

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

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

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

【讨论】:

有人知道吗?是否也可以从属性配置中使用相同的选项,而无需在运行时启动时设置 -Dlog4j.debug=true?【参考方案12】:

如前所述,有两种方法

第一个是将这一行添加到您的 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");

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

【讨论】:

【参考方案13】:

只需在 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=%dyyyy-MM-dd HH:mm:ss %-5p %c1:%L - %m%n

【讨论】:

【参考方案14】:

另一种不将属性文件放在类路径中的方法是直接从 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","%dyyyy/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","%dyyyy/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.");

【讨论】:

【参考方案15】:

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

【讨论】:

【参考方案16】:

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

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

更多信息请点击此处:https://logging.apache.org/log4j/1.2/manual.html

【讨论】:

嗯,找不到类。 import 语句总是很有帮助,因为代码完成并不是那么可靠。【参考方案17】:

我在 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=%dABSOLUTE %-5p [%c1:%L] %m%n

现在我摆脱了警告和错误

【讨论】:

【参考方案18】:

您可以使用setLevel() 设置日志级别。

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

例如:

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

可能的级别是:

追踪,

调试,

信息,

警告,

错误和

致命

根据Logging Services manual

【讨论】:

【参考方案19】:

如果我们在 log4j 之上使用 apache commons logging wrapper,那么我们需要在 classpath 中提供两个 jar。此外,commons-logging.propertieslog4j.properties/xml 应该在类路径中可用。

我们还可以使用-Dorg.apache.commons.logging.Log=&lt;logging implementation class name&gt; -Dlog4j.configuration=&lt;file:location of log4j.properties/xml file&gt; 将实现类和log4j.properties 名称作为JAVA_OPTS 传递。在应用程序/网络服务器的情况下,同样可以通过设置 JAVA_OPTS 来完成。

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

【讨论】:

【参考方案20】:

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

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

【讨论】:

【参考方案21】:

我的 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=%dABSOLUTE %5p %c1:%L - %m%n
log4j.rootLogger=debug,file

【讨论】:

您好,如何将调试添加到控制台并将错误添加到文件?【参考方案22】:

虽然正确设置 log4j 非常适合“真实”项目,但您可能需要一个快速而简单的解决方案,例如如果您只是在测试一个新库。

如果是,则调用静态方法

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

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

【讨论】:

嗨,a3。 14_Infinity 我应该在哪里使用这个?我无法理解。即使我已经为这个问题提供了更多答案。请帮帮我 请记住,这将默认为调试级别的日志记录,这可能是不可取的。您可以这样更改:Logger.getRootLogger().setLevel(Level.INFO); 不仅警告消失了,而且我在控制台窗口中得到了一些方便的调试信息输出 太讽刺了..我们在生产状态下使用它【参考方案23】:

你在开发什么?你在使用 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=%dyyyyMMdd HH:mm:ss.SSS [[%5p] %c1 [%t]] %m%n

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

【讨论】:

【参考方案24】:

在线查找具有根 appender 的 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=%dABSOLUTE %5p %c1:%L - %m%n
log4j.rootLogger=debug,file

虽然对于详细日志记录应用程序,100KB 通常需要增加到 1MB 或 10MB,尤其是在调试时。

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

【讨论】:

以上是关于如何正确初始化 log4j?的主要内容,如果未能解决你的问题,请参考以下文章

排除spring-boot-starter-web的Logback依赖关系会阻止log4j系统正确初始化

如何使用 Spring Boot 应用程序初始化 log4j?

如何在java程序中手动初始化log4j.xml?

如何在 grails 中禁用 log4j 插件?

用 Spring 初始化 Log4J?

JavaWeb应用中初始化Log4j的两种方式