2011-06-02 53 views
2

我想使用log4j查看器(Chainsaw)通过log4j读取登录到MySql数据库中的错误日志。由于文档非常稀少,我有点挣扎。将Log4J查看器(链锯)连接到MySql数据库

[罢工]这里是我的电锯暂定的.xml配置:[/行使] 这是我的新的.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数据库?

谢谢!

回答

3

以及如何使用不散发着电锯罐的详细信息:

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

顺便说一句,你可能想尝试电锯的最新开发快照,可在这里:

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

许多新的功能...

斯科特

+0

谢谢!我下载了最新版本,我很高兴有配置文件的例子。但是,当我尝试从我的数据库获取数据时,出现“没有找到适用于jdbc:mysql的合适驱动程序”错误。我编辑了我的帖子,如果你不介意看看它:) – Mathieu 2011-06-06 13:13:43

+1

看起来我没有把我的“mysql-connector-java-5.1.16-bin”放在正确的位置。我把它放在我的java/jre/lib/ext路径中,它停止抱怨。但是,它告诉我:“运行我的请求时,java.sql.SQLException:Column'NDC'找不到”。我们是否需要在我们的数据库中有一个NDC列? – Mathieu 2011-06-06 19:08:26

+0

CustomSQLDBReceiver的JavaDoc说在SQL语句中为'LOGGER,TIMESTAMP,LEVEL,THREAD,MESSAGE,NDC,MDC,CLASS,METHOD,FILE,LINE,PROPERTIES,THROWABLE'定义列,如果你没有一个或更多这些列,只需将''作为NDC添加到您的SQL语句中,这样即使您的数据库中没有该列,空字符串也会出现在'结果集'中。 – Scott 2011-06-13 06:57:48

0

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

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

    组CLASSPATH = “%BASEDIR%” \等; “%REPO%” \ log4j的\ Apache的log4j的-额外\ 1.1 \ Apache的log4j的-额外-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%” \公地VFS \公地VFS \ 1.0 \公地VFS-1.0.jar; “%REPO%” \共享记录\共享记录\ 1.1.1 \共享记录-1.1.1.jar; “%REPO%” \ COM \ jcraft \ jsch \ 0.1.42 \ jsch-0.1.42.jar; “%REPO%” \ log4j的\ Apache的链锯\ 2.1.0-SNAPSHOT \ Apache的链锯-2.1.0-SNAPSHOT.jar; “%REPO%”\ mysql-connector-java-5.1.36-bin。罐子

  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> 

的选择,在选和where 1=1是否可以解决CustomSQLDBReceiver在SQL表达式末尾笨拙地连接WHERE event_id > -1AND event_id > -1的行为。 (See lines 306-313.

CustomSQLDBReceiver的文档在its javadoc中。

对于的logback访问(EC2上用ELB)我使用:

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