本文目錄一覽:
使用log4j把日誌信息保存到數據庫
log4j 包裡面有一個 SQL 的 appender ,但我知道以前的版本中有bug,因為它生成 SQL 時用的是 createStatement 拼接字符串而不是 PreparedStatement ,因此當消息內容中有單引號或特殊符號時 SQL 都有語法錯誤執行不成功。
你需要自己擴展一下它提供自己的 SQLAppender 來做這件事。在網上搜索一個像 decompiler 這樣的 Java 反編譯器或從 Apache 網站去下載 log4j 源碼來看一下 SQL appender 是怎麼樣的,我們改寫它把這個 bug 解決了就可以用了。
如果你打算用 ODBC 數據源而不是 JDBC 來做,你需要確保你的 JRE 是 Oracle / Sun 提供的,因為像 IBM 的 JRE 就沒有自帶 ODBC 驅動程序,或者你自己去手工下載第三方的 ODBC 驅動程序。
從你的錯誤消息說 數據源找不到,對比下面這個圖片,你沒有設置它的 driver 參數,左邊所有以 set 開頭的方法就是表示你在 log4j.properties 文件中可以給它設置的參數,比如,setPassword 表示這個 JDBC Appender 有一個屬性 password。
log4j.appender.mySQLAppender.password = 密碼
log4j.appender.mySQLAppender.user = 用戶名
。。。 其它 set 方法對應的屬性列舉在這裡。。。
依此類推。
我們需要糾正的 bug 在這裡面,你需要提供自己的類繼承原來的 JDBCAppender 把這個 statement 改成 PreparedStatement 來訪問數據庫,就是需要 stmt.setString(1, myMsg); 這種,而不是直接拼接字符串的。
看了它的 JDBCAppender.execute 方法就知道這裡有一個 bug:
如何配置log4j2日誌記錄至數據庫
配置log4j2日誌記錄至數據庫
1、建立用於保存日誌的數據庫表:
CREATE TABLE `sys_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`level` varchar(32) NOT NULL,
`logger` varchar(100) NOT NULL,
`message` varchar(1000) DEFAULT NULL,
`exception` varchar(10000) DEFAULT NULL,
`date_add` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4;
2、配置 databaseAppender :
JDBC name=”databaseAppender” tableName=”sys_log”
ConnectionFactory class=”cc.s2m.web.s2mBlog.util.StaticProp” method=”getDatabaseConnection” /
Column name=”date_add” isEventTimestamp=”true” /
Column name=”level” pattern=”%level” /
Column name=”logger” pattern=”%logger” /
Column name=”message” pattern=”%message” /
Column name=”exception” pattern=”%ex{full}” /
/JDBC
3、其中 cc.s2m.web.s2mBlog.util.StaticProp 類的getDatabaseConnection方法為獲取可用的datasource:
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName(“com.mysql.jdbc.Driver”);
ds.setUrl(“jdbc:mysql://127.0.0.1/s2mBlog?characterEncoding=utf8”);
ds.setUsername(“root”);
ds.setPassword(“123456”);
return ds.getConnection();
4、指派需要記錄的日誌,使用 databaseAppender 即可:
logger name=”SYSLOG” level=”INFO” additivity=”false”
appender-ref ref=”databaseAppender”/
/logger
springMVC怎麼使用log4j將數據寫到數據庫
view
plainprint?CREATE02TABLE02log02(02020202[Id]02[int]02IDENTITY02(1,021)02primary02key02NOT02NULL02,02020202[Lg_Date]02[datetime]02NOT02NULL02,02020202[Lg_Thread]02[varchar]02(50)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Level]02[varchar]02(20)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Class]02[varchar]02(200)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL02,02020202[Lg_Message]02[varchar]02(2000)02COLLATE02Chinese_PRC_CI_AS02NOT02NULL0202)0202GO02022.寫log4j.properties文件,這裡我的數據庫舉動是用的JTDS:
引用#
level
:
是日誌記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定義的級別。
#
Log4j建議只使用四個級別,優先級從高到低分別是ERROR、WARN、INFO、DEBUG。
log4j.rootLogger=ERROR,DATABASE
log4j.addivity.org.apache=true
#
用於數據庫
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:jtds:sqlserver://localhost:1433;DatabaseName=databasename
log4j.appender.DATABASE.driver=net.sourceforge.jtds.jdbc.Driver
log4j.appender.DATABASE.user=username
log4j.appender.DATABASE.password=password
#
本處設置為”WARN”以上級別在數據庫存儲(默認情況使用rootLogger中的設置)
log4j.appender.DATABASE.Threshold=DEBUG
log4j.appender.DATABASE.sql=INSERT
INTO
log(optime,thread,infolevel,class,message)
VALUES
(‘%d{yyyy-MM-dd
HH:mm:ss}’,
‘%t’,
‘%p’,
‘%l’,
‘%m’)
#
寫入數據庫中的表LOG4J的Message字段中,
#
內容%d(日期)%c:
日誌信息所在地(類名)%p:
日誌信息級別%m:
產生的日誌具體信息
%n:
輸出日誌信息換行
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework]
%d
–
%c
-%-4r
[%t]
%-5p
%c
%x
–
%m%n3.在程序中需要將日誌信息寫入數據庫的地方寫入如下代碼:
view
plainprint?
原創文章,作者:XZYW,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/146345.html