以下是如何配置Chainsaw 2.1以读取使用DBAppender保存的Logback日志。
- 不要下载任何插件
- 下载SQL驱动程序(例如,
mysql-connector-java-5.1.36-bin.jar
)并将其保存到<chainsaw>\repo
。
- 编辑启动脚本以将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。罐子
- 在启动时选择“使用电锯配置文件”
这里是一个的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 > -1
或AND 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>
谢谢!我下载了最新版本,我很高兴有配置文件的例子。但是,当我尝试从我的数据库获取数据时,出现“没有找到适用于jdbc:mysql的合适驱动程序”错误。我编辑了我的帖子,如果你不介意看看它:) – Mathieu 2011-06-06 13:13:43
看起来我没有把我的“mysql-connector-java-5.1.16-bin”放在正确的位置。我把它放在我的java/jre/lib/ext路径中,它停止抱怨。但是,它告诉我:“运行我的请求时,java.sql.SQLException:Column'NDC'找不到”。我们是否需要在我们的数据库中有一个NDC列? – Mathieu 2011-06-06 19:08:26
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