O SLS oferece suporte ao protocolo PostgreSQL. Use psql, JDBC ou qualquer ferramenta compatível com PG para ler, gravar e gerenciar dados de log com SQL.
Recursos
Com o protocolo PostgreSQL, você pode:
Gerenciar logstores com sintaxe SQL padrão (criar, modificar, excluir).
Analisar dados de log com a sintaxe SQL do PostgreSQL.
Gravar dados de log usando instruções INSERT.
Consultar metadados de esquema do logstore com sintaxe nativa do PostgreSQL, totalmente compatível com as tabelas de sistema do PostgreSQL.
Limites
Os limites a seguir se aplicam:
|
Limitações |
Descrição |
|
Prepared Statement |
Instruções preparadas (parse/bind/execute) não têm suporte. Para JDBC, defina o modo de consulta como simple:
Ou defina o parâmetro preferQueryMode na URL JDBC:
|
|
Suporte a transações |
As instruções begin, commit e rollback são ignoradas e não produzem efeito. |
|
Chaves primárias e valores padrão |
Restrições como chaves primárias e valores padrão não têm suporte. |
Pré-requisitos
Crie um projeto.
Obtenha um par de AccessKey (AccessKey ID e AccessKey secret). Criar um AccessKey.
Instale um cliente compatível com PostgreSQL (como psql).
Conectar-se ao SLS
Formato da URL de conexão do cliente PostgreSQL:
postgresql://{AccessKey_ID}:{AccessKey_Secret}@{Endpoint}:5432/{Project_Name}
# The connection enables TLS by default (MD5 for authentication). To explicitly disable TLS (for example, if the client does not support it), set the sslmode parameter to disable.
postgresql://{AccessKey_ID}:{AccessKey_Secret}@{Endpoint}:5432/{Project_Name}?sslmode=disable
Exemplo de conexão JDBC:
private static final String URL = "jdbc:postgresql://{Endpoint}:5432/{Project_Name}?preferQueryMode=simple";
private static final String AccessKey_ID = "xyz";
private static final String AccessKey_Secret = "123456";
public static void main(String[] args) throws Exception
{
Properties props = new Properties();
props.setProperty(PGProperty.USER.getName(), AccessKey_ID);
props.setProperty(PGProperty.PASSWORD.getName(), AccessKey_Secret);
try (Connection conn = DriverManager.getConnection(URL, props)) {
System.out.println("Connection successful!");
}
}
Parâmetros
|
Parâmetro |
Descrição |
Exemplo |
|
AccessKey_ID |
O AccessKey ID da sua conta Alibaba Cloud ou usuário RAM. |
LTAI5t*** |
|
AccessKey_Secret |
O AccessKey secret da sua conta Alibaba Cloud ou usuário RAM. |
*** |
|
Endpoint |
O endpoint do SLS. Deve incluir o nome do projeto conforme mostrado na coluna Exemplo. Endpoints. |
{projectName}.cn-hangzhou.log.aliyuncs.com |
|
Project_Name |
O nome do projeto de log. |
my-project |
Gerenciar tabelas
Uma tabela corresponde a um logstore do SLS.
Criar uma tabela
Crie um logstore com CREATE TABLE:
CREATE TABLE users (
id BIGINT,
name TEXT,
create_time TIMESTAMP
)
WITH (
shard_count = 4,
ttl = 14,
default_query_range = '1d',
full_text_search_enabled = true,
index_tokens = '&[ ]",''\',
log_time_field = 'create_time',
insert_any_allowed = false
);
Tipos de coluna com suporte:
|
Tipo PostgreSQL |
Tipo SLS |
Descrição |
|
int8/bigint/int4/integer/int2/smallint/oid |
long |
Tipo inteiro |
|
text/varchar/char/bpchar/uuid |
text |
Tipo string |
|
float4/real/float8/double precision/numeric |
double |
Tipo de ponto flutuante |
|
json |
json |
Tipo JSON |
Propriedades da tabela (cláusula WITH):
|
Nome da propriedade |
Tipo |
Descrição |
Valor padrão |
Exemplo |
|
shard_count |
Integer |
Quantidade de shards no logstore. |
4 |
4 |
|
ttl |
Integer |
Período de retenção de dados em dias. |
365 |
14 |
|
default_query_range |
String |
Intervalo de tempo padrão para consultas. Formato: {n}{d/m/s} (dia/minuto/segundo). |
'1d' |
'3d' |
|
full_text_search_enabled |
Boolean |
Indica se a indexação de texto completo deve ser ativada. |
false |
true |
|
index_tokens |
String |
Tokens usados para tokenização. |
Delimitadores padrão |
'&[]",''' |
|
log_time_field |
String |
Campo usado como horário do log durante gravações. Deve ser timestamp ou long (segundos, milissegundos, microssegundos ou nanossegundos desde epoch). A unidade é detectada automaticamente. |
- |
'create_time' |
|
insert_any_allowed |
Boolean |
Indica se gravações sem validação de esquema são permitidas. Defina como false para impor verificações de esquema. |
true |
false |
|
hot_ttl |
Integer |
Dias para reter dados no armazenamento quente antes da transição para o armazenamento IA. Se não definido, os dados permanecem no armazenamento quente durante todo o TTL. Gerenciar camadas inteligentes. |
- |
7 |
|
chn_columns |
String |
Colunas que contêm texto em chinês, habilitando a tokenização chinesa para seus índices. Separe vários nomes com vírgulas. Use __line__ para índice de texto completo. Nota: A tokenização chinesa afeta o desempenho. Use com cautela. |
- |
'__line__,message,error' |
Modificar uma coluna
Modificações de coluna com suporte:
Adicionar uma coluna:
ALTER TABLE users ADD COLUMN change_time TEXT;
Renomear uma coluna:
ALTER TABLE users RENAME COLUMN change_time TO update_time;
Modificar o tipo de uma coluna:
ALTER TABLE users ALTER COLUMN update_time TYPE TIMESTAMP;
Excluir uma coluna:
ALTER TABLE users DROP COLUMN update_time;
Limpar dados
Limpe todos os dados de uma tabela com TRUNCATE:
TRUNCATE TABLE users;
Nota : Após a exclusão dos dados, a alteração leva cerca de 30 segundos para se tornar visível nas consultas SQL.
Excluir uma tabela
Exclua uma tabela e seu logstore correspondente com DROP TABLE:
DROP TABLE users;
Consultar dados
Consulta básica
Consulte dados com SELECT:
SELECT id, name FROM users LIMIT 10;
Nota : Caso nenhum intervalo de tempo seja especificado na instrução SQL, o intervalo padrão definido pordefault_query_rangeserá utilizado. Sedefault_query_rangenão foi definido durante a criação da tabela, a consulta usará como padrão os últimos 15 minutos de dados.
Especificar um intervalo de tempo de consulta
Existem duas formas de especificar o intervalo de tempo da consulta:
Método 1: Usar o campo __time__
-- Specify the lower limit of the time range
SELECT id, name FROM users
WHERE __time__ > 1766646000
LIMIT 10;
-- Specify the time range
SELECT id, name FROM users
WHERE __time__ > 1766646000 AND __time__ < 1766646987
LIMIT 10;
Nota : O valor de __time__ é um timestamp Unix em segundos. É obrigatório definir um limite inferior para que o intervalo tenha efeito. Se nenhum limite superior for definido, o horário final assumirá o horário atual como padrão.
Método 2: Usar as variáveis query_begin e query_end
-- Set the lower limit of the time range
SET query_begin = 1766646000;
SELECT id, name FROM users LIMIT 10;
-- Set the time range
SET query_begin = 1766646000;
SET query_end = 1766646987;
SELECT id, name FROM users LIMIT 10;
-- Set the variables in a single statement (recommended)
SET query_begin = 1766646000; SET query_end = 1766646987; SELECT id, name FROM users LIMIT 10;
Nota : Uma vez definidas, as variáveis query_begin e query_end permanecem válidas durante toda a sessão de conexão. Execute show query_begin ou show query_end para visualizar seus valores atuais. Um valor igual a 0 indica que a variável não foi definida.
Gravar dados
Gravação básica
Grave dados com INSERT INTO:
INSERT INTO users (id, name, create_time)
VALUES
(1, 'Name#1', '2025-12-25T06:54:19'),
(2, 'Name#2', '2025-12-25T06:54:20'),
(3, 'Name#3', '2025-12-25T06:54:21');
Gravações EXACTLY-ONCE
O SLS não suporta restrições de unicidade de chave primária, mas fornece semântica EXACTLY-ONCE para evitar gravações duplicadas.
Defina hash_key e seq_id para ativar gravações EXACTLY-ONCE:
SET hash_key = 'file#1';
SET seq_id = 1;
INSERT INTO users (id, name, create_time)
VALUES
(1, 'Name#1', '2025-12-25T06:54:19'),
(2, 'Name#2', '2025-12-25T06:54:20'),
(3, 'Name#3', '2025-12-25T06:54:21');
Parâmetros
|
Parâmetro |
Descrição |
|
hash_key |
Chave única que identifica a origem dos dados. |
|
seq_id |
Número de série. Deve começar em 1 e aumentar monotonicamente para o mesmo hash_key. |
Tratamento de erro de dados duplicados:
Em caso de gravações duplicadas, o servidor retorna um erro:
error: sequence id is lower than expected, hash_key=xyz,current sequence_id=100,requested sequence_id=90
Extraia o seq_id atual com esta expressão regular:
current\s+sequence_id=(\d+)
Consultar metadados
Consultar todos os logstores
SELECT
table_schema,
table_name
FROM
information_schema.tables;
Nota : Por padrão, um logstore é mapeado para um esquema dentro de um projeto com o mesmo nome.
Consultar a estrutura de campos
SELECT
column_name,
data_type
FROM
information_schema.columns
WHERE
table_name = 'access_log';