Skip to main content
Glama
system-log.entity.ts6 kB
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, ManyToOne, JoinColumn, Index, } from 'typeorm'; import { MCPServerEntity } from './mcp-server.entity'; import { User } from './user.entity'; export enum SystemLogEventType { // MCP服务器生命周期事件 SERVER_STARTED = 'server_started', SERVER_STOPPED = 'server_stopped', SERVER_RESTARTED = 'server_restarted', SERVER_CRASHED = 'server_crashed', SERVER_TIMEOUT = 'server_timeout', // MCP服务器配置事件 SERVER_CREATED = 'server_created', SERVER_UPDATED = 'server_updated', SERVER_DELETED = 'server_deleted', SERVER_CONFIG_CHANGED = 'server_config_changed', // MCP连接事件 CONNECTION_ESTABLISHED = 'connection_established', CONNECTION_LOST = 'connection_lost', CONNECTION_RETRY = 'connection_retry', CONNECTION_FAILED = 'connection_failed', // 健康检查事件 HEALTH_CHECK_PASSED = 'health_check_passed', HEALTH_CHECK_FAILED = 'health_check_failed', // 系统事件 SYSTEM_STARTUP = 'system_startup', SYSTEM_SHUTDOWN = 'system_shutdown', SYSTEM_ERROR = 'system_error', } export enum SystemLogLevel { DEBUG = 'debug', INFO = 'info', WARNING = 'warning', ERROR = 'error', CRITICAL = 'critical', } export enum SystemLogStatus { SUCCESS = 'success', FAILED = 'failed', IN_PROGRESS = 'in_progress', CANCELLED = 'cancelled', } @Entity('system_logs') @Index(['serverId']) @Index(['eventType']) @Index(['level']) @Index(['status']) @Index(['createdAt']) @Index(['userId']) export class SystemLogEntity { @PrimaryGeneratedColumn('uuid') id: string; @Column({ type: 'enum', enum: SystemLogEventType, }) eventType: SystemLogEventType; @Column({ type: 'varchar', length: 500, nullable: true }) message?: string; @Column({ type: 'text', nullable: true }) description?: string; @Column({ type: 'enum', enum: SystemLogLevel, default: SystemLogLevel.INFO, }) level: SystemLogLevel; @Column({ type: 'enum', enum: SystemLogStatus, default: SystemLogStatus.SUCCESS, }) status: SystemLogStatus; @Column({ type: 'uuid', nullable: true }) serverId?: string; @ManyToOne(() => MCPServerEntity, { onDelete: 'CASCADE' }) @JoinColumn({ name: 'serverId' }) server?: MCPServerEntity; @Column({ type: 'varchar', length: 255, nullable: true }) serverName?: string; @Column({ type: 'varchar', length: 100, nullable: true }) serverVersion?: string; @Column({ type: 'int', nullable: true }) serverPort?: number; @Column({ type: 'uuid', nullable: true }) userId?: string; @ManyToOne(() => User, { onDelete: 'SET NULL' }) @JoinColumn({ name: 'userId' }) user?: User; @Column({ type: 'varchar', length: 255, nullable: true }) source?: string; // 事件来源,如 'process_manager', 'health_checker', 'user_action' @Column({ type: 'jsonb', nullable: true }) context?: { // 进程信息 processId?: number; processStatus?: string; // 连接信息 connectionId?: string; endpoint?: string; transport?: string; // 性能指标 metrics?: { cpuUsage?: number; memoryUsage?: number; responseTime?: number; requestCount?: number; errorCount?: number; }; // 错误信息 error?: { code?: string; message?: string; stack?: string; }; // 配置变更 configChanges?: { before?: any; after?: any; fields?: string[]; }; // 额外的上下文信息 [key: string]: any; }; @Column({ type: 'jsonb', nullable: true }) metadata?: { duration?: number; // 事件持续时间(毫秒) retryCount?: number; // 重试次数 severity?: number; // 严重程度 (1-10) tags?: string[]; // 标签 correlationId?: string; // 关联ID,用于追踪相关事件 sessionId?: string; // 会话ID requestId?: string; // 请求ID [key: string]: any; }; @CreateDateColumn() createdAt: Date; // 虚拟属性:获取操作者信息 get actor(): string { if (this.user) { return this.user.username; } return this.source || 'System'; } // 虚拟属性:获取事件摘要 get summary(): string { const actor = this.actor; const serverInfo = this.serverName ? ` [${this.serverName}]` : ''; const message = this.message || this.eventType; return `${actor}${serverInfo}: ${message}`; } // 虚拟属性:检查是否为错误事件 get isError(): boolean { return this.level === SystemLogLevel.ERROR || this.level === SystemLogLevel.CRITICAL || this.status === SystemLogStatus.FAILED; } // 虚拟属性:检查是否为服务器生命周期事件 get isLifecycleEvent(): boolean { const lifecycleEvents = [ SystemLogEventType.SERVER_STARTED, SystemLogEventType.SERVER_STOPPED, SystemLogEventType.SERVER_RESTARTED, SystemLogEventType.SERVER_CRASHED, ]; return lifecycleEvents.includes(this.eventType); } // 虚拟属性:检查是否为连接事件 get isConnectionEvent(): boolean { const connectionEvents = [ SystemLogEventType.CONNECTION_ESTABLISHED, SystemLogEventType.CONNECTION_LOST, SystemLogEventType.CONNECTION_RETRY, SystemLogEventType.CONNECTION_FAILED, ]; return connectionEvents.includes(this.eventType); } // 虚拟属性:获取严重程度 get severityLevel(): number { if (this.metadata?.severity) { return this.metadata.severity; } // 根据level和status自动计算严重程度 switch (this.level) { case SystemLogLevel.CRITICAL: return 10; case SystemLogLevel.ERROR: return this.status === SystemLogStatus.FAILED ? 8 : 7; case SystemLogLevel.WARNING: return 5; case SystemLogLevel.INFO: return 3; case SystemLogLevel.DEBUG: return 1; default: return 3; } } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zaizaizhao/mcp-swagger-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server