1. 程式人生 > 其它 >log4j2日誌記錄到oracle資料庫

log4j2日誌記錄到oracle資料庫

log4j2日誌記錄到oracle資料庫

1、下載包:jdk1.7 版本用比較老的

commons-dhcp-1.4.jar:https://dlcdn.apache.org//commons/dbcp/binaries/commons-dbcp-1.4-bin.zip

commons-pool-1.6.jar:https://dlcdn.apache.org//commons/pool/binaries/commons-pool-1.6-bin.zip

官網:

https://logging.apache.org/log4j/2.x/manual/appenders.html#JDBCAppender

2、新增到專案中

3.準備連線工廠:ConnectionFactory

package com.lm.tech.schedulejob.logs;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
import org.apache.commons.dbcp.PoolableConnection;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.PoolingDataSource;
import org.apache.commons.pool.impl.GenericObjectPool;

import cn.hutool.core.codec.Base64;

import com.lm.tech.schedulejob.utils.YWDBUtils;//資料庫的連線類,
/**
* 日誌的連線池
* @author DH03
*
*/
public class ConnectionFactory {
private static interface Singleton {
final ConnectionFactory INSTANCE = new ConnectionFactory();
}

private DataSource dataSource;

private ConnectionFactory() {
try{
Properties properties = new Properties();

Map<String, String> map=YWDBUtils.getLogDBMap();//獲取配置項的map
properties.setProperty("user", map.get("user"));
properties.setProperty("password", Base64.decodeStr(map.get("pwd"))); // or get properties from some configuration file

GenericObjectPool<PoolableConnection> pool = new GenericObjectPool<PoolableConnection>();
DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
YWDBUtils.getLogDBUrl(),//獲取配置項的的url
properties
);
new PoolableConnectionFactory(
connectionFactory, pool, null, "SELECT 1", 3, false, false, Connection.TRANSACTION_READ_COMMITTED
);

this.dataSource = new PoolingDataSource(pool);
}catch(Exception e){
e.printStackTrace();
this.dataSource = null;

}
}

public static Connection getDatabaseConnection() throws SQLException {

return Singleton.INSTANCE.dataSource.getConnection();
}
}
package com.lm.tech.schedulejob.utils;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import com.teamcenter.rac.aifrcp.AIFUtility;
import com.teamcenter.rac.kernel.TCSession;
import com.teamcenter.rac.util.Registry;

import cn.hutool.core.codec.Base64;
import cn.hutool.db.Db;
import cn.hutool.db.DbUtil;
import cn.hutool.db.Entity;
import cn.hutool.db.Session;
import cn.hutool.db.ds.simple.SimpleDataSource;
import cn.hutool.db.handler.EntityListHandler;
import cn.hutool.db.sql.SqlExecutor;
/**
* 資料庫連線類
* @author zyq
*
*/
public class YWDBUtils {

public static SimpleDataSource ds=null;
static Db db=null;
static Connection conn=null;

public static Map<String, String> getLogDBMap(){
TCSession tcsession = (TCSession) AIFUtility.getDefaultSession();
String[] values = tcsession.getPreferenceService().getStringArray(0,"cust_db_info");
Map<String, String> map=new HashMap<String, String>();
for (String str : values) {
int indexOf = str.indexOf("=");
map.put(str.substring(0,indexOf), str.substring(indexOf+1));
}
return map;
}
public static String getLogDBUrl(){
TCSession tcsession = (TCSession) AIFUtility.getDefaultSession();
String[] values = tcsession.getPreferenceService().getStringArray(0,"cust_db_info");
Map<String, String> map=new HashMap<String, String>();
for (String str : values) {
int indexOf = str.indexOf("=");
map.put(str.substring(0,indexOf), str.substring(indexOf+1));
}
//避免ORACEL RAC連線錯誤
String url="jdbc:oracle:thin:@"
+ "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)"
+ "(HOST = "+map.get("ip")+")(PORT = 1521))"
+ "(LOAD_BALANCE = yes)(FAILOVER = yes)"
+ "(CONNECT_DATA =(SERVER = DEDICATED)"
+ "(SERVICE_NAME = "+map.get("sid")+")"
+ "(FAILOVER_MODE=(TYPE = SELECT)"
+ "(METHOD = BASIC)"
+ "(RETIRES = 180)"
+ "(DELAY = 15))))";
//StaticTools.log.debug(url);不要加日誌輸出,這裡日誌還沒有構建
return url;
}
/***
* 獲取ds資料來源 首選項名稱為 cust_db_info pwd 是通過base64加密的字串
*/
public static void connectDB() {
if(ds==null) {
TCSession tcsession = (TCSession) AIFUtility.getDefaultSession();
String[] values = tcsession.getPreferenceService().getStringArray(0,"cust_db_info");
Map<String, String> map=new HashMap<String, String>();
for (String str : values) {
int indexOf = str.indexOf("=");
map.
put(str.substring(0,indexOf), str.substring(indexOf+1));
}
//避免ORACEL RAC連線錯誤
String url="jdbc:oracle:thin:@"
+ "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)"
+ "(HOST = "+map.get("ip")+")(PORT = 1521))"
+ "(LOAD_BALANCE = yes)(FAILOVER = yes)"
+ "(CONNECT_DATA =(SERVER = DEDICATED)"
+ "(SERVICE_NAME = "+map.get("sid")+")"
+ "(FAILOVER_MODE=(TYPE = SELECT)"
+ "(METHOD = BASIC)"
+ "(RETIRES = 180)"
+ "(DELAY = 15))))";
StaticTools.log.debug(url);
ds = new SimpleDataSource(url,map.get("user"), Base64.decodeStr(map.get("pwd")));

}
}
//獲取db
public static Db getDb() {
if (db==null) {
db=new Db(YWDBUtils.ds);
}
return db;
}
//獲取connection
public static Connection getConnection() {
try {
if (conn==null||conn.isClosed()) {
conn=ds.getConnection();
}
} catch (SQLException e) {
StaticTools.log.error(e);
}
return conn;
}
//關閉db
public static void closeDB() {
closeConnection();
if(ds!=null)
try {
ds.close();
} catch (IOException e) {
StaticTools.log.error(e);
}
}
//關閉connection
public static void closeConnection() {
try {
if (conn!=null||!conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
StaticTools.log.error(e);
}
}


}

4.log4j2的配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<property name="log_level" value="debug" />
<Property name="log_dir" value="$${env:TMP}/tech/logs" />
<property name="log_pattern"
value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%p] - [%t] %logger - %m%n" />
<property name="file_name" value="test" />
<property name="every_file_size" value="100 MB" />
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${log_pattern}" />
</Console>
<RollingFile name="RollingFile"
filename="${log_dir}/${file_name}.log"
filepattern="${log_dir}/$${date:yyyy-MM}/${file_name}-%d{yyyy-MM-dd}-%i.log">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout pattern="${log_pattern}" />
<Policies>
<SizeBasedTriggeringPolicy
size="${every_file_size}" />
<TimeBasedTriggeringPolicy modulate="true"
interval="1" />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>

<RollingFile name="RollingFileErr"
fileName="${log_dir}/${file_name}-warnerr.log"
filePattern="${log_dir}/$${date:yyyy-MM}/${file_name}-%d{yyyy-MM-dd}-warnerr-%i.log">
<ThresholdFilter level="WARN" onMatch="ACCEPT"
onMismatch="DENY" />
<PatternLayout pattern="${log_pattern}" />
<Policies>
<SizeBasedTriggeringPolicy
size="${every_file_size}" />
<TimeBasedTriggeringPolicy modulate="true"
interval="1" />
</Policies>
</RollingFile>
<JDBC name="databaseAppender" tableName="CUST.APPLICATION_LOG">
<ConnectionFactory class="com.lm.tech.schedulejob.logs.ConnectionFactory" method="getDatabaseConnection" />
<Column name="EVENT_ID" literal="CUST.APPLICATION_LOG_SEQUENCE.NEXTVAL" />
<Column name="EVENT_DATE" isEventTimestamp="true" />
<Column name="LOG_LEVEL" pattern="%level" />
<Column name="LOGGER" pattern="%logger" />
<Column name="MESSAGE" pattern="%message" />
<Column name="THROWABLE" pattern="%ex{full}" />
</JDBC>
</Appenders>
<Loggers>
<Root level="${log_level}">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
<appender-ref ref="RollingFileErr" />
<appender-ref ref="databaseAppender"/>
</Root>
</Loggers>
</Configuration>

5.建立日誌表

-- Create table
create table APPLICATION_LOG
(
event_id VARCHAR2(128),
event_date DATE,
log_level VARCHAR2(32),
logger VARCHAR2(32),
message VARCHAR2(512),
throwable VARCHAR2(512)
)
tablespace IDATA
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);

[2021-11-28 10:10:26.947] [DEBUG] - [pool-2-thread-3] com.lm.tech.schedulejob.utils.StaticTools - 任務:分發任務1:ScheduleDisJobRunnable1開始執行 [2021-11-28 10:10:26.947] [DEBUG] - [pool-2-thread-3] com.lm.tech.schedulejob.utils.StaticTools - 任務:分發任務1:ScheduleDisJobRunnable1完成 [2021-11-28 10:10:26.947] [DEBUG] - [pool-2-thread-3] com.lm.tech.schedulejob.utils.StaticTools - 任務:設計檔案分發任務:ScheduleDocDisJobRunnable開始執行 [2021-11-28 10:10:26.947] [DEBUG] - [pool-2-thread-10] com.lm.tech.schedulejob.utils.StaticTools - 任務:工藝審查分發任務:ScheduleTechWfDisJobRunnable開始執行 [2021-11-28 10:10:26.962] [DEBUG] - [pool-2-thread-3] com.lm.tech.schedulejob.utils.StaticTools - 開始處理髮布流程:sCcuTAEhw5CDP_410_1的檔案分發 [2021-11-28 10:10:26.979] [DEBUG] - [pool-2-thread-3] com.lm.tech.schedulejob.utils.StaticTools - 呼叫kostech的包,執行分發gOqF5m0i4rVVWC的版本分發 [2021-11-28 10:10:26.979] [DEBUG] - [pool-2-thread-10] com.lm.tech.schedulejob.utils.StaticTools - 開始處理:sCcuTAEhw5CDP_410_1工藝會籤流程