SLS prend en charge le protocole PostgreSQL. Utilisez psql, JDBC ou tout autre outil compatible avec PostgreSQL pour lire, écrire et gérer les données de journalisation à l'aide du langage SQL.
Fonctionnalités
Le protocole PostgreSQL vous permet d'effectuer les opérations suivantes :
Gérer les Logstores à l'aide de la syntaxe SQL standard (création, modification, suppression).
Analyser les données de journalisation en utilisant la syntaxe SQL de PostgreSQL.
Écrire des données de journalisation à l'aide d'instructions INSERT.
Interroger les métadonnées du schéma du Logstore à l'aide de la syntaxe native de PostgreSQL, entièrement compatible avec les tables système de PostgreSQL.
Limites
Les limites suivantes s'appliquent :
|
Limitations |
Description |
|
Prepared Statement |
Les instructions préparées (parse/bind/execute) ne sont pas prises en charge. Pour JDBC, définissez le mode de requête sur simple :
Ou définissez le paramètre preferQueryMode dans l'URL JDBC :
|
|
Prise en charge des transactions |
Les instructions begin, commit et rollback sont ignorées et n'ont aucun effet. |
|
Clés primaires et valeurs par défaut |
Les contraintes telles que les clés primaires et les valeurs par défaut ne sont pas prises en charge. |
Prérequis
Vous avez créé un projet.
Vous disposez d'une paire AccessKey (AccessKey ID et AccessKey secret). Créer une AccessKey.
Un client compatible avec PostgreSQL (tel que psql) est installé.
Se connecter à SLS
Format de l'URL de connexion du client 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
Exemple de connexion 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!");
}
}
Paramètres
|
Paramètre |
Description |
Exemple |
|
AccessKey_ID |
L'AccessKey ID de votre compte Alibaba Cloud ou utilisateur RAM. |
LTAI5t*** |
|
AccessKey_Secret |
L'AccessKey secret de votre compte Alibaba Cloud ou utilisateur RAM. |
*** |
|
Endpoint |
L'endpoint SLS. Doit inclure le nom du projet comme indiqué dans la colonne Exemple. Endpoints. |
{projectName}.cn-hangzhou.log.aliyuncs.com |
|
Project_Name |
Le nom du projet de journalisation. |
my-project |
Gérer les tables
Une table correspond à un Logstore SLS.
Créer une table
Créez un Logstore avec 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
);
Types de colonnes pris en charge :
|
Type PostgreSQL |
Type SLS |
Description |
|
int8/bigint/int4/integer/int2/smallint/oid |
long |
Type entier |
|
text/varchar/char/bpchar/uuid |
text |
Type chaîne |
|
float4/real/float8/double precision/numeric |
double |
Type nombre à virgule flottante |
|
json |
json |
Type JSON |
Propriétés de la table (clause WITH) :
|
Nom de la propriété |
Type |
Description |
Valeur par défaut |
Exemple |
|
shard_count |
Entier |
Le nombre de shards dans le Logstore. |
4 |
4 |
|
ttl |
Entier |
La période de rétention des données en jours. |
365 |
14 |
|
default_query_range |
Chaîne |
La plage de temps de requête par défaut. Format : {n}{d/m/s} (jour/minute/seconde). |
'1d' |
'3d' |
|
full_text_search_enabled |
Booléen |
Indique si l'indexation en texte intégral est activée. |
false |
true |
|
index_tokens |
Chaîne |
Les jetons utilisés pour la tokenisation. |
Délimiteurs par défaut |
'&[]",''' |
|
log_time_field |
Chaîne |
Le champ utilisé comme horodatage du journal lors des écritures. Doit être de type timestamp ou long (secondes, millisecondes, microsecondes ou nanosecondes epoch). L'unité est détectée automatiquement. |
- |
'create_time' |
|
insert_any_allowed |
Booléen |
Indique si les écritures sans validation de schéma sont autorisées. Définissez cette valeur sur false pour appliquer les vérifications de schéma. |
true |
false |
|
hot_ttl |
Entier |
Nombre de jours pendant lesquels les données sont conservées dans le stockage chaud avant de passer au stockage IA. Si ce paramètre n'est pas défini, les données restent dans le stockage chaud pendant toute la durée du TTL. Gérer le classement intelligent. |
- |
7 |
|
chn_columns |
Chaîne |
Colonnes contenant du texte chinois, permettant la tokenisation chinoise pour leurs index. Séparez plusieurs noms par des virgules. Utilisez __line__ pour l'index en texte intégral. Remarque : la tokenisation chinoise affecte les performances. À utiliser avec précaution. |
- |
'__line__,message,error' |
Modifier une colonne
Modifications de colonnes prises en charge :
Ajouter une colonne :
ALTER TABLE users ADD COLUMN change_time TEXT;
Renommer une colonne :
ALTER TABLE users RENAME COLUMN change_time TO update_time;
Modifier le type d'une colonne :
ALTER TABLE users ALTER COLUMN update_time TYPE TIMESTAMP;
Supprimer une colonne :
ALTER TABLE users DROP COLUMN update_time;
Effacer les données
Effacez toutes les données d'une table avec TRUNCATE :
TRUNCATE TABLE users;
Remarque : Après la suppression des données, il faut environ 30 secondes pour que la modification soit visible dans les requêtes SQL.
Supprimer une table
Supprimez une table et son Logstore correspondant avec DROP TABLE :
DROP TABLE users;
Interroger les données
Requête de base
Interrogez les données avec SELECT :
SELECT id, name FROM users LIMIT 10;
Remarque : Si aucune plage de temps n'est spécifiée dans l'instruction SQL, la plage de temps par défaut définie pardefault_query_rangeest utilisée. Sidefault_query_rangen'a pas été défini lors de la création de la table, la requête porte par défaut sur les 15 dernières minutes de données.
Spécifier une plage de temps de requête
Deux méthodes permettent de spécifier une plage de temps de requête :
Méthode 1 : Utiliser le champ __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;
Remarque : La valeur de __time__ est un horodatage Unix en secondes. Vous devez définir une limite inférieure pour que la plage de temps prenne effet. Si aucune limite supérieure n'est définie, l'heure de fin correspond par défaut à l'heure actuelle.
Méthode 2 : Utiliser les variables query_begin et 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;
Remarque : Une fois définies, les variables query_begin et query_end restent valides pour toute la session de connexion. Exécutez show query_begin ou show query_end pour afficher leurs valeurs actuelles. Une valeur de 0 signifie que la variable n'a pas été définie.
Écrire des données
Écriture de base
Écrivez des données avec 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');
Écritures EXACTLY-ONCE
SLS ne prend pas en charge les contraintes d'unicité de clé primaire, mais fournit une sémantique EXACTLY-ONCE pour éviter les écritures en double.
Définissez hash_key et seq_id pour activer les écritures 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');
Paramètres
|
Paramètre |
Description |
|
hash_key |
Une clé unique qui identifie la source de données. |
|
seq_id |
Le numéro de série. Il doit commencer à 1 et augmenter de manière monotone pour le même hash_key. |
Gestion des erreurs de données en double :
En cas d'écritures en double, le serveur renvoie une erreur :
error: sequence id is lower than expected, hash_key=xyz,current sequence_id=100,requested sequence_id=90
Extrayez le seq_id actuel avec cette expression régulière :
current\s+sequence_id=(\d+)
Interroger les métadonnées
Interroger tous les Logstores
SELECT
table_schema,
table_name
FROM
information_schema.tables;
Remarque : Par défaut, un Logstore est mappé à un schéma portant le même nom que le projet.
Interroger la structure des champs
SELECT
column_name,
data_type
FROM
information_schema.columns
WHERE
table_name = 'access_log';