请正确初始化log4j系统。运行网络服务时

问题描述 投票:0回答:7

也许问这个看起来很傻,但我很困惑。我提到了配置Log4j属性,但它似乎没有帮助。

我编写了一个简单的 Web 服务 HelloWorld。在运行它时,我收到类似这样的错误:

log4j:警告找不到记录器(org.apache.axis.transport.http.AxisServlet)的附加程序。 log4j:WARN 请正确初始化 log4j 系统。

我不确定为什么会这样。

我正在使用 Eclipse 生成 Web 服务并部署在 Tomcat 6.0 中。我查看了 Axis 开发人员指南 并根据它们

log4j.configuration=log4j.properties 使用此系统属性指定 Log4J 配置文件的名称。如果未指定,则默认配置文件为 log4j.properties。 axis.jar 中提供了 log4j.properties 文件。

我在

axis.jar
中没有找到log4j.properties。

对此有什么帮助吗?

java web-services log4j axis
7个回答
45
投票

这些消息很棘手,足以让人们创建此错误报告以使其更清晰。

它们的棘手之处在于,如果 Log4j 找不到其

log4j.properties
(或
log4j.xml
)文件,则会写入警告,但 also 如果文件很好,但其内容从配置点来看并不完整的观点。

以下段落摘自log4j的故障排除指南

使用附加程序将日志输出写入目标。如果没有附加程序附加到某个类别或其任何祖先,您在尝试记录时将收到以下消息:

log4j: No appenders could be found for category (some.category.name).
log4j: Please initialize the log4j system properly.

Log4j 没有默认的日志记录目标。用户有责任确保所有类别都可以继承附加程序。通过将附加程序附加到根类别可以轻松实现这一点。

您可以在

log4j 文档
中找到有关如何配置根记录器 (log4j.rootLogger) 的信息;基本上,通过在文件开头添加这样简单的内容:

log4j.rootLogger=debug, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

这应该会清除您在启动时收到的那些

WARN
消息。(确保您还没有名为
appender
stdout
。还要注意您赋予根记录器的级别;
debug
将非常冗长,应用程序中的每个库都会开始向控制台写入内容。)

至于

log4j.properties
/
log4j.xml
文件,我建议您将此文件放在
/WEB-INF/classes
中,因为将其公开以进行不同的调整(激活/停用日志、更改日志级别等)非常重要。您也可以将其放在
classpath
中的 JAR 中(如您在评论中指定的那样),但它将包含在存档中(希望位于存档内的正确位置),并且不会像如果它在
/WEB-INF/classes


6
投票

您必须在类路径文件夹中创建自己的

log4j.properties


3
投票

好吧,如果您已经创建了 log4j.properties,您可以将其路径添加到类路径中,以便在执行过程中找到它。
是的,该东西将在类路径中搜索此文件。
既然您说您查看了 axis 但没有找到,我假设您没有 log4j.properties,所以这是一个粗略但完整的示例。
在某处创建它并添加到您的类路径中。例如,在 c:/proj/resources/log4j.properties

在您的类路径中,您只需添加 ......;c:/proj/resources

# Root logger option
log4j.rootLogger=DEBUG, stdout, file

# Redirect log messages to console
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

# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=c:/project/resources/t-output/log4j-application.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

2
投票

如果您的类中存在以下语句,那么您的 log4j.properties 应位于 java 源(src)文件夹中,如果它是 jar 可执行文件,则应打包在 jar 中而不是单独的文件中。

static Logger log = Logger.getLogger(MyClass.class);

谢谢,


1
投票

警告找不到logger的appender意味着您正在使用

log4j
日志系统,但您尚未在配置中添加任何Appender(例如FileAppender,ConsoleAppender,SocketAppender,SyslogAppender等)文件或配置文件丢失。

配置 log4j 的方法有三种:使用属性文件 (

log4j.properties
)、使用 XML 文件和通过 Java 代码 (
rootLogger.addAppender(new NullAppender());
)。

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

类路径

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

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

或来自 Java:

System.getProperty("java.class.path")

雄猫

如果您使用 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

0
投票

如果您使用

Logger.getLogger(ClassName.class)
,请将
log4j.properties
文件放入类路径中:

yourproject/javaresoures/src/log4j.properties (Put inside src folder)

0
投票

您可以像上面的答案一样配置 log4j.properties,或者使用

org.apache.log4j.BasicConfigurator

public class FooImpl implements Foo {

    private static final Logger LOGGER = Logger.getLogger(FooBar.class);

    public Object createObject() {
        BasicConfigurator.configure();
        LOGGER.info("something");
        return new Object();
    }
}

因此在表下配置:

  configure() {
    Logger root = Logger.getRootLogger();
    root.addAppender(new ConsoleAppender(
           new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));
  }
© www.soinside.com 2019 - 2024. All rights reserved.