OpenTelemetry Support
Using OpenTelemetry SDKs
Send Winston Logs to KloudMate Using OTel (Node.js)
2min
in this guide, we will see how your existing apps that are already using winston for logging can send those logs to kloudmate with minimal changes let's consider a simple express app that logs some data using winston this app writes logs to the console index ts import express from 'express' import { createlogger, transports } from 'winston' const logger = createlogger({ transports \[new transports console()], }) const app = express() const port = 5000 app get('/', (req any, res any) => { logger info({ msg 'received request', query req query }) res send('hello world') }) app listen(port, () => { logger info(`server is running at http //localhost ${port}`) }) in order to send these logs to kloudmate you will need to install a few helper packages npm i @opentelemetry/exporter logs otlp http \\ @opentelemetry/sdk logs \\ @opentelemetry/resources \\ @opentelemetry/semantic conventions next, create a file customlogger ts that will be overriding the winston logger import { createlogger, transports } from 'winston' import { otlplogexporter } from '@opentelemetry/exporter logs otlp http' import { loggerprovider, batchlogrecordprocessor, } from '@opentelemetry/sdk logs' import { resource } from '@opentelemetry/resources' import { semanticresourceattributes } from '@opentelemetry/semantic conventions' import { severitynumber } from '@opentelemetry/api logs' const resource = resource default() merge( new resource({ \[semanticresourceattributes service name] 'my app', \[semanticresourceattributes service version] '0 1 0', }) ) const loggerprovider = new loggerprovider({ resource resource, }) const logexporter = new otlplogexporter({ url `https //otel kloudmate com 4318/v1/logs`, headers { authorization 'km private key', }, }) const logprocessor = new batchlogrecordprocessor(logexporter) loggerprovider addlogrecordprocessor(logprocessor) const formatlog = (args any) => typeof args === 'string' ? args json stringify(args) // your winston implementation const consoletransport = new transports console() const logger = createlogger({ transports \[consoletransport], }) export const customlogger = { logger, info (args any) => { loggerprovider getlogger('otel logger') emit({ body formatlog(args), severitynumber severitynumber info }) return logger info(args) }, error (args any) => { loggerprovider getlogger('otel logger') emit({ body formatlog(args), severitynumber severitynumber error }) return logger error(args) }, } here we are overriding the info and error methods so that they also emit logs to kloudmate you will have to replace km private key with your kloudmate workspaces's private key with this in place, we can replace the winston logger in index ts with the new modified logger import { customlogger as logger } from ' /customlogger' // same code as before after starting the app, you should be able to see winston logs in your kloudmate account's logs page