以下是如何配置Chainsaw 2.1以读取使用 DBAppender 保存的 Logback日志。
- 不要下载任何插件
- 下载 SQL 驱动程序(例如
mysql-connector-java-5.1.36-bin.jar
)并将其保存到<chainsaw>\repo
.
- 编辑启动脚本以将 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
- 在启动时选择“使用电锯配置文件”
这是一个与 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>