2

我想使用 log4j 查看器(Chainsaw)来读取 log4j 记录在 MySql 数据库中的错误日志。我有点挣扎,因为文档真的很少。

[strike]这是我为 Chainsaw 准备的 .xml 配置:[/strike] 这是我的新 .xml 配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration >
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
  <plugin name="CustomDBReceiver" class="org.apache.log4j.db.CustomSQLDBReceiver">
     <connectionSource class="org.apache.log4j.db.DriverManagerConnectionSource">
       <param name="password" value="my_pwd"/>
       <param name="user" value="my_uid"/>
       <param name="driverClass" value="org.gjt.mm.mysql.Driver"/>
       <param name="url" value="jdbc:mysql://<my_host>:<my_host_port>/<my_database>"/>
  </connectionSource>
      <param name="refreshMillis" value="1000"/>
  <param name="sql" value='select ID as ID, Logger as LOGGER, Date as TIMESTAMP, Level as LEVEL, Thread as THREAD, Message as MESSAGE, Exception as EXCEPTION, DestID as DESTID, IPAddress as IP, Stacktrace as STACKTRACE from errorlogs'/>
  <param name="IDField" value="ID"/>
  </plugin>
  <root>
    <level value="debug"/>
  </root>
</log4j:configuration>

它告诉我:

No suitable driver found for jdbc:mysql://<my_host>:<my_host_port>/<my_database>

我已经下载了 DBReceiver 扩展 (log4j-db-1.3alpha-7) 并将其放在我的 .chainsaw/plugins 目录中。为了确定,我还将“mysql-connector-java-5.1.16-bin”放在 .chainsaw 目录中,因为这似乎是问题的原因。但是,它没有修复它。

你们中有人知道如何将 Chainsaw 连接到 MySql 数据库吗?

谢谢!

4

2 回答 2

3

以及有关如何使用未随 Chainsaw 分发的 jar 的更多信息:

http://logging.apache.org/chainsaw/distributionnotes.html

顺便说一句,您可能想尝试最新的 Chainsaw 开发人员快照,可在此处获得:

http://people.apache.org/~sdeboy

很多新功能...

斯科特

于 2011-06-04T05:08:12.530 回答
1

以下是如何配置Chainsaw 2.1以读取使用 DBAppender 保存的 Logback日志

  1. 不要下载任何插件
  2. 下载 SQL 驱动程序(例如mysql-connector-java-5.1.36-bin.jar)并将其保存到<chainsaw>\repo.
  3. 编辑启动脚本以将 jar 添加到类路径中。例如,在chainsaw.bat使用中:

    设置 CLASSPATH="%BASEDIR%"\etc;"%REPO%"\log4j\apache-log4j-extras\1.1\apache-log4j-extras-1.1.jar;"%REPO%"\log4j\log4j\1.2.16 \log4j-1.2.16.jar;"%REPO%"\javax\jmdns\jmdns\3.4.1\jmdns-3.4.1.jar;"%REPO%"\xstream\xstream\1.1.2\xstream-1.1 .2.jar;"%REPO%"\commons-vfs\commons-vfs\1.0\commons-vfs-1.0.jar;"%REPO%"\commons-logging\commons-logging\1.1.1\commons-logging -1.1.1.jar;"%REPO%"\com\jcraft\jsch\0.1.42\jsch-0.1.42.jar;"%REPO%"\log4j\apache-chainsaw\2.1.0-SNAPSHOT\apache -chainsaw-2.1.0-SNAPSHOT.jar;“%REPO%”\mysql-connector-java-5.1.36-bin.jar

  4. 在启动时选择“使用电锯配置文件”

这是一个与 Logback DBAppender 兼容的配置文件:

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

    <plugin name="Logs" class="org.apache.log4j.db.CustomSQLDBReceiver">
        <param name="sql" 
               value="
                    SELECT 
                        logger_name AS 'LOGGER', 
                        from_unixtime (timestmp/1000) AS 'TIMESTAMP', 
                        level_string AS 'LEVEL', 
                        thread_name AS 'THREAD', 
                        formatted_message AS 'MESSAGE', 
                        (SELECT CONCAT('{{', group_concat(CONCAT(mapped_key, ',', mapped_value) SEPARATOR ','), '}}')
                            FROM logging_event_property
                            WHERE logging_event.event_id = logging_event_property.event_id 
                            GROUP BY logging_event_property.event_id) AS 'NDC', 
                        '' AS 'MDC',
                        caller_class AS 'CLASS', 
                        caller_method AS 'METHOD', 
                        caller_filename AS 'FILE', 
                        caller_line AS 'LINE',
                        CONCAT('{{application,test,hostname,', (SELECT mapped_value FROM logging_event_property WHERE logging_event.event_id = logging_event_property.event_id AND mapped_key = 'HOSTNAME'), ',log4jid,', event_id,'}}') AS 'PROPERTIES',
                        IFNULL((SELECT group_concat(trace_line ORDER BY i ASC SEPARATOR '\n')
                            FROM logging_event_exception 
                            WHERE logging_event.event_id = logging_event_exception.event_id 
                            GROUP BY logging_event_exception.event_id),'') AS 'THROWABLE'
                    FROM logging_event
                    WHERE 1=1"/>
        <connectionSource class="org.apache.log4j.db.DriverManagerConnectionSource">
            <param name="driverClass" value="<driver, eg com.mysql.jdbc.Driver>"/>
            <param name="url" value="jdbc:mysql://<url>/<schema>"/>
            <param name="user" value="<user>"/>
            <param name="password" value="<password>"/>
        </connectionSource>
        <param name="IDField" value="event_id"/>
        <param name="refreshMillis" value="3000"/>
    </plugin>

    <root>
        <level value="debug"/>
    </root>

</log4j:configuration>

select-in-select 和where 1=1用于解决 CustomSQLDBReceiver在 SQL 表达式末尾笨拙地连接 aWHERE event_id > -1或 an的行为。AND event_id > -1见第 306-313 行。

的文档CustomSQLDBReceiver其 javadoc中。

对于 Logback-Access(在带有 ELB 的 EC2 上)我使用:

<plugin name="Access-Logs" class="org.apache.log4j.db.CustomSQLDBReceiver">
    <param name="sql" 
           value="
                SELECT 
                    REPLACE (requestURI, '/', '.') AS 'LOGGER', 
                    from_unixtime (timestmp/1000) AS 'TIMESTAMP', 
                    'INFO' AS 'LEVEL', 
                    IFNULL((SELECT header_value FROM access_event_header WHERE access_event.event_id = access_event_header.event_id AND header_key = 'x-forwarded-for'),'') AS 'THREAD', 
                    requestURL AS 'MESSAGE', 
                    '' AS 'NDC', 
                    '' AS 'MDC',
                    '' AS 'CLASS', 
                    '' AS 'METHOD', 
                    '' AS 'FILE', 
                    '' AS 'LINE', 
                    CONCAT('{{application,test,hostname,access,log4jid,', event_id,'}}')  AS 'PROPERTIES',
                    (SELECT group_concat(concat(header_key, ': ', header_value) SEPARATOR '\n')
                        FROM access_event_header
                        WHERE access_event.event_id = access_event_header.event_id 
                        GROUP BY access_event_header.event_id) AS 'THROWABLE'
                FROM access_event
                WHERE (SELECT header_value 
                        FROM access_event_header 
                        WHERE access_event.event_id = access_event_header.event_id AND header_key = 'user-agent')
                    != 'ELB-HealthChecker/1.0'"/>
    <connectionSource class="org.apache.log4j.db.DriverManagerConnectionSource">
        <param name="driverClass" value="com.mysql.jdbc.Driver"/>
        <param name="url" value=""/>
        <param name="user" value=""/>
        <param name="password" value=""/>
    </connectionSource>
    <param name="IDField" value="access_event.event_id"/>
    <param name="refreshMillis" value="3000"/>
</plugin>
于 2015-08-30T08:28:46.147 回答