Configuration 如何正确初始化log4j?

Configuration 如何正确初始化log4j?,configuration,log4j,Configuration,Log4j,将log4j添加到应用程序后,每次执行应用程序时,我都会得到以下输出: log4j:WARN No appenders could be found for logger (slideselector.facedata.FaceDataParser). log4j:WARN Please initialize the log4j system properly. log4j:警告:找不到记录器(slideselector.facedata.FaceDataParser)的追加器。 log4j:警

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

log4j:WARN No appenders could be found for logger (slideselector.facedata.FaceDataParser). log4j:WARN Please initialize the log4j system properly. log4j:警告:找不到记录器(slideselector.facedata.FaceDataParser)的追加器。 log4j:警告请正确初始化log4j系统。 这似乎意味着配置文件丢失。 这个配置文件应该位于哪里?什么是好的开始内容


我使用纯java开发桌面应用程序。因此没有Web服务器等。

在线查找具有根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=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file
尽管对于详细日志应用程序,100KB通常需要增加到1MB或10MB,特别是对于调试


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

您在开发什么?您正在使用ApacheTomcat吗

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应用程序中有这样的属性。

Log4j
默认情况下在类路径上查找名为
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
您可以通过如上所述设置系统属性(查看“默认初始化过程”部分),控制它使用哪个文件来初始化自身

例如:

java -Dlog4j.configuration=customName ....
Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages
将导致
log4j
在类路径上查找名为customName的文件

### 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.debug很有帮助:

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

配置文件可以是java属性文件或xml文件。以下是取自以下内容的属性文件格式示例:


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

如果是,则调用静态方法

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

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

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

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


如果我们在log4j之上使用apachecommons日志包装器,那么我们需要在classpath中提供这两个jar。另外,
commons logging.properties
log4j.properties/xml
应该在classpath中可用

我们还可以使用
-Dorg.apache.commons.logging.Log=-Dlog4j.configuration=
将实现类和
log4j.properties
名称作为
JAVA_OPTS
传递。对于应用程序/web服务器,也可以通过设置
JAVA_OPTS
来实现


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

您可以使用设置日志级别

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

例如:

java -Dlog4j.configuration=customName ....
Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages
一组可能的级别包括:

跟踪

调试

信息

警告,

错误和

致命的


根据

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

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

此处提供更多信息:

要启用
-Dlog4j.debug
,请转到系统,高级系统设置,环境变量并将系统变量
\u JAVA_OPTIONS
设置为
-Dlog4j.debug
我在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

现在我消除了警告和错误

如前所述,有两种方法

第一种方法是将这一行添加到主方法中:

BasicConfigurator.configure();
第二种方法是将此标准log4j.properties文件添加到类路径:

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

例如

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

根据:

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

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

基本上,logger的警告“找不到Appender”表示您正在使用日志系统,但您尚未将任何Appender(如FileAppender、ConsoleAppender、SocketAppender、SyslogAppender等)添加到配置文件中,或者配置文件丢失

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

log4j.属性
如果存在属性文件(例如,在安装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”)

log4jxml 以下是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>

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

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

Log4j只使用默认的
Cl
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.");
}
# 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
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
import org.apache.log4j.BasicConfigurator;
BasicConfigurator.configure();
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             
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..
    <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>