如何正确初始化log4j?


280

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

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

看来这意味着缺少配置文件。此配置文件应位于何处,什么是良好的入门内容?

我正在使用纯Java开发桌面应用程序。因此没有网络服务器等...


49
对于像我这样的所有Maven家伙:将log4j.properties放入src / main / resources!
卡塞尔2010年

log4j文档具有一个非常基本的log4j.xml文件示例
肯·布鲁姆

查看Log4j的简短手册非常有帮助:logging.apache.org/log4j/1.2/manual.html
Sa'ad

Answers:


278

Log4j默认情况下,在classpath上查找名为log4j.properties或的文件log4j.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

43
因此,要从不在类路径上的文件加载配置文件,您必须执行以下操作:-Dlog4j.configuration = file:/ c:/my/folder/log4j.properties实际上是一个URL。
bbcooper 2011年

15
一个可能有人会发现有用的小技巧:您还可以通过启用代码中的相应属性来打开log4j调试器-System.setProperty(“ log4j.debug”,“”);
XXL

你放在哪里java -Dlog4j.configuration=customName?我尝试了“项目/首选项/运行/调试设置”,选择了一些配置,单击“编辑”,“参数”选项卡,VM参数。customName是否包含.xml扩展名?
Noumenon

2
在尝试了多种变体之后,该方法起作用了:-Dlog4j.configuration = file:/// C:/mydir/subdir/log4j.properties上面的示例:-Dlog4j.configuration = file:/ c:/my/folder/log4j.properties失败了
user1062589 '16

1
我真的希望手册会强调更多内容,以-Dlog4j.debug帮助调试您的配置。
Sridhar Sarnobat,

239

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

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

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

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


嗨a3。14_Infinity我应该在哪里使用?我不明白。甚至我也为这个问题提供了更多答案。请帮助我
Ravi Potnuru

5
请记住,这将默认为“调试”级别的日志记录,这可能是不希望的。您可以这样更改:Logger.getRootLogger().setLevel(Level.INFO);
forresthopkinsa

不只是做了警告消失,但我得到了在控制台窗口中一些有用的调试信息输出
烤Inhalf

2
如此具有讽刺意味..我们在生产状态下使用它
aswzen

25

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

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

20

根据Apache Log4j常见问题页面

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

找不到默认配置文件log4j.properties并且log4j.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,则可以将其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 - %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

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

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

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

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


也可以看看:


12

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

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

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


1
嗯,找不到课程。一种import说法总是有益的代码完成是不是所有的可靠。
2014年

11

在线查找具有根附加程序的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,尤其是对于调试。

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


9

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

}


6

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

这些级别对于轻松设置希望程序显示的信息种类很有用。

例如:

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

可能的级别集为:

跟踪,

调试,

信息,

警告,

错误和

致命

根据日志记录服务手册


6
import org.apache.log4j.BasicConfigurator;

调用此方法

BasicConfigurator.configure();

具体来说,这将写入System.out。no-args configure方法的javadoc说:Add a ConsoleAppender that uses PatternLayout using the PatternLayout#TTCC_CONVERSION_PATTERN and prints to System.out to the root category.
sunil

3

要启用-Dlog4j.debug,我进入系统,高级系统设置,环境变量并将系统变量设置_JAVA_OPTIONS-Dlog4j.debug


1

您正在开发什么?您正在使用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应用程序中有一个这样的属性。


1

我的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

嗨,我如何添加配置以进行调试到控制台和错误到文件?
JhonArias

1

我已经在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

现在我摆脱了警告和错误


1

只需在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

1

如前所述,有2种方法

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

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


1

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

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

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


有人知道吗?是否可以从属性配置中使用相同的选项,而不必在运行时启动时回到设置-Dlog4j.debug = true的状态?
肯尼迪国际

1

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

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


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

Log4j具有三个主要组件:

  • 记录器 -[关闭,致命,错误,警告,信息,调试,跟踪]
  • 追加者

  • 布局-[PatternLayout,EnhancedPatternLayout]

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

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

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

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表结构 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:使用公共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>

  1. 从Java程序中的URL进行Log4j配置:

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

当默认配置文件“ 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();
    }
}

1

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


0

如果我们在log4j上使用apache commons日志包装器,那么我们需要在classpath中同时使用这两个jar。另外,commons-logging.properties并且log4j.properties/xml应该在classpath中可用。

我们也可以通过实现类和log4j.properties名称JAVA_OPTS或者使用-Dorg.apache.commons.logging.Log=<logging implementation class name> -Dlog4j.configuration=<file:location of log4j.properties/xml file>JAVA_OPTS对于应用程序/网络服务器,也可以通过设置来完成。

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


0

这是使用.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


0

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

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

0

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>

0

我只是这样做,问题已解决。

关注了以下博客

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

但他在这里说如下

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

代替创建log4j.resources,而是创建log4j.properties。右键单击IntelliJ中的Resource-> New-> Resource Bundle-只需将其命名为log4j


0

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

因此,添加文件后,右键单击该文件,然后选择Recompile log4j.xml

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.