openGauss5.1应用开发指南:日志管理

2023年 10月 24日 43.6k 0

openGauss JDBC驱动程序支持使用日志记录来帮助解决在应用程序中使用openGauss JDBC驱动程序时的问题。openGauss JDBC支持如下三种日志管理方式:

  1. 对接应用程序使用的SLF4J日志框架。
  2. 对接应用程序使用的JdkLogger日志框架。

SLF4J和JdkLogger是业界Java应用程序日志管理的主流框架,描述应用程序如何使用这些框架超出了本文范围,用户请参考对应的官方文档(SLF4J:http://www.slf4j.org/manual.html,JdkLogger:https://docs.oracle.com/javase/8/docs/technotes/guides/logging/overview.html)。

方式一:对接应用程序的SLF4J日志框架。

在建立连接时,url配置logger=Slf4JLogger。

可采用Log4j或Log4j2来实现SLF4J。当采用Log4j实现SLF4J,需要添加如下jar包:log4j-*.jar、slf4j-api-*.jar、slf4j-log4*-*.jar,(*区分版本),和配置文件:log4j.properties。若采用Log4j2实现SLF4J,需要添加如下jar包:log4j-api-*.jar、log4j-core-*.jar、log4j-slf4j18-impl-*.jar、slf4j-api-*-alpha1.jar(*区分版本),和配置文件:log4j2.xml。

此方式支持日志管控。SLF4J可通过文件中的相关配置实现强大的日志管控功能,建议使用此方式进行日志管理。

 注意:

此方式依赖slf4j的通用API接口,如org.slf4j.LoggerFactory.getLogger(String name)、org.slf4j.Logger.debug(String var1)、org.slf4j.Logger.info(String var1)、org.slf4j.Logger.warn(String warn)、org.slf4j.Logger.warn(String warn)等,若以上接口发生变更,日志将无法打印。

示例:

public static Connection GetConnection(String username, String passwd){

String sourceURL = "jdbc:opengauss://10.10.0.13:8000/postgres?logger=Slf4JLogger";
Connection conn = null;

try{
//创建连接
conn = DriverManager.getConnection(sourceURL,username,passwd);
System.out.println("Connection succeed!");
}catch (Exception e){
e.printStackTrace();
return null;
}
return conn;
}

log4j.properties示例:

log4j.logger.org.opengauss=ALL, log_gsjdbc

# 默认文件输出配置
log4j.appender.log_gsjdbc=org.apache.log4j.RollingFileAppender
log4j.appender.log_gsjdbc.Append=true
log4j.appender.log_gsjdbc.File=gsjdbc.log
log4j.appender.log_gsjdbc.Threshold=TRACE
log4j.appender.log_gsjdbc.MaxFileSize=10MB
log4j.appender.log_gsjdbc.MaxBackupIndex=5
log4j.appender.log_gsjdbc.layout=org.apache.log4j.PatternLayout
log4j.appender.log_gsjdbc.layout.ConversionPattern=%d %p %t %c - %m%n
log4j.appender.log_gsjdbc.File.Encoding = UTF-8

log4j2.xml示例:

方式二:对接应用程序使用的JdkLogger日志框架。

默认的Java日志记录框架将其配置存储在名为logging.properties的文件中。Java会在Java安装目录的文件夹中安装全局配置文件。logging.properties文件也可以创建并与单个项目一起存储。

logging.properties配置示例:

# 指定处理程序为文件。
handlers= java.util.logging.FileHandler

# 指定默认全局日志级别
.level= ALL

# 指定日志输出管控标准
java.util.logging.FileHandler.level=ALL
java.util.logging.FileHandler.pattern = gsjdbc.log
java.util.logging.FileHandler.limit = 500000
java.util.logging.FileHandler.count = 30
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append=false

代码中使用示例:

System.setProperty("java.util.logging.FileHandler.pattern","jdbc.log");
FileHandler fileHandler = new FileHandler(System.getProperty("java.util.logging.FileHandler.pattern"));
Formatter formatter = new SimpleFormatter();
fileHandler.setFormatter(formatter);
Logger logger = Logger.getLogger("org.opengauss");
logger.addHandler(fileHandler);
logger.setLevel(Level.ALL);
logger.setUseParentHandlers(false);

链路跟踪功能

openGauss JDBC驱动程序提供了应用到数据库的链路跟踪功能,用于将数据库端离散的SQL和应用程序的请求关联起来。该功能需要应用开发者实现org.opengauss.log.Tracer接口类,并在url中指定接口实现类的全限定名。

url示例:

String URL = "jdbc:opengauss://127.0.0.1:8000/postgres?traceInterfaceClass=xxx.xxx.xxx.OpenGaussTraceImpl";

org.opengauss.log.Tracer接口类定义如下:

public interface Tracer {
// Retrieves the value of traceId.
String getTraceId();
}

org.opengauss.log.Tracer接口实现类示例:

import org.opengauss.log.Tracer;

public class OpenGaussTraceImpl implements Tracer {
private static MDC mdc = new MDC();

private final String TRACE_ID_KEY = "traceId";

public void set(String traceId) {
mdc.put(TRACE_ID_KEY, traceId);
}

public void reset() {
mdc.clear();
}

@Override
public String getTraceId() {
return mdc.get(TRACE_ID_KEY);
}
}

上下文映射示例,用于存放不同请求的生成的traceId。

import java.util.HashMap;

public class MDC {
static final private ThreadLocal threadLocal = new ThreadLocal();

public void put(String key, String val) {
if (key == null || val == null) {
throw new IllegalArgumentException("key or val cannot be null");
} else {
if (threadLocal.get() == null) {
threadLocal.set(new HashMap());
}
threadLocal.get().put(key, val);
}
}

public String get(String key) {
if (key == null) {
throw new IllegalArgumentException("key cannot be null");
} else if (threadLocal.get() == null) {
return null;
} else {
return threadLocal.get().get(key);
}
}

public void clear() {
if (threadLocal.get() == null) {
return;
} else {
threadLocal.get().clear();
}
}
}

业务使用traceId示例。

String traceId = UUID.randomUUID().toString().replaceAll("-", "");
openGaussTrace.set(traceId);
pstm = con.prepareStatement("select * from test_trace_id where id = ?");
pstm.setInt(1, 1);
pstm.execute();
pstm = con.prepareStatement("insert into test_trace_id values(?,?)");
pstm.setInt(1, 2);
pstm.setString(2, "test");
pstm.execute();
openGaussTrace.reset();

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论