Module de journalisation
Description des fonctionnalités
Le préfixe de l'API est uniformément http(s)://<your-domain>
HTTPS doit être utilisé dans les environnements de production pour sécuriser les jetons d'authentification. HTTP n'est recommandé que pour les environnements de développement.
Un système de requête de journaux en couches qui permet aux administrateurs d'afficher les journaux à l'échelle du site et aux utilisateurs d'afficher les journaux personnels. Il fournit des statistiques en temps réel (RPM/TPM), un filtrage multidimensionnel, un nettoyage des données historiques et d'autres fonctionnalités. Une interface de requête de jeton compatible CORS facilite l'intégration tierce.
🔐 Aucune authentification requise
Journaux de requête par jeton
- Nom de l'interface: journaux de requête par jeton
- Méthode HTTP: GET
- Chemin:
/api/log/token - Exigence d'authentification: publique
- Description de la fonction: interrogez les enregistrements de journaux pertinents à l'aide de la clé Token, prenant en charge l'accès multi-origine
💡 Exemple de demande:
const response = await fetch('/api/log/token?key=`<TOKEN_PLACEHOLDER>`', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
const data = await response.json();✅ Exemple de réponse réussie:
{
"success": true,
"message": "",
"data": [
{
"id": 1,
"type": 2,
"content": "APICall successful",
"model_name": "gpt-4",
"quota": 1000,
"created_at": 1640995000
}
]
}❗ Exemple de réponse échouée:
{
"success": false,
"message": "TokenDoes not exist or has no permission"
}🧾 Description du champ:
key (String): clé de jeton, obligatoire
🔐 Authentification de l'utilisateur
Mes statistiques de journal
- Nom de l'interface: Mes statistiques de journal
- Méthode HTTP: GET
- Chemin:
/api/log/self/stat - Exigence d'authentification: Utilisateur
- Description de la fonction: Récupérez les statistiques du journal de l'utilisateur actuel, y compris la consommation du quota, la fréquence des demandes et l'utilisation du jeton.
💡 Exemple de demande:
const response = await fetch('/api/log/self/stat?type=2&start_timestamp=1640908800&end_timestamp=1640995200&token_name=api_token&model_name=gpt-4&group=default', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_user_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Exemple de réponse réussie:
{
"success": true,
"message": "",
"data": {
"quota": 50000,
"rpm": 10,
"tpm": 1500
}
}❗ Exemple de réponse échouée:
{
"success": false,
"message": "Failed to obtain statistics"
}🧾 Description du champ:
type(Numéro) : Type de journal, valeurs optionnelles : 1=Recharge, 2=Consommation, 3=Gestion, 4=Erreur, 5=Systèmestart_timestamp(Numéro): Horodatage de débutend_timestamp(Numéro): Horodatage de fintoken_name(String): filtre de nom de jetonmodel_name(String): filtre de nom de modèlegroup(String) : Filtre de groupequota(Nombre): Consommation totale du quota dans la plage de temps spécifiéerpm(Nombre) : Requêtes par minute (60 dernières secondes)tpm(Nombre) : jetons par minute (60 dernières secondes)
Récupérer mes journaux
- Nom de l'interface: Obtenir mes journaux
- Méthode HTTP: GET
- Chemin:
/api/log/self - Exigence d'authentification: Utilisateur
- Description de la fonction: récupération paginée des enregistrements de journal de l'utilisateur actuel, prenant en charge plusieurs conditions de filtrage
💡 Exemple de demande:
const response = await fetch('/api/log/self?p=1&page_size=20&type=2&start_timestamp=1640908800&end_timestamp=1640995200&token_name=api_token&model_name=gpt-4&group=default', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_user_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Exemple de réponse réussie:
{
"success": true,
"message": "",
"data": {
"items": [
{
"id": 1,
"user_id": 1,
"created_at": 1640995000,
"type": 2,
"content": "APICall successful",
"token_name": "api_token",
"model_name": "gpt-4",
"quota": 1000,
"prompt_tokens": 50,
"completion_tokens": 100
}
],
"total": 25,
"page": 1,
"page_size": 20
}
}❗ Exemple de réponse échouée:
{
"success": false,
"message": "Failed to get log"
}🧾 Description du champ:
Les paramètres de requête sont les mêmes que ceux de l'interface Obtenir tous les journaux, mais seuls les enregistrements de journal de l'utilisateur actuel sont renvoyés.
Rechercher mes journaux
- Nom de l'interface: Rechercher dans mes journaux
- Méthode HTTP: GET
- Chemin:
/api/log/self/search - Exigence d'authentification: Utilisateur
- Description de la fonction: recherchez les enregistrements de journal de l'utilisateur actuel en fonction de mots-clés
💡 Exemple de demande:
const response = await fetch('/api/log/self/search?keyword=gpt-4', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_user_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Exemple de réponse réussie:
{
"success": true,
"message": "",
"data": [
{
"id": 1,
"type": 2,
"content": "GPT-4Call successful",
"model_name": "gpt-4",
"created_at": 1640995000
}
]
}❗ Exemple de réponse échouée:
{
"success": false,
"message": "Search log failed"
}🧾 Description du champ:
keyword (String): mot-clé de recherche, correspond au type de journal de l'utilisateur actuel
🔐 Authentification administrateur
Récupérer tous les journaux
- Nom de l'interface: obtenir tous les journaux
- Méthode HTTP: GET
- Chemin:
/api/log/ - Exigence d'authentification: Administrateur
- Description de la fonction: récupération paginée de tous les enregistrements de journaux dans le système, prenant en charge plusieurs conditions de filtrage et le filtrage des types de journaux
💡 Exemple de demande:
const response = await fetch('/api/log/?p=1&page_size=20&type=2&start_timestamp=1640908800&end_timestamp=1640995200&username=testuser&token_name=api_token&model_name=gpt-4&channel=1&group=default', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_admin_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Exemple de réponse réussie:
{
"success": true,
"message": "",
"data": {
"items": [
{
"id": 1,
"user_id": 1,
"created_at": 1640995000,
"type": 2,
"content": "APICall successful",
"username": "testuser",
"token_name": "api_token",
"model_name": "gpt-4",
"quota": 1000,
"prompt_tokens": 50,
"completion_tokens": 100,
"use_time": 2,
"is_stream": false,
"channel_id": 1,
"channel_name": "OpenAIchannel",
"token_id": 1,
"group": "default",
"ip": "192.168.1.1",
"other": "{\"model_ratio\":15.0}"
}
],
"total": 100,
"page": 1,
"page_size": 20
}
}❗ Exemple de réponse échouée:
{
"success": false,
"message": "Failed to get log"
}🧾 Description du champ:
p(Numéro): Numéro de page, la valeur par défaut est 1page_size(Nombre): éléments par page, la valeur par défaut est 20type(Numéro): Type de journal, valeurs facultatives: 1=Recharge, 2=Consommation, 3=Gestion, 4=Erreur, 5=Log système.go:41-48start_timestamp(Numéro): Horodatage de débutend_timestamp(Numéro): Horodatage de finusername(String): Filtre de nom d'utilisateurtoken_name(String): filtre de nom de jetonmodel_name(String): filtre de nom de modèlechannel(Numéro): filtre d'identification de chaînegroup(String) : Filtre de groupe
Supprimer les journaux historiques
- Nom de l'interface: Supprimer les journaux historiques
- Méthode HTTP: SUPPRIMER
- Chemin:
/api/log/ - Exigence d'authentification: Administrateur
- Description de la fonction: suppression par lots des enregistrements du journal historique plus anciens que l'horodatage spécifié, prenant en charge la suppression par étapes pour éviter une charge excessive de la base de données
💡 Exemple de demande:
const response = await fetch('/api/log/?target_timestamp=1640908800', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_admin_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Exemple de réponse réussie:
{
"success": true,
"message": "",
"data": 1500
}❗ Exemple de réponse échouée:
{
"success": false,
"message": "target timestamp is required"
}🧾 Description du champ:
target_timestamp(Nombre): horodatage cible, supprime tous les journaux avant cette heure, obligatoiredata(Nombre): Nombre de journaux supprimés avec succès
Statistiques du journal
- Nom de l'interface: Statistiques du journal
- Méthode HTTP: GET
- Chemin:
/api/log/stat - Exigence d'authentification: Administrateur
- Description de la fonction: Récupérez les statistiques du journal pour la plage de temps et les conditions spécifiées, y compris la consommation de quota, la fréquence des demandes et l'utilisation du jeton.
💡 Exemple de demande:
const response = await fetch('/api/log/stat?type=2&start_timestamp=1640908800&end_timestamp=1640995200&username=testuser&token_name=api_token&model_name=gpt-4&channel=1&group=default', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_admin_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Exemple de réponse réussie:
{
"success": true,
"message": "",
"data": {
"quota": 150000,
"rpm": 25,
"tpm": 3500
}
}❗ Exemple de réponse échouée:
{
"success": false,
"message": "Failed to obtain statistics"
}🧾 Description du champ:
- Les paramètres de requête sont les mêmes que ceux de l'interface Get All Logs
quota(Nombre): Consommation totale du quota dans la plage de temps spécifiéerpm(Nombre): Requêtes par minute (60 dernières secondes) log.go:357tpm(Nombre) : jetons par minute (somme des prompt_tokens + Completion_tokens au cours des 60 dernières secondes)
Rechercher tous les journaux
- Nom de l'interface: rechercher tous les journaux
- Méthode HTTP: GET
- Chemin:
/api/log/search - Exigence d'authentification: Administrateur
- Description de la fonction: Recherchez tous les enregistrements de journaux dans le système en fonction de mots-clés
💡 Exemple de demande:
const response = await fetch('/api/log/search?keyword=error', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_admin_token',
'New-Api-User': 'your_user_id'
}
});
const data = await response.json();✅ Exemple de réponse réussie:
{
"success": true,
"message": "",
"data": [
{
"id": 1,
"type": 4,
"content": "APICall error",
"username": "testuser",
"created_at": 1640995000
}
]
}❗ Exemple de réponse échouée:
{
"success": false,
"message": "Search log failed"
}🧾 Description du champ:
keyword (Chaîne): mot-clé de recherche, peut correspondre au type ou au contenu du journal