【问题标题】:Using log4j on centos 7 to log to rsyslog在 centos 7 上使用 log4j 记录到 rsyslog
【发布时间】:2019-03-05 01:57:49
【问题描述】:

目前我正在尝试编写一个包装类 (Log.java) 以将日志记录抽象到 syslog。我在 Ubuntu 18 上运行,并通过 Intellij 运行它来测试我的 Log 类。我从 (https://logging.apache.org/log4j/2.0/download.html: apache-log4j-2.11.1-bin.tar.gz )
安装了 log4j 这是我拥有的类和 log4j.xml 文件:

log4j.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" name="Main" packages="">
    <Appenders>
        <Syslog name="test"  host="localhost" port="514"
                protocol="TCP" appName="Main"
                facility="LOCAL3" newLine="true"
                />
    </Appenders>
    <Loggers>
        <Logger name="Log" level="info">
            <AppenderRef ref="test"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="test"/>
        </Root>
    </Loggers>
</Configuration>

Log.java:

import org.apache.log4j.*;

public class Log {

    private String _ident;
    private static final Logger logger = Logger.getLogger("Log");

    public Log(String ident) {
        _ident = ident;
    }

    public void info(String message) {
        logger.info("[INFO]" + "["+ _ident+ "] " +message);
    }

    public void debug(String message) {
        logger.debug("[DEBUG]" + "["+ _ident+ "] " +message);
    }

    public void warn(String message) {
        logger.warn("[WARNING]" + "["+ _ident+ "] " +message);
    }

    public void error(String message) {
        logger.error("[ERROR]" + "["+ _ident+ "] " +message);
    }

}

Main.java:

public class Main {

    public static void main(String args[]) {
        Log log = new Log("Test");
        log.info("this is info");
        log.error("This is error");
        log.warn("This is warn");
        log.debug("This is debug");
    }


}

但是,我需要能够在不使用 IDE 的情况下在我的 centos 7 虚拟机上使用这些类。在 Centos 7 上,我安装了 yum 包:log4j,因此 jar 文件位于 /usr/share/java/log4j.jar

我尝试使用 javac 将 Log.java、Main.java 和 log4j.jar 链接在一起,但是,每次我尝试运行 java Main 时,都会收到一条错误消息,指出 org.apache.log4j.logger 不能被发现。

我也尝试从这些文件创建一个 jar,但我得到了同样的错误。

如何创建一个 bash 脚本来将这些文件链接在一起,解决所有依赖关系,并生成一个可以在我的虚拟机上运行的可执行文件?请记住,记录器需要知道 xml 文件的位置,我只能通过将路径放在 Intellij 的 vm 选项中来实现。

@Ice:所以我创建了一个 bash 脚本:

#!/bin/bash
LOG4j2_DIR="/usr/share/java/"
javac -cp $LOG4J2_DIR/log4j.jar Log.java
javac Main.java
java -Dlog4j.configurationFile="log4j.xml" -cp .:$LOG4J2_DIR/log4j.jar 
Main

我收到以下错误:

log4j:WARN Continuable parsing error 2 and column 54
log4j:WARN Document root element "Configuration", must match DOCTYPE root "null".
log4j:WARN Continuable parsing error 2 and column 54
log4j:WARN Document is invalid: no grammar found.
log4j:ERROR DOM element is - not a <log4j:configuration> element.
log4j:WARN No appenders could be found for logger (Log).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

【问题讨论】:

    标签: java logging log4j centos7 rsyslog


    【解决方案1】:

    首先,您需要使用类路径中的 log4j jar 编译 Log.java 类(然后编译 Main 类)。

    要执行主代码,您需要:

    1. 将 log4j jar 添加到类路径中。
    2. 添加 log4j 配置系统属性(-Dlog4j.configurationFile="log4j.xml")。 https://logging.apache.org/log4j/2.x/manual/configuration.html

    bash 文件应如下所示:

    LOG4J2_DIR="./apache-log4j-2.11.1-bin"
    
    javac -cp $LOG4J2_DIR/log4j-core-2.11.1.jar:$LOG4J2_DIR/log4j-api-2.11.1.jar:$LOG4J2_DIR/log4j-1.2-api-2.11.1.jar Log.java
    
    javac Main.java
    
    java -Dlog4j.configurationFile="log4j.xml" -cp .:$LOG4J2_DIR/log4j-core-2.11.1.jar:$LOG4J2_DIR/log4j-api-2.11.1.jar:$LOG4J2_DIR/log4j-1.2-api-2.11.1.jar Main
    

    【讨论】:

    • 明确一点,日志目录是/usr/share/java/log4j.jar。我相信这是给我的唯一 jar 文件。我会给你试一试,但是改变日志目录,看看它是否有效。
    • 没用。得到:log4j:WARN 持续解析错误 2 和第 54 列 log4j:WARN 文档根元素“配置”,必须匹配 DOCTYPE 根“null”。 log4j:WARN 持续解析错误 2 和第 54 列 log4j:WARN 文档无效:未找到语法。 log4j:ERROR DOM 元素是 - 不是 元素。 log4j:WARN 找不到记录器 (Log) 的附加程序。 log4j:WARN 请正确初始化 log4j 系统。 log4j:WARN 请参阅logging.apache.org/log4j/1.2/faq.html#noconfig 了解更多信息。
    • 你可以尝试下载并解压logging.apache.org/log4j/2.0/download.html: apache-log4j-2.11.1-bin.tar.gz。然后像我一样更改LOG4J2_DIR目录。
    • 成功了!谢谢。所以我只是从www-eu.apache.org/dist/logging/log4j/2.11.1/… wget 然后解压文件并运行你的脚本。非常感谢!
    猜你喜欢
    • 2015-03-25
    • 2016-03-25
    • 1970-01-01
    • 2016-04-08
    • 2014-03-26
    • 2018-12-15
    • 2017-11-06
    • 2012-06-17
    • 2018-07-10
    相关资源
    最近更新 更多