sequelae-mcp
Version:
Let Claude, Cursor, and other AI agents run real SQL queries on live Postgres databases. No more copy-pasting SQL, stale schema docs, or hallucinated DB adapters — just raw, real-time access. Now with MCP support!
117 lines • 3.7 kB
JavaScript
;
/**
* Simple logger utility for structured logging
* Provides JSON and text output formats
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.logger = exports.Logger = exports.LogLevel = void 0;
var LogLevel;
(function (LogLevel) {
LogLevel["DEBUG"] = "debug";
LogLevel["INFO"] = "info";
LogLevel["WARN"] = "warn";
LogLevel["ERROR"] = "error";
})(LogLevel || (exports.LogLevel = LogLevel = {}));
class Logger {
constructor() {
this.jsonMode = false;
this.minLevel = LogLevel.INFO;
// Check environment for log settings
this.jsonMode = process.env.LOG_FORMAT === 'json';
const envLevel = process.env.LOG_LEVEL?.toLowerCase();
if (envLevel && Object.values(LogLevel).includes(envLevel)) {
this.minLevel = envLevel;
}
}
static getInstance() {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
setJsonMode(enabled) {
this.jsonMode = enabled;
}
setMinLevel(level) {
this.minLevel = level;
}
shouldLog(level) {
const levels = [LogLevel.DEBUG, LogLevel.INFO, LogLevel.WARN, LogLevel.ERROR];
const currentIndex = levels.indexOf(this.minLevel);
const messageIndex = levels.indexOf(level);
return messageIndex >= currentIndex;
}
formatEntry(level, message, data) {
return {
timestamp: new Date().toISOString(),
level,
message,
...(data && { data }),
};
}
output(entry) {
if (this.jsonMode) {
console.log(JSON.stringify(entry));
}
else {
const prefix = `[${entry.timestamp}] [${entry.level.toUpperCase()}]`;
const message = `${prefix} ${entry.message}`;
if (entry.data) {
console.log(message, entry.data);
}
else {
console.log(message);
}
}
}
debug(message, data) {
if (this.shouldLog(LogLevel.DEBUG)) {
this.output(this.formatEntry(LogLevel.DEBUG, message, data));
}
}
info(message, data) {
if (this.shouldLog(LogLevel.INFO)) {
this.output(this.formatEntry(LogLevel.INFO, message, data));
}
}
warn(message, data) {
if (this.shouldLog(LogLevel.WARN)) {
this.output(this.formatEntry(LogLevel.WARN, message, data));
}
}
error(message, data) {
if (this.shouldLog(LogLevel.ERROR)) {
// Always output errors to stderr
const entry = this.formatEntry(LogLevel.ERROR, message, data);
if (this.jsonMode) {
console.error(JSON.stringify(entry));
}
else {
const prefix = `[${entry.timestamp}] [${entry.level.toUpperCase()}]`;
const errorMessage = `${prefix} ${entry.message}`;
if (entry.data) {
console.error(errorMessage, entry.data);
}
else {
console.error(errorMessage);
}
}
}
}
// Special method for CLI output that should always be shown
cliOutput(message) {
console.log(message);
}
// Special method for CLI errors that should always be shown
cliError(message) {
console.error(message);
}
// Special method for table output
cliTable(data) {
console.table(data);
}
}
exports.Logger = Logger;
// Export singleton instance
exports.logger = Logger.getInstance();
//# sourceMappingURL=logger.js.map