本文目錄一覽:
使用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-tw/n/146345.html